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

时间:2014-05-19 02:54:33

标签: c# mysql parameters

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

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。即

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);

如何在此查询中使用不可为空的类型?

1 个答案:

答案 0 :(得分:0)

好的,所以我得到了这个工作。主要问题是,这需要将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;