尝试理解在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?
答案 0 :(得分:1)
我肯定不知道答案,但我猜它是在幕后使用不同的提供商进行上下文连接,而且只是一个实现差异。我不会指望将值设置为null才能工作。对于不同版本的.NET Framework,行为似乎也有所不同 - 例如对于根据this的.NET 3.5,您需要使用DBNull,但如果切换到.NET 4.5文档,则根本不提及DBNull。