gpt4 book ai didi

c# - Command.Parameters ["@name"].Value 语法正确

转载 作者:行者123 更新时间:2023-11-30 23:01:36 24 4
gpt4 key购买 nike

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

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

此查询允许用户搜索一个、两个、三个或没有字段而不会抛出任何错误,但它仅适用于可为 null 的类型。因此,由于 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 是一个有效的查询。

我尝试通过声明 int 使 AreaCode 可以为 null? 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);

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

最佳答案

好的,我开始工作了。主要问题是这需要将 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;

关于c# - Command.Parameters ["@name"].Value 语法正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23729067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com