1

C# から .dbf ファイルを更新するには、どのデータ プロバイダーを使用できますか?

DataSource を作成するためにいくつかの異なる .dbf プロバイダーを試してみましたが、次のようなメッセージが表示されます。

または、更新関数を使用してデータセットとデータアダプターを生成したときに、「変更された行を含む DataRow コレクションを渡すと、更新には有効な UpdateCommand が必要です」というメッセージが表示されました。

多くの更新でC#から.dbfを操作する方法を誰かが知っている場合は、助けてください。行を 1 つずつ更新しようとすると、プロバイダーが大きな .dbf ファイルを検索するのに時間がかかりすぎるため、遅すぎます。インデックスを自動的に構築する方法があり、データソースがそれを使用することを知っているのではないでしょうか?

別の方法は、すべてをデータセットのようなものにロードし、すべての変更が完了した後に更新することですが、更新部分は今のところ機能していません。

助けてください!

4

4 に答える 4

1

~1GB データベースに関するあなたのコメントから、私も VFP データベース (.dbf) ファイル形式で作業します。SQL 更新は、OleDbCommand の作成/実行を介して問題なく動作し、VFP OleDbProvider が実行するどのネイティブ コマンドでも動作します。

一部の文字を削除しようとする場合、私は通常、関数 CHRTRAN() を使用します (つまり、Visual Foxpro Ole DB Provider を使用する場合)。ここでは、文字通り多くの文字 (無効な文字など) を削除できます...

Update YourTable
   set SomeField = chrtran( SomeField, "!@#$%^*(", "" )

すべてのレコードを調べて、フィールド (最初のパラメーター)、個々の文字のインスタンス (2 番目のパラメーター) からいずれかを削除し、3 番目のパラメーターで見つかった対応する文字に変更します... この場合、値はありません。空の文字列なので、文字は取り除かれます。それ自体は非常に高速で、ダウンロード、テスト、およびプッシュバックされるすべてのレコードをスキャンし続ける必要はありません。

繰り返しますが、どのネイティブ .DBF ファイル システムを使用しているかは明確ではありませんが、VFP はそのような操作で非常に高速です。

于 2010-07-12T11:49:27.560 に答える
1

LINQ to VFPを使用して、DBF ファイルの読み取りと書き込みを行うことができます。私はいくつかのdBase IIIファイルを編集するためにそれを使用しています.魅力のように機能します.

次のように、DBF 定義に一致するようにテーブルを定義します。

public partial class MyTable 
{
    public System.Int32 ID { get; set; }
    public System.Decimal Field1 { get; set; }
    public System.String Field2 { get; set; }
    public System.String Field3 { get; set; }
}

次のようにコンテキストを定義します。

public partial class Context : DbEntityContextBase 
{
    public Context(string connectionString)
        : this(connectionString, typeof(ContextAttributes).FullName) 
    {
    }

    public Context(string connectionString, string mappingId)
        : this(VfpQueryProvider.Create(connectionString, mappingId)) 
    {
    }

    public Context(VfpQueryProvider provider)
        : base(provider) 
    {
    }

    public virtual IEntityTable<MyTable> MyTables 
    {
        get { return this.GetTable<MyTable>(); }
    }
}

次のようにコンテキスト属性を定義します。

public partial class ContextAttributes : Context 
{
    public ContextAttributes(string connectionString)
        : base(connectionString) {
    }

    [Table(Name="mytable")]
    [Column(Member="ID", IsPrimaryKey=true)]
    [Column(Member="Field1")]
    [Column(Member="Field2")]
    [Column(Member="Field3")]
    public override IEntityTable<MyTable> MyTables 
    {
        get { return base.MyTables; }
    }
}

接続文字列も必要です。app.config で次のように定義できます (Data\この場合、DBF ファイルのソースとして相対パスが使用されます)。

<connectionStrings>
  <add name="VfpData" providerName="System.Data.OleDb"
    connectionString="Provider=VFPOLEDB.1;Data Source=Data\;"/>
</connectionStrings>

そして最後に、次のように簡単に DBF ファイルの読み書きを実行できます。

// Construct a new context
var context = new Context(ConfigurationManager.ConnectionStrings["VfpData"].ConnectionString);

// Write to MyTable.dbf
var my = new MyTable
{
    ID = 1,
    Field1 = 10,
    Field2 = "foo",
    Field3 = "bar"
}
context.MyTables.Insert(my);

// Read from MyTable.dbf
Console.WriteLine("Count:  " + context.MyTables.Count());
foreach (var o in context.MyTables)
{
    Console.WriteLine(o.Field2 + " " + o.Field3);
}
于 2012-05-08T05:07:30.100 に答える
0

OleDbConnection非常に基本的なSQL操作に固執する場合、バニラはDBFをかなりうまく処理します。

ここで私が働いている場所では、OleDb クラスのみを使用して DBF と対話するアプリケーションを構築および保守しています。ただし、Adapter や DataSource は使用しません。すべては、OleDbCommands、OleDbDataReaders などを通じて「直接」行われます。

おそらく、DataAdapter は、xBase などの基本的なデータ ソースまたはレガシー データ ソースと対話するときに存在しない機能に依存している可能性があります。UPDATEOleDbCommandを使用してみましたか?

于 2010-07-08T17:07:39.373 に答える
0

通常、FoxPro ドライバーは .DBF ファイルで動作します。ファイル形式は十分に似ているため、これは読み取りに適しています。書くことはもう少しトリッキーです。残念ながら、DBASE は非常に古いテクノロジであるため、.NET はうまく機能しません。信じてください、私たちがサポートするPOSシステムのために定期的にこれらを使用しなければならないので、私はあなたの痛みを感じています.

http://www.aspcode.net/Reading-DBF-files-in-C.aspx

dBase .dbf ファイルへの .NET 接続

C#/.NET ODBC または OLE を使用して dBase III ファイルを読み書きする方法は?

そして最後に、接続文字列の私のお気に入りのソース:

http://www.carlprothman.net/Default.aspx?tabid=81

于 2010-07-08T17:08:25.980 に答える