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 に答える