我正在使用 FoxPro OLE-DB 驱动程序将 FoxPro 数据库中的一些数据导入 Sql Server 数据库。我采用的方法是遍历 FoxPro 表,将所有记录选择到 DataTable 中,然后使用 SqlBulkCopy 将该表插入 Sql Server。除了出现以下错误的少数情况外,这可以正常工作:
System.InvalidOperationException: The provider could not determine the Decimal value. For example, the row was just created, the default for the Decimal column was not available, and the consumer had not yet set a new Decimal value.
我对此进行了调查并记录了它与哪些行一起出现,问题是 FoxPro 表具有固定的数值宽度。1 存储为 1.00 但是 10 存储为 10.0 并且它是导致问题的小数点后的一位数。现在找到了我正在努力解决的问题。以下函数是我用来将 OLEDBReader 转换为 DataTable 的函数:
private DataTable FPReaderToDataTable(OleDbDataReader dr, string TableName)
{
DataTable dt = new DataTable();
//get datareader schema
DataTable SchemaTable = dr.GetSchemaTable();
List<DataColumn> cols = new List<DataColumn>();
if (SchemaTable != null)
{
foreach (DataRow drow in SchemaTable.Rows)
{
string columnName = drow["ColumnName"].ToString();
DataColumn col = new DataColumn(columnName, (Type)(drow["DataType"]));
col.Unique = (bool)drow["IsUnique"];
col.AllowDBNull = (bool)drow["AllowDBNull"];
col.AutoIncrement = (bool)drow["IsAutoIncrement"];
cols.Add(col);
dt.Columns.Add(col);
}
}
//populate data
int RowCount = 1;
while (dr.Read())
{
DataRow row = dt.NewRow();
for (int i = 0; i < cols.Count; i++)
{
try
{
row[((DataColumn)cols[i])] = dr[i];
}
catch (Exception ex) {
if (i > 0)
{
LogImportError(TableName, cols[i].ColumnName, RowCount, ex.ToString(), dr[0].ToString());
}
else
{
LogImportError(TableName, cols[i].ColumnName, RowCount, ex.ToString(), "");
}
}
}
RowCount++;
dt.Rows.Add(row);
}
return dt;
}
我想做的是检查具有 1 个小数位问题的值,但在这些情况下我根本无法从数据读取器中读取。我原以为我可以在有问题的行上使用 dr.GetString(i) ,但是这会返回以下错误:
The provider could not determine the String value. For example, the row was just created, the default for the String column was not available, and the consumer had not yet set a new String value.
我无法更新 FoxPro 数据,因为该列不允许这样做,如何从 DataReader 读取记录并修复它?我已经尝试了 cast / dr.GetValue / dr.GetData 的所有组合,并且都给出了相同错误的变化。
FoxPro 表的结构如下:
Number of data records: 1664
Date of last update: 11/15/10
Code Page: 1252
Field Field Name Type Width Dec Index Collate Nulls Next Step
1 AV_KEY Numeric 6 Asc Machine No
2 AV_TEAM Numeric 6 No
3 AV_DATE Date 8 No
4 AV_CYCLE Numeric 2 No
5 AV_DAY Numeric 1 No
6 AV_START Character 8 No
7 AV_END Character 8 No
8 AV_SERVICE Numeric 6 No
9 AV_SYS Character 1 No
10 AV_LENGTH Numeric 4 2 No
11 AV_CWEEKS Numeric 2 No
12 AV_CSTART Date 8 No
** Total ** 61
导致问题的是 av_length 列