none
Npgsql 使用時 insertクエリ発行パラメータクエリのバインドについて RRS feed

  • 質問

  • いつもお世話になってます。

    Npgsqlにて接続してデータ取得のクエリでは、きちんとバインドして取得できたのですが、パラメータクエリでデータ入力しようとして詰まってしまいました。
    識者の方のお知恵を借りたく思いまして、投稿いたしました。

    CREATE TABLE attribute
    (
      id smallint NOT NULL,
      attribute_name character varying,
      CONSTRAINT pkey_attribute_id PRIMARY KEY (id)
    )
    で定義したテーブルに

    NpgsqlConnection con = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=testUser;Password=testpass;Database=testdb;Encoding=UNICODE");
                string sql = "insert into attribute(id,attribute_name) values(@id,@attribute_name)";
                NpgsqlCommand com = new NpgsqlCommand(sql,con);
                con.Open();
               
                com.Parameters.Add(new NpgsqlParameter("id", NpgsqlDbType.Smallint, 10000, "id"));
                com.Parameters.Add(new NpgsqlParameter("attribute_name", NpgsqlDbType.Varchar, 100, "attribute_name"));
                com.Prepare();
                com.Parameters["id"].Value = 2002;
                com.Parameters["attribute_name"].Value = "test" + 2002;
                com.ExecuteNonQuery();
    con.Close();
    以上のコードを実行してデータ投入しようとしたところ
    例外
    23505: duplicate key value violates unique constraint "pkey_attribute_id"
    の例外が発生しました。

    もちろん、データの重複はありません、ユニーク制約の意味も知っています。
    pgAdminで確認しました

    ログ(pg_log)などを見ても、バインド後のクエリは表示されず困ってしまいました。

    また、バインド後のクエリ(例の場合:insert into attribute (id,attribute_name) values(2002,'test2002');)の取得方法も合わせて質問いたします。
    com.CommandTextではバインド前のクエリが取得できますが・・・
    質問の不備などありましたら指摘してもらえたら幸いです。

    環境 postgresql8.3
    npgsql2.0.6
    .net 3.5
    2009年7月23日 16:00

回答

  • 三輪の牛様 回答ありがとうございます。
    今日実行したら・・・ 無事に実行されました(汗
    何でだろう(苦

    間抜けな質問にお答えいただき本当に感謝します。
    log_statementの設定 重ねて感謝いたします。
    • 回答としてマーク akky01 2009年7月24日 9:28
    2009年7月24日 9:28

すべての返信

  • 環境は若干違いますが、問題なく実行されていました。
    同じプログラムを2度実行すればお示しのエラーが出ました。
    postgres.conf のlog_statementをallにすれば発行されたSQL文が表示されます。
    パラメータはクライアント側で解釈されるのではなくサーバ側で解釈されるので
    akky01さんが期待するようなSQL文は表示されません。

    環境 postgresql8.3
    npgsql2.0.6
    net 3.5 sp1
    http://www.mahoroba.ne.jp/~mw_ken
    2009年7月24日 2:23
  • 三輪の牛様 回答ありがとうございます。
    今日実行したら・・・ 無事に実行されました(汗
    何でだろう(苦

    間抜けな質問にお答えいただき本当に感謝します。
    log_statementの設定 重ねて感謝いたします。
    • 回答としてマーク akky01 2009年7月24日 9:28
    2009年7月24日 9:28