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



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

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

但后来有一个用户在我的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条记录。

编辑示例执行2:我的excel有2160行,如果我上传它,它会从本地和服务器中插入2160行。如果我删除了10万行并上传,现在它会像预期的那样从本地和服务器插入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()返回的名称是指工作表还是表名称?

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

如何使用GetOleDbSchemaTable和Visual Basic.NET 检索模式信息

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

流程
1.在命令提示符下键入regedit.exe,然后搜索typeguessrow(按F3打开搜索)
2.将注册表导出为备份

Windows注册表编辑器5.00版

[HHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel]
"DisabledExtensions"="!xls"
"ImportMixedTypes"="Text"
"FirstRowHasNames"=十六进制:01
"AppendBlankRows"=d字:0000000 1
"TypeGuessRows"=dword:000000008
"win32"="C:\PROGRA~1\COMON~1\MICROS~1\OFFICE12\ACEEXCL.DLL"

  1. "TypeGuessRows"=dword:000000008更改为
  2. 导入注册表

相关内容

  • 没有找到相关文章

最新更新