DOBON.NET DOBON.NETプログラミング掲示板過去ログ

PostgreSQL への Adapter.Update() でエラーが発生する

環境/言語:[WindowsXP/7 Framwork3.5 C#2008]
分類:[.NET]

お世話になります。

現在下記の環境で開発しています。

Visual Studio 2008(C#)
PostgreSQL 8.4.4 (Npgsql2.0.11)

DataGridView を使用してテーブルメンテナンスを作成しています。

NpgsqlDataAdapter を使用し、Adapter.Update()で変更内容を更新しているのですが、Updateだけエラーとなってしまいます。
※InsertとDelete は正しくデータベースへ反映されます。

エラー:「指定されたキャストは有効ではありません」

AdapterのUpdateCommandは、InsertCommand・DeleteCommandと同じように作成し、
正しくセットされています。(CommandBuilderを使用)
URLのリンク先の情報と同じ状態です。

このような状況を回避する方法をご存知ではないでしょうか?
CommandBuilderで生成したUpdate文に問題がある場合、回避方法はないものでしょうか?

宜しくお願いします。
■No28000に返信(べんさんの記事)

CommandBuilder によって各 Command が生成されるということから考えるとデータベースへの
接続は問題なく、Insert が正しく処理されるということから考えると、SQL の Values 句に
おける値の設定は問題なく、Delete が正しく処理されるということから考えると SQL の 
Where 句における主キーの設定も問題なさそうですね。

Update がエラーとなることから考えると SQL の Where 句における主キー以外の値の設定が
気になります。

> このような状況を回避する方法をご存知ではないでしょうか?
> CommandBuilderで生成したUpdate文に問題がある場合、回避方法はないものでしょうか?

CommandBuilder のプロパティに設定する値を変えることで回避可能かもしれません。
CommandBuilder を使用せず手動で UpdateCommand を作成する必要があるかもしれません。
Npgsql .Net Data Provider にバグがあって Data Provider そのものを変える必要がある
かもしれません。

以上のような対応が考えられます。まずは Update 文にどのような問題あるか、
UpdateCommand の CommandText を出力して、確認してみてはいかがでしょうか。
ありがとうございます。

> CommandBuilder によって各 Command が生成されるということから考えるとデータベースへの
> 接続は問題なく、Insert が正しく処理されるということから考えると、SQL の Values 句に
> おける値の設定は問題なく、Delete が正しく処理されるということから考えると SQL の
> Where 句における主キーの設定も問題なさそうですね。

多分問題ないとは思います。

> Update がエラーとなることから考えると SQL の Where 句における主キー以外の値の設定が
> 気になります。

リンクを付けましたが、日付項目が同じようにあるので、その部分のSQLが問題なのかと・・・

> CommandBuilder のプロパティに設定する値を変えることで回避可能かもしれません。
> CommandBuilder を使用せず手動で UpdateCommand を作成する必要があるかもしれません。
> Npgsql .Net Data Provider にバグがあって Data Provider そのものを変える必要がある
> かもしれません。

最新にしてみたのですが、変わりありませんでした。
もう少し情報収集が必要だとは思っています。

> 以上のような対応が考えられます。まずは Update 文にどのような問題あるか、
> UpdateCommand の CommandText を出力して、確認してみてはいかがでしょうか。

デバッグで、Update文を確認しましたが、Where句には変な条件?が付加されています。
また、Delete文とWhere句部分が同じ(パラメータ番号?は違います)なので、Update文のSETのところだと思っています。

実際に実行されているSQLを取得して確認してみます。
>リンクを付けましたが、日付項目が同じようにあるので、その部分のSQLが問題なのかと・・・

とお考えなら、まずSQL文から日付項目に関する箇所を削除して解決するかを試してください。
自分の考えがあるのであれば、最低限そこまでやってから質問しましょう。

と説教だけでもなんですので、Insert文もOK,Delete文もOK

⇒ SQL文に日付項目(登録日とか)がありますか?
あったとしてもnow()とかを使ってませんか?

この点を確認願います。
ありがとうございます。

> とお考えなら、まずSQL文から日付項目に関する箇所を削除して解決するかを試してください。
> 自分の考えがあるのであれば、最低限そこまでやってから質問しましょう。

PostgreSQL側でSQLトレースしようとしています。
が、まだできておりません。


> と説教だけでもなんですので、Insert文もOK,Delete文もOK
>
> ⇒ SQL文に日付項目(登録日とか)がありますか?
> あったとしてもnow()とかを使ってませんか?
>
> この点を確認願います。

日付項目があります。

Update文については、CommandBuilderを使用して作成しておりますが、
now()などはありませんでした。
自分でUpdateCommand(Update文)を生成すればいいとは思うのですが、
テーブルを選択させるため不定となっています。
そのあたりも汎用的に生成できるようにできればいいと思いますので、
いろいろ試していきたいと思います。
UPDATE文作成ロジックにおける、パラメータの設定箇所付近のソースって開示できませんか?
ありがとうございます。

■No28023に返信(ふじも〜りさんの記事)
> UPDATE文作成ロジックにおける、パラメータの設定箇所付近のソースって開示できませんか?
>

こんな感じになっています。

private NpgsqlDataAdapter adapter;
private NpgsqlCommand command;
private NpgsqlCommandBuilder cb;

public DataTable Kensaku(string tableName)
{
DataTable dt = new DataTable(tableName);
adapter = new NpgsqlDataAdapter();
command = new NpgsqlCommand();
command.Connection = conn;
command.CommandText = @"
SELECT
*
FROM " +
tableName;

adapter = new NpgsqlDataAdapter(command);
adapter.Fill(dt);

cb = new NpgsqlCommandBuilder(adapter);

// コマンド設定
adapter.InsertCommand = cb.GetInsertCommand();
adapter.UpdateCommand = cb.GetUpdateCommand();
adapter.DeleteCommand = cb.GetDeleteCommand();

return dt;
}

値(Update)が設定されているところまでは確認できています。
時間がかかってますが、PostgreSQLもSQLトレースしたいと思っています。

宜しくお願い致します。

DOBON.NET | プログラミング道 | プログラミング掲示板