10

シリアル主キーを使用してPostgreSQLテーブルに行を挿入しようとしていますが、挿入後にこの列を取得する必要があります。私はこのようなものを手に入れました:

テーブル「pais」には、id、pais、capitalの3つの列があります。idはシリアル列であり、その主キーです。

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital)", conn);
query.Parameters.Add(new NpgsqlParameter("nombre", NpgsqlDbType.Varchar));
query.Parameters.Add(new NpgsqlParameter("capital", NpgsqlDbType.Varchar));
query.Prepare();
query.Parameters[0].Value = this.textBox1.Text;
query.Parameters[1].Value = this.textBox2.Text;
Object res = query.ExecuteScalar();
Console.WriteLine(res);

テーブルに行を挿入しますが、「res」値はnullです。nexval('table_sequence')を使用して挿入すると、nullも返されます。

テーブルのIDを返す方法はありますか?私は何かが足りないのですか?

前もって感謝します

4

4 に答える 4

27

そのスレッドは安全ですか?
挿入と選択の間に別の挿入が発生した場合はどうなりますか?使用しない理由:

INSERT INTO table (fieldnames) VALUES (values) RETURNING idcolumn

于 2011-04-23T16:33:16.647 に答える
19
insert into pais(nombre, capital) values(@nombre, @capital) RETURNING id

id主キーに置き換えてenter code here使用する

Object res = query.ExecuteScalar();

resにはPKがあります。

于 2013-12-24T09:39:23.933 に答える
7

最後に挿入されたIDを選択するには、以下を使用する必要があります。currval(sequencename)

したがって、selectステートメントは次のようになります。

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital);select currval('table_sequence');", conn);
于 2011-04-07T15:53:45.467 に答える
3

挿入自体によって値が返されることはありません。ExecuteScalarを実行すると、いわば「選択」される単一の値が検索されます。

問題を解決するには、selectステートメントで挿入をフォローアップする必要があると思います。
t-sqlを使用している場合は、次のようにします

string sql = "INSERT INTO [Table](FieldName)VALUES(@ParamName);" + "SELECT CAST(scope_identity()AS int)";

ExecuteScalarは、一意のIDを返します。

postGresqlの正確な構文はわかりませんが、これで問題を解決できるといいのですが。

于 2011-04-07T15:36:28.090 に答える