7

次のようなコードがあり、データをテーブルに挿入して、新しい要素のID(自動インクリメントで指定)を返そうとします。

int newEquipmentID = new int();

query = database.ParameterizedQueryString("INSERT INTO Equipment (EquipmentTypeID) VALUES ({0})", "equipmenttypeID");

newEquipmentID = (int)database.Connection.ExecuteScalar(query, DefaultTimeout, equipment.EquipmentTypeID);

ただし、新しいアイテムがまだ追加されていないかのように、失敗してnullを返します。しかし実際には、DBで簡単な相談をしている新しいアイテムを見ることができます。

私の質問は、データが実際にDBに追加される「時期」と、新しく追加されたアイテムのIDを取得する方法です。ありがとう!

4

4 に答える 4

15

新しいレコードを作成して新しい ID 値を取得するために、2 つのクエリは必要ありません。

using (var con = new SqlConnection(ConnectionString)) {
    int newID;
    var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)";
    using (var insertCommand = new SqlCommand(cmd, con)) {
        insertCommand.Parameters.AddWithValue("@Value", "bar");
        con.Open();
        newID = (int)insertCommand.ExecuteScalar();
    }
}

補足:エラーが発生しやすいため、このような Database-Class は使用しません。

于 2012-04-18T14:07:26.033 に答える
3

SQL クエリは、新しく生成された ID を返しません。それを返すには、OUTPUTを使用します:

INSERT INTO Equipment (<list of fields>) 
    OUTPUT inserted.EquipmentTypeID 
VALUES (<list of values>)

注意すべき点:

  • <list of fields>値を指定する列のコンマ区切りリストを表します
  • フィールドのリストには、自動インクリメント ID 列を含めないでください(自動的に値が割り当てられます)。
  • <list of values>上記の指定されたフィールドに挿入される値のコンマ区切りリストを表します。値の数はフィールドの数と同じである必要があり、データ型は一致する必要があります
于 2012-04-18T14:06:33.707 に答える
2

ExecuteScalar()挿入されたばかりの行のIDを返すには、それを選択する必要があります。

クエリによって返された結果セットの最初の行の最初の列

何もINSERT選択/返さない。

insert ...
select ...

詳細については、@Timの回答を参照してください。

于 2012-04-18T14:04:20.823 に答える
0

OUTPUT句は、新しく追加されたアイテムのIDを取得するのに役立ちます。詳細については、以下のリンクを参照してください。

ここをクリック!_ 詳細については

于 2012-04-18T14:09:44.727 に答える