3

试图了解为什么在 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 起作用?

4

1 回答 1

1

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

于 2013-01-12T09:27:52.437 回答