Получите данные из SQL вместе с read Excel в C # - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть программа, которая может импортировать файл Excel в привязку данных с помощью datagridview.В настоящее время мне нужно добавить еще одно имя столбца InvtID и получить данные InvtID с сервера sql на основе столбца штрих-кода (столбец «3» в качестве заголовка), который я импортировал.

Как я могу добиться этого, так как сейчас мой код способен получать данные ПОСЛЕ импорта Excel, поэтому данные столбца InvtID не совпадают со столбцом штрих-кода.Это единственная проблема, с которой я сталкиваюсь, чтобы закончить эту задачу, пожалуйста, помогите мне.Спасибо

Вот как выглядит моя таблица данных photo

public void filldatagridview(ExcelWorksheet workSheet)
       {
           DataTable dt = new DataTable();

           //Create the data column
           for (int col = workSheet.Dimension.Start.Column; col <= workSheet.Dimension.End.Column; col++)
           {
               dt.Columns.Add(col.ToString());
           }

          for (int row = 12; row <= 26; row++)
           {
               DataRow newRow = dt.NewRow(); //Create a row
               int i = 0;
               for (int col = workSheet.Dimension.Start.Column; col <= workSheet.Dimension.End.Column; col++)
               {
                   newRow[i++] = workSheet.Cells[row, col].Text;
               }
               dt.Rows.Add(newRow);
           }

           dt.Columns.RemoveAt(0); //remove No
           dt.Columns.RemoveAt(0); //remove article

      //Get BookCode
      using (SqlConnection conn = new SqlConnection("Server"))
      using (SqlCommand cmd = new SqlCommand(null, conn))
     {
    StringBuilder sb = new StringBuilder("WITH cte AS(SELECT case WHEN InvtID IS NULL OR InvtID='' THEN 'No Bookcode Found' ELSE InvtID END AS InvtID,Barcode,ROW_NUMBER() OVER(PARTITION BY Barcode ORDER BY InvtID Asc) rid FROM InventoryCustomer) SELECT InvtID AS BOOKCODE FROM cte WHERE rid=1 and Barcode In (");
             for (int i = 0; i < dt.Rows.Count; i++)
              {
                 if (i != 0) sb.Append(",");
                  string name = "@P" + i;
                  cmd.Parameters.AddWithValue(name, dt.Rows[i]["3"]); //"3" is barcode column
                  sb.Append(name);
              }
              sb.Append(")");
              cmd.CommandText = sb.ToString();
              SqlDataAdapter da = new SqlDataAdapter(cmd);
              da.Fill(dt);

              dt.Columns["BOOKCODE"].SetOrdinal(0);
              dataGridView2.DataSource = dt;
           }
      }

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Я не уверен, что это работает.

Избегайте добавления новой строки, когда строка уже существует.

Сначала добавьте столбец из вашего dt DataTable

Просто возьмитеПосмотрите на этот код:

 public void filldatagridview(ExcelWorksheet workSheet)
        {
            DataTable dt = new DataTable();
            DataTable dtInvtID = new DataTable();
            dt.Columns.Add("dtInvtID"); //ADDING NEW COLUMN FIRST FOR YOUR dtInvtID
            //Create the data column
            for (int col = workSheet.Dimension.Start.Column; col <= workSheet.Dimension.End.Column; col++)
            {
                dt.Columns.Add(col.ToString());
            }

            for (int row = 12; row <= 26; row++)
            {
                DataRow newRow = dt.NewRow(); //Create a row
                int i = 0;
                for (int col = workSheet.Dimension.Start.Column; col <= workSheet.Dimension.End.Column; col++)
                {
                    newRow[i++] = workSheet.Cells[row, col].Text;
                }
                dt.Rows.Add(newRow);
            }

            dt.Columns.RemoveAt(0); //remove No
            dt.Columns.RemoveAt(0); //remove article

            //Get BookCode
            using (SqlConnection conn = new SqlConnection("Server"))
            using (SqlCommand cmd = new SqlCommand(null, conn))
            {
                StringBuilder sb = new StringBuilder("WITH cte AS(SELECT case WHEN InvtID IS NULL OR InvtID='' THEN 'No Bookcode Found' ELSE InvtID END AS InvtID,Barcode,ROW_NUMBER() OVER(PARTITION BY Barcode ORDER BY InvtID Asc) rid FROM InventoryCustomer) SELECT InvtID AS BOOKCODE FROM cte WHERE rid=1 and Barcode In (");
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (i != 0) sb.Append(",");
                    string name = "@P" + i;
                    cmd.Parameters.AddWithValue(name, dt.Rows[i]["3"]); //"3" is barcode column
                    sb.Append(name);
                }
                sb.Append(")");
                cmd.CommandText = sb.ToString();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dtInvtID);

                dt.Columns["BOOKCODE"].SetOrdinal(0);

            }


            int dtctr = 0;
            int ctr = 0;
            foreach (DataRow dr in dt.Rows)//inserting the value of your InvtID to dt.Rows
            {
                dtctr += 1;
                ctr = 1;
                foreach (DataRow InvtID in dtInvtID.Rows) //Getting the value of dtInvtID from database
                {
                    if (ctr == dtctr)//Condition when the row position is equal (dt.Rows==dtInvtID.Rows) IF THIS NOT RETURN A REAL POSITION THEN YOU CAN RUN IT IN DEBUG MODE T CHECK
                    {
                        dr["dtInvtID"] = InvtID[0];
                        ctr += 1;
                        break;
                    }
                    ctr += 1;
                }
            }

            dataGridView2.DataSource = dt;
        }

Напоминания:

Этот код еще не проверен.Любой неверный результат вы можете проверить и запустить в режиме отладки.

Я видел некоторые интересные проблемы:

for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (i != 0) sb.Append(",");
                    string name = "@P" + i;
                    cmd.Parameters.AddWithValue(name, dt.Rows[i]["3"]); //"3" is barcode column
                    sb.Append(name);
                }
                sb.Append(")");

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

0 голосов
/ 07 февраля 2019

вы сначала вставляете новые строки в таблицу данных с этим кодом.

 dt.Rows.Add(newRow);

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

da.Fill(dt);

, которые вставляют строки в конец вместо обновления существующих строк в таблице данных.Чтобы выровнять данные в таблице данных, вам необходимо сначала заполнить другую таблицу данных адаптером, а затем написать код, используя цикл for и сопоставляя данные, чтобы обновить существующую или исходную таблицу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...