Excel SqlBulkCopy在本地PC和应用程序服务器上的工作方式不同。

我的应用程序截断一个数据库表,并用Excel中的行填充它。

使用一个excel文件(2000行),下面的上传代码完全插入到我的本地pc(我的开发环境)中的所有行到数据库,它也在服务器上,所以我认为我成功地完成了任务,

但是,然后用户添加了10个新行到我的Excel,并试图上传2010行,但除了新增加的10行2000行被插入,所以使用该Excel文件与2010行,如果我从服务器数据库表上载2000行,如果我上传它使用我的工作环境决赛桌是2010行。

服务器和本地应用程序是完全一样的。 我也尝试格式化等

编辑示例执行:文件MyRecords.xlsx位于我的桌面,现在我连接到我的应用程序使用

http://myserver/myapplication 

并上传MyRecords.xlsx,然后检查数据库中的计数,它说2361logging,然后打开Visual Studio并运行我的应用程序( http://localhost:58029/ )并上传MyRecords.xlsx并再次检查数据库它说2362logging。

编辑示例执行2:我的excel有2160行,如果我上传,它会从本地和服务器中插入2160行。 如果我删除了1000行并上传,现在它按预期从本地和从服务器插入1160行。 现在,如果我重新添加这1000行并上传Excel,现在如果我使用本地环境进行此过程,它可以很好地插入2160行,如果服务器,插入1160行。 所以在excel上的任何修改都不在服务器端看到,所以你确定这是原因吗? –

  private void UploadData(string path, string dbTableName) { //Create connection string to Excel work book string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;Persist Security Info=False"; //Create Connection to Excel work book OleDbConnection excelConnection = new OleDbConnection(excelConnectionString); //Create OleDbCommand to fetch data from Excel excelConnection.Open(); DataTable dbSchema = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); //Get First Sheet Name OleDbCommand cmd = new OleDbCommand("Select * from [" + dbSchema.Rows[0]["TABLE_NAME"].ToString() + "]", excelConnection); OleDbDataReader dReader; dReader = cmd.ExecuteReader(); SqlBulkCopy sqlBulk = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["MyDbConn"].ConnectionString); //Give your Destination table name sqlBulk.DestinationTableName = dbTableName; try { sqlBulk.WriteToServer(dReader); if(dbTableName == "TempTP") { SDatabaseManagerData.DatabaseManagerData.UpdateTP(); } lbl_Error.Visible = true; lbl_Error.Text = "Database updated!"; } catch (SqlException ex) { lbl_Error.Visible = true; lbl_Error.Text = "Database updated edilemedi! Hata: " + ex.Message; } excelConnection.Close(); } 

我怀疑由GetOleDbSchemaTable返回的表没有包含所有的数据。 用户是否在表格下方添加了行而不是在表格中?

检查由dbSchema.Rows[0]["TABLE_NAME"].ToString()返回的名称dbSchema.Rows[0]["TABLE_NAME"].ToString()是指表单还是表名?

编辑:也请确保用户保存并正确上传文件。 比较Excel文件和数据库以确保它们匹配。

如何使用GetOleDbSchemaTable和Visual Basic .NET检索架构信息

发生这种情况是因为excel的“typeguessrow”function。 更改registry将typeguessrow从8设置为0。

处理
1.在命令提示符下键入regedit.exe并searchtypeguessrow (按F3打开search)。
2.导出registry作为备份

Windowsregistry编辑器版本5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 12.0 \ Access Connectivity Engine \ Engines \ Excel]
“DisabledExtensions”= “!XLS”
“ImportMixedTypes”= “文本”
“FirstRowHasNames”=hex:01
“AppendBlankRows”= DWORD:00000001
“TypeGuessRows”= DWORD:00000008
“Win32的”= “C:\ PROGRA〜1 \ COMMON〜1 \ MICROS〜1 \ OFFICE12 \ ACEEXCL.DLL”

  1. “TypeGuessRows”= dword:00000008改为“TypeGuessRows”= dword:00000000
  2. importregistry