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();
私は現在これを持っています、次に何をする必要があるのか分かりません...
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);
2つのオプションがあります。 _@ID
_というOutput
パラメーターを宣言できます。または-末尾をSELECT SCOPE_IDENTITY()
に変更して、次のように使用できます。
_int id = (int)cmd.ExecuteScalar();
_
正式なパラメーターアプローチを好みますが、ExecuteScalar
はうまく機能します。
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();
}
これをパラメーターに追加します
SqlParameter IDParameter = new SqlParameter("@ID",SqlDbType.Int);
IDParameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(IDParameter);
実行後、IDを取得できます
int id = (int)IDParameter.Value;
ストアプロシージャを呼び出さないのはなぜですか。ストアプロシージャに値を渡して値を挿入し、SPからSCOPE_IDENTITY().
を使用して挿入された最後のシード値を返します。このヘルプを願っています。