4

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

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

但是随后一个用户在我的 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 行。如果我删除 100 万行并上传它,现在它会按预期从本地和服务器插入 1160 行。现在,如果我重新添加这 1000 行并上传 excel,现在如果我使用本地环境执行此过程,它可以正常工作,插入 2160 行,如果服务器,插入 1160 行。所以在服务器端看不到对excel的任何修改,所以你确定这是原因吗?——</p>

    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();
    }
4

2 回答 2

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"="Text"
"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. 进口登记处
于 2013-07-31T05:58:35.793 回答
1

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

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

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

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

于 2013-07-25T12:00:07.543 回答