在我们的数据层中,我想阻止字符串连接的使用,并让人们使用参数。
但据我所知,无法查看参数是否为连接字符串。
我没有代码示例来显示检测,因为我不知道。
var result = db.executeQuery("SELECT * FROM table WHERE id = " + id);
这是我想要摆脱的代码,要么替换为:
db.executeQuery($"SELECT * FROM table WHERE id = {id}");
或
db.executeQuery("SELECT * FROM table WHERE id = {0}", id);
编辑:
命令executeQuery
位于我们的数据层中,并将参数作为SqlParameters处理,包含类型和值。
因此,在这种情况下,将创建一个名为SqlParameter
的{{1}},类型为@id
。
关于int
:
FormattableString
关于public T ExecuteObject<T>(FormattableString sql)
{
return executeSingleRow(sql.Format, sql.GetArguments()).ToType<T>();
}
:
ExecuteQuery
答案 0 :(得分:3)
如果您的executeQuery
方法的参数只有FormattableString
,那么您应该没问题 - 没有从string
转换为FormattableString
。例如:
using System;
class Program
{
static void Main(string[] args)
{
int id = 10;
ExecuteQuery("SELECT * FROM table WHERE id = " + id);
}
static void ExecuteQuery(FormattableString query)
{
}
}
这会出错:
Test.cs(8,22):错误CS1503:参数1:无法转换为&#39; string&#39;到&#39; System.FormattableString&#39;
您只需要确保您的方法过载不接受string
。字符串连接的结果永远不是FormattableString
。事实上,我强烈建议您避免重载方法以接受FormattableString
和string
......如果您 不<,那么这样做是没有意义的/ em>要改变行为,如果 要改变行为,那可能会让人感到困惑。
我个人考虑改为在FormattableString
上使用扩展方法 - 例如:
public static SqlCommand ToCommand(
this FormattableString query,
SqlConnection connection)
{
// ...
}
通过这种方式,您可以将命令创建与执行分开...这意味着(除了其他任何事情)您可以在不自己拥有任何额外代码的情况下调用ExecuteReader
或ExecuteNonQuery
。