在我们的数据层中,我想阻止使用字符串连接,而是让人们使用参数。
但是据我所知,没有办法查看参数是否为串联字符串。
我不知道要检测的代码示例。
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);
}
}
最佳答案
如果您的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
而不用自己编写任何额外的代码。