【发布时间】:2017-04-04 08:36:37
【问题描述】:
我对 C# 完全陌生,所以我确信我会得到很多关于我的代码是如何格式化的 cmets - 我欢迎他们。请随时提出您在此过程中可能提出的任何建议或建设性批评。
我正在构建一个非常简单的 Windows 窗体应用程序,它最终应该从不同大小的 Excel 文件中获取数据,可能每天多次,并将其插入到 SQL Server 2005 中的表中。此后,存储过程数据库内部根据插入到该表中的值接管执行各种更新和插入任务。
出于这个原因,我决定使用 SQL Bulk Insert 方法,因为我不知道用户在任何给定的执行过程中是否只会插入 10 行或 10,000 行。
我正在使用的函数如下所示:
public void BulkImportFromExcel(string excelFilePath)
{
excelApp = new Excel.Application();
excelBook = excelApp.Workbooks.Open(excelFilePath);
excelSheet = excelBook.Worksheets.get_Item(sheetName);
excelRange = excelSheet.UsedRange;
excelBook.Close(0);
try
{
using (SqlConnection sqlConn = new SqlConnection())
{
sqlConn.ConnectionString =
"Data Source=" + serverName + ";" +
"Initial Catalog=" + dbName + ";" +
"User id=" + dbUserName + ";" +
"Password=" + dbPassword + ";";
using (OleDbConnection excelConn = new OleDbConnection())
{
excelQuery = "SELECT InvLakNo FROM [" + sheetName + "$]";
excelConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath + ";Extended Properties='Excel 8.0;HDR=Yes'";
excelConn.Open();
using (OleDbCommand oleDBCmd = new OleDbCommand(excelQuery, excelConn))
{
OleDbDataReader dataReader = oleDBCmd.ExecuteReader();
using (SqlBulkCopy bulkImport = new SqlBulkCopy(sqlConn.ConnectionString))
{
bulkImport.DestinationTableName = sqlTable;
SqlBulkCopyColumnMapping InvLakNo = new SqlBulkCopyColumnMapping("InvLakNo", "InvLakNo");
bulkImport.ColumnMappings.Add(InvLakNo);
sqlQuery = "IF OBJECT_ID('ImportFromExcel') IS NOT NULL BEGIN SELECT * INTO [" + DateTime.Now.ToString().Replace(" ", "_") + "_ImportFromExcel] FROM ImportFromExcel; DROP TABLE ImportFromExcel; END CREATE TABLE ImportFromExcel (InvLakNo INT);";
using (SqlCommand sqlCmd = new SqlCommand(sqlQuery, sqlConn))
{
sqlConn.Open();
sqlCmd.ExecuteNonQuery();
while (dataReader.Read())
{
bulkImport.WriteToServer(dataReader);
}
}
}
}
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
excelApp.Quit();
}
}
函数运行时没有错误或警告,如果我用手动 SQL 命令替换 WriteToServer,则插入行;但bulkImport 没有插入任何东西。
注意:本例中只有一个字段,而在我当前运行测试的实际函数中;但最终会有几十个字段被插入,我将为所有字段做一个ColumnMapping。
另外,如上所述,我知道我的代码可能很糟糕 - 请随时给我任何您认为有帮助的建议。我已经准备好并愿意学习。
谢谢!
【问题讨论】:
-
与您的问题无关,但您应该关闭与
OleDbConnection和SqlConnection的连接。 -
谢谢。我会注意添加的!
标签: c# sqlbulkcopy oledbdatareader