如何将空值传递给 SqlCommand 的参数
How do I pass a null value into a parameter for a SqlCommand
在任何人评论之前在其他问题中已经回答之前,我知道..但是尽管我已经在
上查看了答案
- Assign null to a SqlParameter
- Sending null parameters to Sql Server
- Best method of assigning NULL value to SqlParameter
甚至我自己的问题
我无法查询 return 个带有空参数的值
我已尝试简化我的代码以便可以在此处看到它。
我也试过
int? i = null;
SqlConnection connection = new SqlConnection(Properties.Settings.Default.connstring.ToString());
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk";
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull);
cmd.Connection.Open();
var dataReader = cmd.ExecuteReader();
var dataTable = new DataTable();
dataTable.Load(dataReader);
cmd.Connection.Close();
我已经尝试过我刚刚做过的变体
cmd.Parameters.AddWithValue("@parent_pk", DBNull.Value);
我试过使用查询
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null";
我尝试明确声明该参数可为空
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull).IsNullable = true;
出于某种原因,我认为我有工作,因此我有理由接受我所做的回答,但我错了,无论价值如何,对我来说都是 return。
我知道命令对象正在连接和 returns 数据,因为如果我输入一个有效值(比如 27)它 returns 记录...我也知道有以 Null 作为值的记录...但是无论我如何尝试设置它,当我尝试将 null 值作为参数传递时,我总是一无所获 returns。
谁能帮我找出我做错了什么,我将不胜感激。
问题出在您选择的 SQL 个查询中:
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk";
如果@parent_pk 的值为 NULL,它将 return 什么都没有,因为即使 parent_pk 在 SQL 服务器中为 null NULL = NULL
return 错误。 NULL is NULL
return 正确。
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null";
此查询 return 包含所有内容,因为如果您为 @parent_pk
传递 NULL,则子句 @parent_pk is NULL
将评估为真,因为 @parent_pk
不会每行更改评估。
要完成您想要做的事情,您需要执行以下操作:
string nullCommandText = "Select * from view_nests where parent_pk IS @parent_pk";
string commandText = "Select * from view_nests where parent_pk = @parent_pk";
cmd.CommandText = i == null? nullCommandText : commandText;
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull);
其他两条评论:
- 不应使用
*
,列出您需要的列。
- 如果您必须执行这种逻辑,请在数据库端创建一个存储过程并改用它。
由于我的评论解决方案有效 - 将 post 放在这里。基本上已经描述过的问题(甚至已经在你之前的问题中回答过)是你需要使用 IS NULL 来比较 sql 中的值和 null。由于您可以有两种情况(您的参数为 null 或不为 null)- 您必须像这样测试这两种情况:
where parent_pk = @parent_pk or (@parent_pk IS NULL and parent_pk IS NULL)
在任何人评论之前在其他问题中已经回答之前,我知道..但是尽管我已经在
上查看了答案- Assign null to a SqlParameter
- Sending null parameters to Sql Server
- Best method of assigning NULL value to SqlParameter
甚至我自己的问题
我无法查询 return 个带有空参数的值
我已尝试简化我的代码以便可以在此处看到它。
我也试过
int? i = null;
SqlConnection connection = new SqlConnection(Properties.Settings.Default.connstring.ToString());
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk";
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull);
cmd.Connection.Open();
var dataReader = cmd.ExecuteReader();
var dataTable = new DataTable();
dataTable.Load(dataReader);
cmd.Connection.Close();
我已经尝试过我刚刚做过的变体
cmd.Parameters.AddWithValue("@parent_pk", DBNull.Value);
我试过使用查询
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null";
我尝试明确声明该参数可为空
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull).IsNullable = true;
出于某种原因,我认为我有工作,因此我有理由接受我所做的回答,但我错了,无论价值如何,对我来说都是 return。
我知道命令对象正在连接和 returns 数据,因为如果我输入一个有效值(比如 27)它 returns 记录...我也知道有以 Null 作为值的记录...但是无论我如何尝试设置它,当我尝试将 null 值作为参数传递时,我总是一无所获 returns。
谁能帮我找出我做错了什么,我将不胜感激。
问题出在您选择的 SQL 个查询中:
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk";
如果@parent_pk 的值为 NULL,它将 return 什么都没有,因为即使 parent_pk 在 SQL 服务器中为 null NULL = NULL
return 错误。 NULL is NULL
return 正确。
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null";
此查询 return 包含所有内容,因为如果您为 @parent_pk
传递 NULL,则子句 @parent_pk is NULL
将评估为真,因为 @parent_pk
不会每行更改评估。
要完成您想要做的事情,您需要执行以下操作:
string nullCommandText = "Select * from view_nests where parent_pk IS @parent_pk";
string commandText = "Select * from view_nests where parent_pk = @parent_pk";
cmd.CommandText = i == null? nullCommandText : commandText;
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull);
其他两条评论:
- 不应使用
*
,列出您需要的列。 - 如果您必须执行这种逻辑,请在数据库端创建一个存储过程并改用它。
由于我的评论解决方案有效 - 将 post 放在这里。基本上已经描述过的问题(甚至已经在你之前的问题中回答过)是你需要使用 IS NULL 来比较 sql 中的值和 null。由于您可以有两种情况(您的参数为 null 或不为 null)- 您必须像这样测试这两种情况:
where parent_pk = @parent_pk or (@parent_pk IS NULL and parent_pk IS NULL)