SqlBulkCopy WriteToServer抛出异常记录被删除

本文关键字:删除 记录 抛出异常 WriteToServer SqlBulkCopy | 更新日期: 2023-09-27 17:49:36

我正在执行DBF + DBT文件到SQL的转换。我使用Microsoft.Jet.OLEDB.4.0连接器来访问文件,使用SqlConnector来写入MS SQL中的数据,为了提高性能,我使用SqlBulkCopy方法。大多数文件都转换得很好,但在一些方法SqlBulkCopy。WriteToServer抛出异常:

记录被删除。没有在任何记录中找到搜索键。

复制操作没有完成,我在SQL中丢失了很多记录。

是否有办法绕过这个问题,或者我应该放弃SqlBulkCopy和复制一行又一行?

编辑:所以我决定打包数据库,但是到目前为止还没有运气。当我使用vfpoledb进行读取时,由于转换小数的一些问题,它崩溃得更快。所以我想先使用PACK(与vfpoledb),然后使用JetOleDb阅读器。尽管执行了PACK,并且我可以看到dbf和dbt文件发生了变化,但是reader.GetValues()仍然抛出相同的异常。

       try
        {
            string file = @"f:'Elims'dsm'CPAGEMET.DBF";
            string tableName = Path.GetFileNameWithoutExtension(file);
            var dbfConnectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='dBASE III;DELETED=YES;HDR=NO;IMEX=1'", Path.GetDirectoryName(file));
            var packConnString = string.Format(@"Provider=vfpoledb;Data Source={0};Collating Sequence=machine;", file);
            OleDbConnection packConnector = new OleDbConnection(packConnString);
            packConnector.Open();
            OleDbCommand command = new OleDbCommand(string.Format("PACK {0}",tableName), packConnector);
            var result = command.ExecuteNonQuery();
            packConnector.Close();

            OleDbConnection oleConnector = new OleDbConnection(dbfConnectionString);
            oleConnector.Open();
            string cmd = string.Format("SELECT * FROM [{0}]", tableName);
            var oleDbCommand = new OleDbCommand(cmd, oleConnector);
            OleDbDataReader dataReader = oleDbCommand.ExecuteReader();
            object[] values = new object[dataReader.FieldCount];
            int iRow = 0;
            while (dataReader.Read())
            {
                iRow++;
                Console.WriteLine("Row " + iRow);
                dataReader.GetValues(values);
            }
            oleConnector.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message + e.StackTrace);
        }

谢谢

SqlBulkCopy WriteToServer抛出异常记录被删除

看起来有些记录被标记为已删除。如果您需要这些记录,请恢复它们,如果您不需要这些记录,请永久删除它们(使用PACK命令)。

所以经过一番挖掘,我得出了最终的解决方案,所以我只是总结我的发现。"记录已删除"异常非常具有误导性,因为问题实际上从来不是一个已删除的记录。有3个空行,这实际上触发了异常。一旦这些被删除,一切都开始工作,我甚至不需要打包数据库。这适用于我使用Microsoft.Jet.OLEDB连接器的场景。

我尝试使用vfpoledb连接器,但我遇到了十进制数字的其他问题。受msdn讨论的启发,我编写了一个修复程序,不仅一切都开始工作(因此删除和空行被成功跳过),而且导入现在比使用Jet连接器(再次使用BulkCopy)快15倍