0

私は(初めてで)SerialPortを介してデバイスに情報を送受信するプロジェクトに後で接続されるSQL CEデータベースで作業しています。このデータベースには、コミュニケーションのあらゆる部分に関する情報が保存されます。データセットを更新し、この更新されたデータをデータベースにコミットすることになると、私は少し立ち往生しています。

data = new DataSet();
adapter = new SqlCeDataAdapter("SELECT * FROM " + [table_name])
builder = new SqlCeCommandBuilder(adapter);
adapter.Fill(data, [table_name]);

data.Tables[table_name].Rows[identity_value][a_column] = a_column_value;
adapter.Update(data, [table_name]);

このメソッドを実行する前に、ID 値 1 のテーブルにレコードがあることを確認しています。ただしThere is no row at position 1、adapter.Update() を呼び出す前に IndexOutOfRangeException が発生しています。データセットの使用方法と更新方法を誤解していると思います。何かアドバイス?

行を更新する前にデータセットを調べてみましたが、デバッガーでデータセットをピアリングできないようです。これを行う方法はありますか?

4

1 に答える 1

0

これを試して:

var rows = data.Tables[table_name].Select(String.Format("[Id] = {0}",identity_value));

if (rows.Length == 1)
{
    rows[0][a_column] = a_column_value;
}

プロパティを間違って解釈していますRows

data.Tables[table_name].Rows[ROWINDEX][COLUMNINDEX]

ROWINDEX は ID ではなく配列インデックスです

提案:

使用する必要がある場合は、 SqlCeDataAdapter.FillSchemaDataSetでテーブル スキーマ情報もロードします。

adapter.FillSchema(data.Tables[table_name], SchemaType.Mapped);

adapter.Fill(data, [table_name]);これはデータのみをロードします:

次に、主キー列として指定された列が少なくとも 1 つある場合は、 DataRowCollection.Find MethodDataTableで行を取得できます。

DataRow foundRow = data.Tables[table_name].Rows.Find(identity_value);
于 2013-03-01T14:29:20.047 に答える