6

VFPOLEDBドライバーを使用してDBFファイルを読み取っていますが、このエラーが発生し続けますが、問題を解決する理由と方法がわかりません。

プロバイダーは10進値を判別できませんでした。たとえば、行が作成されたばかりで、Decimal列のデフォルトは使用できず、コンシューマーはまだ新しいDecimal値を設定していませんでした。

これがコードです。このルーチンを呼び出して、DBFファイルのDataSetを返し、DataGridViewにデータを表示します。

public DataSet GetDBFData(FileInfo fi, string tbl)
{
    using (OleDbConnection conn = new OleDbConnection(
    @"Provider=VFPOLEDB.1;Data Source=" + fi.DirectoryName + ";"))
    {
        conn.Open();
        string command = "SELECT * FROM " + tbl;
        OleDbDataAdapter da = new OleDbDataAdapter(command, conn);
        DataSet ds = new DataSet();
        da.Fill(ds);
        return ds;
    }
}
4

4 に答える 4

7

私はここで解決策を見つけました: VFPOLEDBドライバーで特定の数値を読み取るときにエラーが発生しました

SELECT CAST(FieldName As NUMERIC(11, 3)) From TableName
于 2010-05-27T20:37:06.293 に答える
0

グリッドビューから行を追加する場合、必ずしもデフォルト値を使用する必要はなく、NULLを使用するため、デフォルトを事前設定するか、スキーマをNOTAllowNullsに設定する必要がある場合があります。

クエリの実行後に列を自動化し、次のような列のデータ型に基づいてデフォルトを強制することができます。

foreach (DataColumn oDC in YourDataSet.Tables[0].Columns)
{
   if (oDC.DataType.ToString().Contains("String"))
    oDC.DefaultValue = "";
   else if (oDC.DataType.ToString().Contains("Int32"))
    oDC.DefaultValue = 0;
   else if (oDC.DataType.ToString().Contains("DateTime"))
    oDC.DefaultValue = DateTime.MinValue;
}

これらは3つのデフォルトタイプにすぎませんが、ブール値、10進数、floatなど、if / elseに追加して、「デフォルト」値を入力するだけのタイプもあります。これは、新しい行を追加するときに「NULL」値が挿入される場合に役立つ場合があります。

于 2010-02-17T14:16:18.237 に答える
0

私は最終的に、テーブルスキーマを取得し、selectステートメントのvarcharにすべての非文字フィールドをキャストすることで問題を解決しました。テーブルの内容をプレビューするのに十分です。

于 2010-03-14T08:02:50.290 に答える
0

これは既知の問題です。特に、すべての列を選択する必要がある場合は、はるかに快適です。

Select * from some_table

実用的な解決策の1つは、Microsoft.Jet.OLEDB.4.0などの別のプロバイダーを使用することです。接続文字列の例はここにあります:http://docs.30c.org/conn/dbf-foxpro.html

于 2015-01-29T20:30:39.083 に答える