C# 如何优化excel文件中3600行sql表的insert
我有一个Excel文件,最初大约有600行,我能够将Excel文件转换为数据表,所有内容都正确地插入到sql表中 Excel文件现在有3600行,并且存在一些类型的问题,这些问题不会引发错误,但在大约5分钟后,所有行仍不会插入sql表 现在,当将Excel文件转换为内存中的数据表时,这种情况发生得非常快,但是当循环数据表并插入sql表时,我丢失了数据,速度非常慢,但是我没有收到任何错误 首先,在每次插入时,我必须与数据库建立一个新的连接并插入记录,我已经知道这是非常错误的,我希望从sql专业人士那里得到一些关于这一点的指导 在不进行3600个新连接的情况下,处理具有3600条记录/行的内存中数据表的正确方法是什么 --这是处理excel文件的代码,执行速度非常快。-C# 如何优化excel文件中3600行sql表的insert,c#,sql-server,excel,C#,Sql Server,Excel,我有一个Excel文件,最初大约有600行,我能够将Excel文件转换为数据表,所有内容都正确地插入到sql表中 Excel文件现在有3600行,并且存在一些类型的问题,这些问题不会引发错误,但在大约5分钟后,所有行仍不会插入sql表 现在,当将Excel文件转换为内存中的数据表时,这种情况发生得非常快,但是当循环数据表并插入sql表时,我丢失了数据,速度非常慢,但是我没有收到任何错误 首先,在每次插入时,我必须与数据库建立一个新的连接并插入记录,我已经知道这是非常错误的,我希望从sql专业人士
public static async Task<DataTable> ProcessExcelToDataTableAsync(string pathAndNewFileName, string hasHeader/*Yes or No*/)
{
return await Task.Run(() =>
{
string conStr = "", SheetName = "";
switch (Path.GetExtension(pathAndNewFileName))
{
case ".xls": //Excel 97-03
conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
break;
case ".xlsx":
conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
break;
}
conStr = String.Format(conStr, pathAndNewFileName, hasHeader);
OleDbConnection connExcel = new OleDbConnection(conStr);
OleDbCommand cmdExcel = new OleDbCommand();
OleDbDataAdapter oda = new OleDbDataAdapter();
DataTable dt = new DataTable();
cmdExcel.Connection = connExcel;
//Get the name of First Sheet
connExcel.Open();
DataTable dtExcelSchema;
dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
connExcel.Close();
//Read Data from First Sheet
connExcel.Open();
cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
oda.SelectCommand = cmdExcel;
oda.Fill(dt);
connExcel.Close();
cmdExcel.Dispose();
oda.Dispose();
if (File.Exists(pathAndNewFileName))
{
File.Delete(pathAndNewFileName);
}
return dt;
});
}
ProcessDataTablePartsResult processedResult = await ProcessDataTablePartsAsync(genericCatalogID, excelDataTable);
为什么不使用SSIS从SQLServerManagementStudio导入数据,甚至导入任务?3600的数据量可以忽略不计,上面的代码是可行的还是需要修改?我从不使用SSI,因此必须仔细阅读。或者,您可以将Excel另存为CSV,并使用bcp实用程序将数据导入DB。SQL批量复制也是一个选项。除了学习体验之外,在此处使用Wait/async还有什么特殊原因吗?你有没有想过这可能是你的问题?在没有它的情况下重新实施这一切怎么样?
ProcessDataTablePartsResult processedResult = await ProcessDataTablePartsAsync(genericCatalogID, excelDataTable);