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

Sql 使用上下文连接时不需要将null转换为DBNull,sql,sql-server-2008,sqlclr,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 SqlComma

试图理解为什么在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))插入到 TestNote(UserId'需要参数'@UserId',而不是 供应


为什么在使用上下文连接时传递null会起作用?

我不知道确切的答案,但我猜它是在后台为上下文连接使用了不同的提供程序,这只是实现上的差异。我不指望将值设置为null才能起作用。var的行为似乎也不同.NET Framework的所有版本——例如,根据您的需要,对于.NET 3.5,您需要使用DBNull,但是如果您切换到.NET 4.5文档,它根本就没有提到DBNull。

我在这台机器上安装的SQL Server已损坏,因此无法测试我自己-如果在添加参数时在参数名称中包含
@
,会有什么不同吗包含
@
没有任何效果。仔细检查连接对象后,我注意到
SqlConnection。使用上下文连接时,InnerConnection
具有不同的类型。使用上下文连接时,它是
SqlInternalConnectionSmi
,没有它的
sqlinternalconnectionds
。可能有什么问题需要解决哦,随它去吧。