在我们的数据层中,我想阻止使用字符串连接,而是让人们使用参数。

但是据我所知,没有办法查看参数是否为串联字符串。

我不知道要检测的代码示例。

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的名为@idint

关于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,那么您应该已经可以了-从stringFormattableString不会进行转换。例如:

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。确实,我强烈建议您避免避免重载接受FormattableStringstring的方法...如果您不打算更改行为,并且如果要更改密码,则这样做是没有意义的。行为,那可能真是令人困惑。

我个人将考虑更改为在FormattableString上使用扩展方法-类似于:

public static SqlCommand ToCommand(
    this FormattableString query,
    SqlConnection connection)
{
    // ...
}


这样,您就可以将命令创建与执行分开……这意味着(除其他以外)然后您可以调用ExecuteReaderExecuteNonQuery而不用自己编写任何额外的代码。

07-24 12:36