Member 14127871 Ответов: 1

Получайте данные из SQL вместе с чтением excel на языке C#


Привет, у меня есть программа, которая может импортировать файл excel в datatable binding с помощью datagridview. В настоящее время мне нужно добавить еще одно имя столбца InvtID и получить эти данные InvtID из sql на основе столбца штрих-кода, который я импортировал.

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

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

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(") ORDER BY Barcode Asc");
              cmd.CommandText = sb.ToString();
              SqlDataAdapter da = new SqlDataAdapter(cmd);
              da.Fill(dt);

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

1 Ответов

Рейтинг:
2

Maciej Los

Я сделаю это вот так:
1) создать набор данных[^] (ds)
//Превосходить
2) создать Метод oledbconnection[^] в файл Excel
3) создать Объект oledbcommand[^] чтобы захватить данные из Excel
4) загрузите данные в объект DataTable[^] (dt1) объект через И oledbdatareader[^]
5) добавить dt1 возражать ds
//SQL Server
6) создать Объект sqlconnection[^] в базу данных SQL
7) создать Команда sqlcommand[^] для захвата данных с SQL server
8) загрузите данные в DataTable (dt2) объект через Класс sqldatareader[^]
9) добавить dt2 к ds
//заключительная работа
10) соедините данные через Linq:

	string sFileName = @"D:\yourExcelFile.xlsx";
	string sConStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=YES';", sFileName);

        string sSqlConn = "enter connection details to SQL server";
	//create dt1 and dt2 to be able to use them later
	DataTable dt1 = new DataTable();
	DataTable dt2 = new DataTable();
	
	//1.
	DataSet ds = new DataSet();
	//2.
	using (OleDbConnection connection = new OleDbConnection(sConStr))
	{
		string sql = @"SELECT * FROM [Sheet1$];";
		connection.Open();
		//3.
		using(OleDbCommand command = new OleDbCommand(sql, connection))
		{
		    //4.
                    using (OleDbDataReader reader = command.ExecuteReader())
		    {
		        dt1.Load(reader);
		    }
		}
		//5.
		ds.Tables.Add(dt1);
		//clean up
		command.Dispose();
	}

	//6.

	using (SqlConnection connection = new SqlConnection(sSqlConn))
	{
		string sql = @"SELECT * FROM YourTable";
		connection.Open();
		//7.
		using(SqlCommand command = new SqlCommand(sql, connection))
		{
		    //8.
		    using(SqlDbDataReader reader = command.ExecuteReader())
		    {
		        dt2.Load(reader);
		    }
		}
		//9.
		ds.Tables.Add(dt2);
		//clean up
		command.Dispose();
	}

//10.
var commonData = (from r1 ds.Tables("dt1").AsEnumerable()
    join r2 ds.Tables("dt1").AsEnumerable() on r1.Field<string>("Barcode") equals r1.Field<string>("Barcode"))
    .Select(x=>new
    {
        A = r1.Field<Type>("Name1"),
        B = r1.Field<Type>("Name2"),
        C = r1.Field<Type>("Name3"),
        //second datatable data 
        D = r2.Field<Type>("Name1")
    })
    .ToList();

//open Excel file and dump data into it!
foreach(var row in commonData)
{
    //your logic here...
   
}


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

Удачи вам!


Member 14127871

Спасибо за то, что вы дали мне один за другим шаги. Однако, это возможно для меня, чтобы придерживаться с помощью epplus библиотека вместо того, чтобы использовать oledbconnection и продолжить предложение шаги?

Maciej Los

Почему? Что плохого в моем предложении? Есть ли какая-то особая причина использовать EPPlus?
[РЕДАКТИРОВАТЬ]
Вы можете использовать библиотеку EPPlus для обновления данных в Excel внутри foreach петля.