如何将空值传递给SqlCommand的参数

时间:2016-05-27 21:06:28

标签: c# sql-server dbnull sqlparameters

在有人评论之前已经在其他问题中回答过这个问题之前我知道这一点......但是尽管我已经在

回答了这些问题。

甚至是我自己的问题

我无法让我的查询返回带有空参数的值

我已经尝试过简化我的代码,因此可以在这里看到。

我也用

尝试了这个
 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;

出于某种原因,我认为我有工作,因此我接受了我所做的答案的理由,但我错了,无论价值如何,只会将一切都归还给我。

我知道命令对象正在连接并返回数据,因为如果我输入一个有效值(比如27)它会返回记录...我也知道有Null作为值的记录......但无论如何我如何尝试设置它当我尝试传递空值作为参数时,我一直得不到任何回报。

任何能帮助我弄清楚我在做错的人都会感激不尽。

2 个答案:

答案 0 :(得分:6)

由于我的评论解决方案有效 - 将在此处发布。基本上已经描述的问题(甚至在前一个问题中已经回答过)是你需要使用IS NULL来比较sql中的null值。既然你可以有两种情况(你的参数是否为空) - 你必须测试这两种情况:

variable

答案 1 :(得分:4)

问题出在您选择的SQL查询中:

cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk";

如果@parent_pk的值为NULL,则它将不返回任何内容,因为即使在SQL Server NULL = NULL中parent_pk为null,也返回false。 NULL is NULL返回true。

cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null";

此查询返回所有内容,因为如果为@parent_pk传递NULL,则子句@parent_pk is NULL将评估为true,因为@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);

另外两条评论:

  1. 不应使用*,列出您想要的列。
  2. 如果必须执行此类逻辑,请在db端创建存储过程并使用该存储过程。