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

Bas*_*yon 2 c# sql-server dbnull sqlparameter

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

甚至我自己的问题

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

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

我也试过这个

 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();
Run Code Online (Sandbox Code Playgroud)

我尝试过这方面的变化

cmd.Parameters.AddWithValue("@parent_pk", DBNull.Value);
Run Code Online (Sandbox Code Playgroud)

我尝试过使用该查询

cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null";
Run Code Online (Sandbox Code Playgroud)

我尝试将参数明确声明为可为空

cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull).IsNullable = true;
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我认为我有工作,因此我接受我所做的答案的原因,但我错了,无论价值多少,只会把一切都归还给我.

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

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

Evk*_*Evk 7

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

where parent_pk = @parent_pk or (@parent_pk IS NULL and parent_pk IS NULL)
Run Code Online (Sandbox Code Playgroud)


小智 5

问题在于您选择的 SQL 查询:

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

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

cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null";
Run Code Online (Sandbox Code Playgroud)

此查询返回所有内容,因为如果您传递 NULL for @parent_pk,则该子句@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);
Run Code Online (Sandbox Code Playgroud)

另外两条评论:

  1. 不应该使用*,列出您想要的列。
  2. 如果您必须执行这种逻辑,请在数据库端创建一个存储过程并使用它。