在我们的数据层中,我希望阻止使用字符串连接,并让人们使用参数。
但据我所知,无法查看参数是否为级联字符串。
我没有显示检测的代码示例,因为我不知道。
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的@id,其类型为int。
关于FormattableString
public T ExecuteObject<T>(FormattableString sql)
{
return executeSingleRow(sql.Format, sql.GetArguments()).ToType<T>();
}关于ExecuteQuery
public int executeNonQuery(string sql, params object[] parameters)
{
var traceI = Traceadd(sql, parameters);
if (!open())
throw new Exception("Error executing query!", lastException);
try
{
command = Connection.CreateCommand();
command.CommandText = sql;
sql.SQLFormat(ref command, parameters);
var res = command.ExecuteNonQuery();
command.Parameters.Clear();
if (traceI != null)
traceI.Stop();
return res;
}
catch (Exception ex)
{
if (traceI != null)
traceI.Stop();
throw new DBException(command.CommandText, command.Parameters, ex);
}
}发布于 2016-08-10 07:18:39
如果您的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:无法从“字符串”转换为“System.FormattableString”
您只需确保不存在接受string的方法的过载。字符串连接的结果绝不是FormattableString。实际上,我强烈建议您避免重载接受FormattableString和string的方法.如果你不打算改变行为,如果你要改变行为,那是没有意义的。
不过,我个人会考虑在FormattableString上使用扩展方法--比如:
public static SqlCommand ToCommand(
this FormattableString query,
SqlConnection connection)
{
// ...
}这样你就可以把命令创建和执行分开.这意味着(除了其他任何东西),您可以调用ExecuteReader或ExecuteNonQuery,而无需自己编写任何额外的代码。
https://stackoverflow.com/questions/38866443
复制相似问题