web-dev-qa-db-ja.com

INSERTでIDを返しますか?

INSERTクエリがあり、DBが挿入したばかりの行のIDを返すようにします。

sqlString = "INSERT INTO MagicBoxes (OwnerID, Key, Name, Permissions, Active, LastUpdated) VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) SET @ID = SCOPE_IDENTITY();";
cmd = new SqlCommand(sqlString, con);
cmd.Parameters.AddWithValue("@OwnerID", OwnerID);
cmd.Parameters.AddWithValue("@BoxKey", BoxKey);
cmd.Parameters.AddWithValue("@BoxName", BoxName);
cmd.Parameters.AddWithValue("@Username", Username);
cmd.Parameters.AddWithValue("@Date", DateTime.Now);
cmd.ExecuteNonQuery();

私は現在これを持っています、次に何をする必要があるのか​​分かりません...

27
Danpe

Paramsコレクションに@IDを追加して、次のように取得するだけです。

cmd.Parameters.Add("@ID", SqlDbType.Int, 4).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
//Now just read the value of: cmd.Parameters["@ID"].value

または、この構文を好む場合:

SqlParameter param = new SqlParameter("@ID", SqlDbType.Int, 4);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);
36
AdaTheDev

2つのオプションがあります。 _@ID_というOutputパラメーターを宣言できます。または-末尾をSELECT SCOPE_IDENTITY()に変更して、次のように使用できます。

_int id = (int)cmd.ExecuteScalar();
_

正式なパラメーターアプローチを好みますが、ExecuteScalarはうまく機能します。

21
Marc Gravell

SQL Server 2008以降、TSQLの構文に OUTPUT句 が追加されました。これにより、DMLクエリの影響を受けるデータを表形式データストリームに追加できます。

クエリが正しい情報を返した後にSCOPE_IDENTITY()をクエリすると、SQL Serverは2つのクエリを実行し、出力句で1つのクエリに制限されます。

これを知って、実行中のクエリは次のように変更できます([Id]はIDの名前です):

INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) 
OUTPUT INSERTED.Id
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date)

別の問題は、SqlCommandの破棄ではありません。ほとんど Sql... ADO.netのオブジェクトはIDisposableを実装し、適切に廃棄する必要があります。

すべてをまとめて、次のようにこのコードを実装します。

        using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
        using (var cmd = new SqlCommand(@"
                INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) 
                OUTPUT INSERTED.Id
                VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) ", conn))
        {
            cmd.Parameters.AddRange(new[]
                {
                    new SqlParameter("@OwnerID", SqlDbType.Int).Value = OwnerID,
                    new SqlParameter("@BoxKey", SqlDbType.VarChar).Value = BoxKey, 
                    new SqlParameter("@BoxName", SqlDbType.VarChar).Value = BoxName, 
                    new SqlParameter("@Date", SqlDbType.DateTime).Value = DateTime.Now 
                });

            conn.Open();

            var id = (int)cmd.ExecuteScalar();
        }
18
Filip De Vos

これをパラメーターに追加します

SqlParameter IDParameter = new SqlParameter("@ID",SqlDbType.Int);
IDParameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(IDParameter);

実行後、IDを取得できます

int id = (int)IDParameter.Value;
5
RemoteSojourner

ストアプロシージャを呼び出さないのはなぜですか。ストアプロシージャに値を渡して値を挿入し、SPからSCOPE_IDENTITY().を使用して挿入された最後のシード値を返します。このヘルプを願っています。

0
FIre Panda