【发布时间】:2014-03-12 10:52:25
【问题描述】:
我正在将 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 对象的批量大小属性。
标签: c# sql sql-server dbf