ahmed_sa Ответов: 1

Datagridview показывает только последнюю запись хотя у меня есть больше строк при сравнении currentreading excel и таблицы счетов


Проблема

Datagridview показывает только последнюю запись, хотя у меня есть больше строк, когда currentreading excel меньше, чем currentreading invoice table .

неверный результат в другое заявление btn_import щелкните внутри цикла for счетчик
Мне нужно изменить код в else, чтобы принять список, а не показывать только одну запись .

Подробности

У меня есть excelsheet следующим образом :

unitcode CurrentReading
12 2000
14 4500

и у меня есть таблица счет-фактура в базе данных в sql server 2012 имеет следующие поля

серийный код единицы измерения CurrentReading год месяц
1 12 1000 2018 3
3 14 5000 2018 3

так что как отобразить код блока 14 в datagridview .

На самом деле мне нужно, чтобы currentreading для кода единицы измерения в листе excel был меньше, чем currentreading в таблице invoice отображал значения в datagridview . формула выглядит следующим образом

btn импорт этот импорт из excel

btn_import click
{
for (int i = 0; i < dt.Rows.Count; i++)                               
{
  System.Data.DataTable dt = new System.Data.DataTable();
  dt = Showdataprint();
decimal LastMeterReading = ConvertToDecimal(GetLastReading(dt.Rows[i]["UnitCode"].ToString()));
 if (!string.IsNullOrEmpty(dt.Rows[i]["CurrentMeterReading"].ToString()) && ConvertToDecimal(dt.Rows[i]["CurrentMeterReading"]) > 0 && ConvertToDecimal(dt.Rows[i]["CurrentMeterReading"]) > ConvertToDecimal(LastMeterReading))
  {
//insert to table invoice
  }
else
{
System.Data.DataTable dtErrorRows = new DataTable();
 DataView  dv2 = new DataView(dt);
 dv2.RowFilter = "(CurrentMeterReading < " + LastMeterReading + ")" + "and" + "(UnitCode = " + Utilities.ObjectConverter.ConvertToInteger(dt.Rows[i]["UnitCode"]) + ")";
 dv2.RowStateFilter = DataViewRowState.CurrentRows;
 int a = dv2.Count;
 if (dv2.Count > 0)
   {
dtErrorRows = dv2.ToTable();
   }                                       
}
}
Grid.DataSource = dtErrorRows;
}
 function get data from excel
public System.Data.DataTable Showdataprint()
        {
            string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", txtpath.Text);

            OleDbConnection con = new OleDbConnection(connectionString);


            con.Open();

            string str = @"SELECT    [UnitCode],[CurrentMeterReading] FROM  [Sheet5$] ";
            OleDbCommand com = new OleDbCommand();
            com = new OleDbCommand(str, con);
            OleDbDataAdapter oledbda = new OleDbDataAdapter();
        oledbda = new OleDbDataAdapter(com);
        DataSet ds = new DataSet();
        ds = new DataSet();
        oledbda.Fill(ds, "[Sheet5$]");
        con.Close();
        System.Data.DataTable dt = new System.Data.DataTable();
        dt = ds.Tables["[Sheet5$]"];
        return dt;


    }

for selecting currentreading from Invoice Table :

private decimal GetLastReading(string UnitCode)
        {
            string sqlquery = "";
            sqlquery = @"select isnull((select top 1 CurrentMeterReading from WAHInvoice where UnitCode=" + UnitCode + " order by year , Serial desc),0)";

            object nullableValue = DataAccess.ExecuteScalar(sqlquery);
            decimal myValue;
            if (nullableValue == null || nullableValue == DBNull.Value)
            {
                myValue = 0;
            }
            else
            {

                decimal.TryParse(nullableValue.ToString(), out myValue);
            }

            return Utilities.ObjectConverter.ConvertToDecimal(DataAccess.ExecuteScalar(sqlquery));
    }

Ожидаемый результат в datagridview

unitcode CurrentReading

14 4500

Что я уже пробовал:

Datagridview show only last record although I have more rows when compare currentreading excel and invoice table

1 Ответов

Рейтинг:
0

Wendelius

По крайней мере, мало что можно заметить

При циклическом переборе строк из Excel вы устанавливаете новую таблицу данных и новый dataview на каждой итерации, когда сумма меньше, чем найденная в базе данных. Это приводит к ситуации, когда остается только последняя строка.

Вы должны использовать одну таблицу данных и в цикле просто вставить нужные строки в эту таблицу. После цикла используйте таблицу данных для привязки и т. д

Другое дело, что при запросе базы данных вы объединяете значения непосредственно в инструкцию SQL. Это оставляет вас открытыми для SQL-инъекций и создает возможные проблемы преобразования. Для получения дополнительной информации см. SQL-инъекция - Википедия[^]

Правильным способом было бы использовать Класс Объектов Sqlparameter (Системы.Данных.Поставщики sqlclient)[^]