Sql 使用上下文连接时不需要将null转换为DBNull
试图理解为什么在Sql server 2008 Clr程序集中使用上下文连接时不必将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
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
。可能有什么问题需要解决哦,随它去吧。