Command.Parameters[“@name"].值语法正确

本文关键字:语法 quot Parameters @name Command | 更新日期: 2023-09-27 18:04:10

我正在尝试使用查询从一个表中选择所有使用一个-三个参数;

SELECT * FROM PlantAreaCodes 
WHERE (@AreaCode IS NULL OR AreaCode = @AreaCode) 
AND (@AreaName IS NULL OR AreaName LIKE @AreaName) 
AND (@Comments IS NULL OR Comments LIKE @Comments);
下面是我的查询的c#代码:
mySqlCommand = mySqlConnect.CreateCommand();
mySqlCommand.CommandText = "SELECT * FROM PlantAreaCodes WHERE (@AreaCode IS NULL OR AreaCode = @AreaCode) AND (@AreaName IS NULL OR AreaName LIKE @AreaName) AND (@Comments IS NULL OR Comments LIKE @Comments);";
mySqlCommand.Parameters.Add("@AreaCode", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@AreaName", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@Comments", MySqlDbType.Text);
mySqlCommand.Parameters["@AreaCode"].Value = (string.IsNullOrEmpty(Convert.ToString(PModel.AreaCode)) ? (object)DBNull.Value : PModel.AreaCode);
mySqlCommand.Parameters["@AreaName"].Value = (string.IsNullOrEmpty(PModel.AreaName) ? (object)DBNull.Value : PModel.AreaName);
mySqlCommand.Parameters["@Comments"].Value = (string.IsNullOrEmpty(PModel.Comments) ? (object)DBNull.Value : PModel.Comments);
mySqlReader = mySqlCommand.ExecuteReader();

这个查询允许用户搜索一个、两个、三个或没有字段而不会抛出任何错误,但是它只适用于可空类型。因此,由于PModel.AreaCodeint,因此搜索使用0而不是null。ie .

SELECT * FROM PlantAreaCodes 
WHERE (NULL IS NULL OR AreaCode = NULL) 
AND (NULL IS NULL OR AreaName LIKE NULL) 
AND (NULL IS NULL OR Comments LIKE NULL);

不返回任何字段,因为AreaCode = 0是一个有效查询。

我已经尝试通过声明int? AreaCode = null使AreaCode为空,但这不起作用。这将返回所有字段,而不仅仅是一个字段,就像我使用默认的null:

一样。
SELECT * FROM PlantAreaCodes 
WHERE (110 IS NULL OR AreaCode = 110) 
AND (NULL IS NULL OR AreaName LIKE NULL) 
AND (NULL IS NULL OR Comments LIKE NULL);

但是这个查询返回一个字段:

SELECT * FROM PlantAreaCodes 
WHERE (110 IS NULL OR AreaCode = 110) 
AND ('%General%' IS NULL OR AreaName LIKE '%General%') 
AND (NULL IS NULL OR Comments LIKE NULL);

返回Name中包含单词"General"的所有字段:

SELECT * FROM PlantAreaCodes 
WHERE (NULL IS NULL OR AreaCode = NULL) 
AND ('%General%' IS NULL OR AreaName LIKE '%General%') 
AND (NULL IS NULL OR Comments LIKE NULL);

如何在此查询中使用非空类型?

Command.Parameters[“@name"].值语法正确

好的,我让这个工作。主要问题是,这需要比较nullnull,然而int不能是null,因为它是一个值类型。

所以我必须对我的代码做一些调整我让这个工作与变通

int? AreaCode = null;

这允许我修改我的代码:

mySqlCommand.Parameters["@AreaCode"].Value = (PModel.AreaCode.HasValue ? PModel.AreaCode.Value : object)DBNull.Value );

对于那些不知道这里发生了什么的人:

操作符?赋予值类型没有值的能力,因此它可以= null

int n = 0;
int? n = null;
bool b = false;
bool? b = null;