我正在尝试使用查询从表中选择使用一到三个参数的所有内容;
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
。即
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
是有效查询,因此不返回任何字段。
我尝试通过声明AreaCode
使int? AreaCode = null
可以为空,但这并不起作用。这将返回所有字段,而不是仅返回一个字段,就像我使用默认的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);
这将返回包含单词' 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);
如何在此查询中使用不可为空的类型?
答案 0 :(得分:0)
好的,所以我得到了这个工作。主要问题是,这需要将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;