5

SQL Server では、ID は null 以外の整数であり、ID です。

次のコードを実行すると、最後の行で InvalidCastException が発生します。

SqlCommand cmd = new SqlCommand();
cmd.Connection = _conn;
cmd.CommandText = @"INSERT INTO [Users] (Name, Email, Password) VALUES (@name, @email, @pass); SELECT SCOPE_IDENTITY()";
cmd.Parameters.AddWithValue("@name", newUser.Name);
cmd.Parameters.AddWithValue("@email", newUser.Email);
cmd.Parameters.AddWithValue("@pass", newUser.PasswordHash);
int id = (int)cmd.ExecuteScalar();

ここで返される ExecuteScalar() とは何ですか? それが返すものは何でも、それを数値のように見せる ToString() を持っているので、このひどいコード行は機能します:

int id = Int32.Parse(cmd.ExecuteScalar().ToString());
4

3 に答える 3

10

SCOPE_IDENTITY()TSQLdecimalとしても知られる in コードを返します。NUMERIC(38,0)

http://msdn.microsoft.com/en-us/library/ms190315.aspx

したがって、直接キャストが必要な場合は、(int)(decimal)cmd.ExecuteScalar();. 10 進数から int への変換では、厳密な意味で情報が失われる可能性があることに注意してください。ただし、ID 列が整数であるため、変換は安全です。

于 2010-10-18T23:43:58.050 に答える
2

などの別の数値型のボックス化されたインスタンスを返している可能性がありますlong
ボックス化longされた は に変換できませんint

戻り値を呼び出しGetType()て、実際の型を確認できます。

于 2010-10-18T23:36:09.270 に答える
0

INSERT ステートメントの末尾から

SELECT SCOPE_IDENTITY()

[Users] テーブルに挿入された行の ID 値を返しています。

于 2010-10-18T23:38:56.673 に答える