FoxProデータベースからFoxPro OLE DBドライバを使用してSQL Serverデータベースに一部のデータをインポートしています。私が取っているアプローチは、FoxProテーブルをループし、すべてのレコードをDataTableに選択し、SqlBulkCopyを使用してそのテーブルをSql Serverに挿入する方法です。私はそれがで表示され、問題がFoxProテーブルが数値のために一定の幅を持っていることである行にこれを調査し、ログインしたFoxPro OLEDBドライバを使用してデータをインポート中にエラーが発生しました
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.
:これは私が次のエラーを取得する少数の例を除いて正常に動作します。 1は1.00として格納されますが、10は10.0として格納され、問題を引き起こしている小数点の後の1桁です。私はそれを解決するために苦労している問題を今見つけた。次の関数は、私がデータテーブルにOLEDBReaderを変換するために使用していますものです:
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位の問題を持っている値をチェックしているが、私はでDataReaderオブジェクトから読み取ることができませんこれらのすべての場合に。 、
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データを更新することができません:私は、次のようなエラーが返されますが、この後、私は問題の行にdr.GetString(i)を使用していることができると思っているだろうDataReaderからレコードを読み取って修正するにはどうすればよいですか?キャスト/ 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
それは私があなたがVisual FoxProを取得へのアクセス権を持っている場合は知らないが、それが持っている問題
FoxProがインストールされていて、データを表示できます。問題は固定幅の数値フィールドで表示されます。 Foxproでは、フィールドは幅が4であると定義されているので、0〜9の数字は小数点以下2桁(0.00、1.00など)で表示されます。 9以上の数字は1で表示されます。 10.0,11.0であり、問題を引き起こしているのはこれらのフィールドです。私はそれを修正するためにdatareaderから値を取得することはできません。この全体のインポートプロセスは、FPデータベース – Macros
@Macrosを変更することなく、.netプログラム内で発生することが重要です。 VFPでテーブルを使用し、LIST STRUCTURE TO Sample.TXTを実行して、ここでその構造をコピー/ペーストし、問題のあるカラム定義を表示できますか?あなたが遭遇している出力に対して、4の幅が非常に奇妙に聞こえます。 – DRapp
私は質問を更新しました。問題を引き起こしているのはav_lengthの列です。 – Macros