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.AreaCode
是int
,因此搜索使用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);
如何在此查询中使用非空类型?
好的,我让这个工作。主要问题是,这需要比较null
和null
,然而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;