gpt4 book ai didi

c# - SQL 和 C# 中的多个条件参数

转载 作者:行者123 更新时间:2023-11-30 18:53:35 27 4
gpt4 key购买 nike

考虑以下具有 2 个可选变量的函数

public List<T> SelectSqlItems<T>(
string settingsgroup = null,
int? state = null)
{
SqlCommand selectCommand = null;

if (settingsgroup == null)
{
selectCommand = new SqlCommand(
"select * from ApplicationSettings ", con);
}
else
{
selectCommand = new SqlCommand(
string.Format(
"select * from ApplicationSettings where settingsgroup='{0}' ",
settingsgroup),
con);
}

if (state != null)
{
selectCommand.CommandText +=
!selectCommand
.CommandText
.ToLower()
.Contains("where")
? string.Format("where state={0}", state)
: string.Format("and state={0}", state);
}

//etc..
}

我有 4 种可能性:

settingsgroup==null && state==null
settingsgroup==null && state!=null
settingsgroup!=null && state==null
settingsgroup!=null && state!=null

必须从上面的每个案例中生成不同的 SQL 命令。 C# 中有哪些内置功能可以帮助我在没有大量条件语句的情况下实现这些目标,如果您要编写上述内容,除了必须重载函数 4 次之外,您会如何编写?

最佳答案

这是 SQL 中的一个常见问题,可以在查询本身中得到有效处理,从而允许提前创建查询、使用参数并通过存储过程访问查询。

参数的使用是一项重要的建议,不应将其视为可选的。 SQL 参数将有助于防止 SQL 注入(inject)攻击。例如,假设有人使用以下参数值调用您的方法:

SelectSqlItems<T>("' OR settingsgroup <> '", null);

您的查询现在将变为:

select * from ApplicationSettings where settingsgroup='' OR settingsgroup<>'' 

这当然会返回表中的所有行,并可能暴露私有(private)信息。然而,更糟糕的可能性存在,例如插入一个 DELETE 子句,它可能会删除你的整个表,甚至删除你的整个数据库(尽管希望你的用户权限被配置为至少防止这些最坏的情况).

为防止这种情况,您的 SelectSqlItems 方法可以重述如下:

public List<T> SelectSqlItems<T>(
string settingsgroup = null,
int? state = null)
{
var cmdText = "..."; // See Query Below
var selectCommand = new SqlCommand(cmdText, con);

// Set the values of the parameters
selectCommand.Parameters.AddWithValue("@settingsgroup", settingsgroup);
selectCommand.Parameters.AddWithValue("@state", state);

// etc...
}

您的查询现在可以表述如下:

SELECT
*
FROM
ApplicationSettings
WHERE
((@settingsgroup IS NULL) OR (settingsgroup=@settingsgroup))
AND
((@state IS NULL) OR (state=@state))

如果参数值为 null,则由 OR 连接的条件语句左侧的值将始终为 TRUE,因此将匹配所有行。但是,如果参数值不是 NULL,则条件左侧的值为 FALSE,右侧将被检查。如果行的值与参数值匹配,则右侧只有值 TRUE,因此只会返回与参数值匹配的行。可以根据需要使用尽可能多的参数重复这个概念。

关于c# - SQL 和 C# 中的多个条件参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20576801/

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