使用上下文连接时,不需要将null转换为DBNull

时间:2013-01-11 11:29:06

标签: sql sql-server-2008 sqlclr

尝试理解在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?

1 个答案:

答案 0 :(得分:1)

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