C# Command.Parameters[“@name”]”。值语法正确

C# Command.Parameters[“@name”]”。值语法正确,c#,mysql,parameters,C#,Mysql,Parameters,我正试图使用一个查询来选择表中使用1-3个参数的所有内容 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 = mySqlCo

我正试图使用一个查询来选择表中使用1-3个参数的所有内容

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

由于AreaCode=0是有效查询,因此不会返回任何字段

我已尝试通过声明int使区域代码为空?AreaCode=null,但这不起作用。这将返回所有字段,而不仅仅是一个字段,就像我使用默认的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);

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

好的,这样我就可以工作了。主要问题是,这需要将null与null进行比较,但是int不能为null,因为它是值类型

所以我不得不对我的代码做一些调整,我用变通方法解决了这个问题

int? AreaCode = null;
这允许我更改代码:

mySqlCommand.Parameters["@AreaCode"].Value = (PModel.AreaCode.HasValue ? PModel.AreaCode.Value : object)DBNull.Value );
对于所有不知道这里发生了什么的人:

接线员?赋予值类型无值的能力,因此它可以=null


你能展示你用来请求数据库的C代码吗?你是否直接运行查询DB来检查它是否与你要调用它的输入组合一起工作?@PreetSangha是的,查询本身是正确的,我相信问题在于AreaCode参数,因为它是int,所以它的默认值是0,而不是null。
int? AreaCode = null;
mySqlCommand.Parameters["@AreaCode"].Value = (PModel.AreaCode.HasValue ? PModel.AreaCode.Value : object)DBNull.Value );
int n = 0;
int? n = null;

bool b = false;
bool? b = null;