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

时间:2013-07-23 05:48:48

标签: c# excel sqlbulkcopy oledbconnection

我的应用程序截断数据库表并用excel中的行填充它。

使用excel文件(2000行),下面的上传代码完全在我的本地电脑(我的开发环境)中将所有行插入数据库,并且它也在服务器中完成,所以我认为我成功地完成了任务,< / p>

但是后来一个用户向我的excel添加了10个新行并试图上传2010行,但是除了新添加的10行之外插入了2000行,所以使用带有2010行的excel文件,如果我从服务器数据库表上传它填充了2000行,如果我使用我的工作环境上传它,则最终表是2010行。

服务器和本地应用程序完全相同。 我也尝试了格式化等

编辑示例执行:文件MyRecords.xlsx位于我的桌面,现在我使用

连接到我的应用程序
http://myserver/myapplication

并上传MyRecords.xlsx,然后检查数据库中的计数,它显示2361条记录,然后打开visual studio并运行我的应用程序(http://localhost:58029/)并上传MyRecords.xlsx并再次检查数据库,它显示2362条记录。< / p>

编辑示例执行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();
    }

2 个答案:

答案 0 :(得分:1)

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

检查dbSchema.Rows[0]["TABLE_NAME"].ToString()返回的名称是否指的是表格或表格名称?

编辑:还要确保用户正确保存并上传了文件。将Excel文件与数据库进行比较以确保它们匹配。

How To Retrieve Schema Information by Using GetOleDbSchemaTable and Visual Basic .NET

答案 1 :(得分:1)

这是因为excel的“typeguessrow”功能。 更改注册表将typeguessrow从8设置为0.

<强>过程
1.在命令提示符下键入 regedit.exe 并搜索 typeguessrow (按F3打开搜索)。
2.导出注册表作为备份

Windows注册表编辑器版本5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 12.0 \ Access Connectivity Engine \ Engines \ Excel]
“DisabledExtensions”= “!XLS”
“ImportMixedTypes”= “文本”
“FirstRowHasNames”=十六进制: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. 导入注册表