C# 如何优化excel文件中3600行sql表的insert

C# 如何优化excel文件中3600行sql表的insert,c#,sql-server,excel,C#,Sql Server,Excel,我有一个Excel文件,最初大约有600行,我能够将Excel文件转换为数据表,所有内容都正确地插入到sql表中 Excel文件现在有3600行,并且存在一些类型的问题,这些问题不会引发错误,但在大约5分钟后,所有行仍不会插入sql表 现在,当将Excel文件转换为内存中的数据表时,这种情况发生得非常快,但是当循环数据表并插入sql表时,我丢失了数据,速度非常慢,但是我没有收到任何错误 首先,在每次插入时,我必须与数据库建立一个新的连接并插入记录,我已经知道这是非常错误的,我希望从sql专业人士

我有一个Excel文件,最初大约有600行,我能够将Excel文件转换为数据表,所有内容都正确地插入到sql表中

Excel文件现在有3600行,并且存在一些类型的问题,这些问题不会引发错误,但在大约5分钟后,所有行仍不会插入sql表

现在,当将Excel文件转换为内存中的数据表时,这种情况发生得非常快,但是当循环数据表并插入sql表时,我丢失了数据,速度非常慢,但是我没有收到任何错误

首先,在每次插入时,我必须与数据库建立一个新的连接并插入记录,我已经知道这是非常错误的,我希望从sql专业人士那里得到一些关于这一点的指导

在不进行3600个新连接的情况下,处理具有3600条记录/行的内存中数据表的正确方法是什么

--这是处理excel文件的代码,执行速度非常快。-

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);