0

ユーザーに次のことを許可するプログラムを作成しています。

  1. ユーザーが指定する (任意の) データベースに接続する
  2. そのデータベース内のすべてのテーブルを個別の DataGridViews で表示する
  3. プログラムでそれらを編集し、ランダム データを生成し、結果を確認します。
  4. これらの変更をコミットするか元に戻すかを選択します

そこで私は DataSet クラスを発見しました。これは、データベースが保持できるすべてのものを保持できるように見えます。ここで行う最善の方法は、すべてを 1 つのデータセットにロードし、ユーザーに編集させてからデータセットを保存することであると判断しました。データベースに戻ります。問題は、データベース テーブルをロードする唯一の方法が次のとおりであることです。

set = new DataSet();
DataTable schema = connection.GetOleDbSchemaTable(
    OleDbSchemaGuid.Tables,
    new string[] { null, null, null, "TABLE" });
foreach (DataRow row in schema.Rows)
{
    string tableName = row.Field<string>("TABLE_NAME");
    DataTable dTable = new DataTable();
    new OleDbDataAdapter("SELECT * FROM " + tableName, connection).Fill(dTable);
    dTable.TableName = tableName;
    set.Tables.Add(dTable);
}

データセットがまさにこの目的のために設計されているように見えることを考えると、もっと簡単な方法があるはずです。しかし、本当の問題は、これらのものを保存しようとするときです。OleDbDataAdapter.Update() メソッドを使用するには、有効な INSERT クエリを提供する必要があると言われました。この種のものを私のために処理するクラスを持つことのすべてのポイントを否定していませんか?

とにかく、データベースをデータセットにロードして保存する方法を誰かが説明してくれることを願っています。私はいつでも自分でコマンドを一緒に解析できましたが、それは最善の解決策とは思えません。

4

1 に答える 1

1

OleDbAdapter を作成し、レコードを処理するように構成できますが、DataSet 自体はデータの取得元を認識していないため、Insert、Update、および Delete ステートメントを指定する必要があります。Access データベース、Xml、またはテキスト ファイルの可能性があります。

このようなものになります(明らかにテストされていません)

DataSet ds = new DataSet("myData");
var da = new OleDbDataAdapter("SELECT * FROM employee", connection);
// filling your dataset
da.Fill(ds);

// Setting up the dataAdapter, could be a stored procedure
da.InsertCommand = new OleDbCommand("INSERT employee (id, name) VALUES (@id, @name)");
da.UpdateCommand = new OleDbCommand("UPDATE employee SET name = @name WHERE id = @id");

// Updating Database from data on DataSet
da.Update(ds);
于 2010-03-23T18:26:57.893 に答える