有没有办法检测是否已使用字符串连接?

时间:2016-08-10 07:07:03

标签: c#

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

但据我所知,无法查看参数是否为连接字符串。

我没有代码示例来显示检测,因为我不知道。

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

1 个答案:

答案 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。事实上,我强烈建议您避免重载方法以接受FormattableStringstring ......如果您 不<,那么这样做是没有意义的/ em>要改变行为,如果 要改变行为,那可能会让人感到困惑。

我个人考虑改为在FormattableString上使用扩展方法 - 例如:

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

通过这种方式,您可以将命令创建与执行分开...这意味着(除了其他任何事情)您可以在不自己拥有任何额外代码的情况下调用ExecuteReaderExecuteNonQuery