我正在执行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:ElimsdsmCPAGEMET.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);
}
谢谢
看起来有些记录被标记为已删除。如果您需要这些记录,请恢复它们,如果您不需要这些记录,请永久删除它们(使用PACK命令)。
所以经过一番挖掘,我得出了最终的解决方案,所以我只是总结我的发现。"记录已删除"异常非常具有误导性,因为问题实际上从来不是一个已删除的记录。有3个空行,这实际上触发了异常。一旦这些被删除,一切都开始工作,我甚至不需要打包数据库。这适用于我使用Microsoft.Jet.OLEDB连接器的场景。
我尝试使用vfpoledb连接器,但我遇到了十进制数字的其他问题。受msdn讨论的启发,我编写了一个修复程序,不仅一切都开始工作(因此删除和空行被成功跳过),而且导入现在比使用Jet连接器(再次使用BulkCopy)快15倍