SQL Server 2008 Clrアセンブリでコンテキスト接続を使用するときに、null
に変換する必要がない理由を理解しようとしています。DBNull
次のclr手順を使用します。
[SqlProcedure]
public static void ParamTest(SqlBoolean useNormalConnection)
{
bool mode = useNormalConnection.Value;
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = "INSERT INTO TestNote (UserId, [Text]) VALUES (@UserId, @Text)";
cmd.Parameters.Add("UserId", SqlDbType.Int).Value = null;
cmd.Parameters.Add("Text", SqlDbType.NVarChar).Value = "hello!";
if (mode)
{
using (SqlConnection con = new SqlConnection(@"Data Source=localhost\SQL2008;Initial Catalog=TestDb;Integrated Security=True"))
{
con.Open();
cmd.Connection = con;
cmd.ExecuteNonQuery();
}
}
else
{
using (SqlConnection con = new SqlConnection("context connection=true;"))
{
con.Open();
cmd.Connection = con;
cmd.ExecuteNonQuery();
}
}
}
}
exec ParamTest 0
動作します
exec ParamTest 1
次の例外メッセージが表示されても機能しません。
パラメータ化されたクエリ'(@UserId int、@ Text nvarchar(6))INSERT INTO TestNote(UserId'は、指定されていないパラメータ'@UserId'を予期します。
コンテキスト接続を使用するときにnullを渡すことが機能するのはなぜですか?