NpgsqlCommandBuilderを使用して、データセットに対して挿入/更新/削除操作を実行するSQLコマンドを自動的に生成しようとしています。データセットはデータグリッドにバインドされます(これは実際にはまだ方法がわかりません)。したがって、データセットを手動で編集することはありません。SQLコマンドを自動的に生成しようとすると、NpgsqlDataAdaptor.Update()を呼び出すときに例外がスローされます。
dbテーブルのスキーマは次のとおりです。
tblFee
{
character(4) dest,
character(4) id,
character(2) indicator,
double fee
}
the primary key is (dest, id, indicator)
これが私のコードです:
string m_strConnection = "Server=192.168.253.20;Port=5432;User Id=alex;Password=asdf;Database=mydb;";
DataSet m_ds = new DataSet("EcnFeeData");
NpgsqlConnection m_conn = new NpgsqlConnection(m_strConnection);
NpgsqlDataAdapter m_dAdapter = new NpgsqlDataAdapter();
m_dAdapter.SelectCommand = new NpgsqlCommand("SELECT * FROM \"tblFee\"", m_conn);
NpgsqlCommandBuilder builder = new NpgsqlCommandBuilder(m_dAdapter);
m_conn.Open();
m_dAdapter.Fill(m_ds, "tblFee");
m_ds.Tables[0].Rows[0]["fee"] = 1;
builder.GetUpdateCommand();
m_dAdapter.Update(m_ds, "tblFee");
この例外は、最後の行の実行中にスローされます。
A first chance exception of type 'System.InvalidOperationException' occurred in System.Data.dll
Additional information: Update requires a valid UpdateCommand when passed DataRow collection with modified rows.
行を挿入しようとすると同じことが起こりますが、例外メッセージのみが異なります。
Additional information: Update requires a valid InsertCommand when passed DataRow collection with new rows.
最後のコード例は、.NET4.0ドキュメントで提供されている例でSqlCommandBuilderを使用するのと同じ方法でNpgsqlCommandBuilderを使用する試みでした。Npgsqlのドキュメントには、この方法でそれを行うための例はありません。この機能はNpgsqlCommandBuilderでサポートされていませんか?NpgsqlCommandBuilderにSQLコマンドを自動的に生成させたいのですが、それが機能しない場合は、手動で作成する必要があります。
InsertCommandを手動で生成するためのNpgsqlドキュメントの例に従った後、それを機能させることができましたが、UpdateCommandに対してこれを行う方法を理解できませんでした。InsertCommandの作成に使用したコードは次のとおりです。
m_dAdapter.InsertCommand = new NpgsqlCommand("insert into \"tblFee\" (dest, id, indicator, fee) values (:a, :b, :c, :d)", m_conn);
m_dAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("a", DbType.AnsiStringFixedLength));
m_dAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("b", DbType.AnsiStringFixedLength));
m_dAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("c", DbType.AnsiStringFixedLength));
m_dAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("d", DbType.Double));
m_dAdapter.InsertCommand.Parameters[0].Direction = ParameterDirection.Input;
m_dAdapter.InsertCommand.Parameters[1].Direction = ParameterDirection.Input;
m_dAdapter.InsertCommand.Parameters[2].Direction = ParameterDirection.Input;
m_dAdapter.InsertCommand.Parameters[3].Direction = ParameterDirection.Input;
m_dAdapter.InsertCommand.Parameters[0].SourceColumn = "dest";
m_dAdapter.InsertCommand.Parameters[1].SourceColumn = "id";
m_dAdapter.InsertCommand.Parameters[2].SourceColumn = "indicator";
m_dAdapter.InsertCommand.Parameters[3].SourceColumn = "fee";
m_dAdapter.InsertCommand.Connection = m_conn;
これがUpdateCommandを実行するための私の試みですが、機能しません:
m_dAdapter.UpdateCommand = new NpgsqlCommand("update \"tblFee\" set dest = :a, id = :b, indicator = :c, fee = :d where dest = :e and id = :f and indicator = :g");
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("a", DbType.AnsiStringFixedLength));
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("b", DbType.AnsiStringFixedLength));
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("c", DbType.AnsiStringFixedLength));
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("d", DbType.Double));
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("e", DbType.AnsiStringFixedLength));
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("f", DbType.AnsiStringFixedLength));
m_dAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("g", DbType.AnsiStringFixedLength));
m_dAdapter.UpdateCommand.Parameters[0].Direction = ParameterDirection.Input;
m_dAdapter.UpdateCommand.Parameters[1].Direction = ParameterDirection.Input;
m_dAdapter.UpdateCommand.Parameters[2].Direction = ParameterDirection.Input;
m_dAdapter.UpdateCommand.Parameters[3].Direction = ParameterDirection.Input;
m_dAdapter.UpdateCommand.Parameters[4].Direction = ParameterDirection.Input;
m_dAdapter.UpdateCommand.Parameters[5].Direction = ParameterDirection.Input;
m_dAdapter.UpdateCommand.Parameters[6].Direction = ParameterDirection.Input;
m_dAdapter.UpdateCommand.Parameters[0].SourceColumn = "dest";
m_dAdapter.UpdateCommand.Parameters[1].SourceColumn = "id";
m_dAdapter.UpdateCommand.Parameters[2].SourceColumn = "indicator";
m_dAdapter.UpdateCommand.Parameters[3].SourceColumn = "fee";
m_dAdapter.UpdateCommand.Parameters[4].SourceColumn = "dest_orig";
m_dAdapter.UpdateCommand.Parameters[5].SourceColumn = "id_orig";
m_dAdapter.UpdateCommand.Parameters[6].SourceColumn = "indicator_orig";
m_dAdapter.UpdateCommand.Connection = m_conn;
どんな助けでも大歓迎です。
アレックス