首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法检测是否使用了字符串连接?

是否有方法检测是否使用了字符串连接?
EN

Stack Overflow用户
提问于 2016-08-10 07:07:03
回答 1查看 269关注 0票数 1

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

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

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

代码语言:javascript
复制
var result = db.executeQuery("SELECT * FROM table WHERE id = " + id);

这是我想要删除的代码,或者用如下所示的代码替换:

代码语言:javascript
复制
db.executeQuery($"SELECT * FROM table WHERE id = {id}");

代码语言:javascript
复制
db.executeQuery("SELECT * FROM table WHERE id = {0}", id);

编辑:

命令executeQuery位于我们的数据层中,它以SqlParameters的形式处理参数,其中包含类型和值。

因此,在本例中,将创建一个名为SqlParameter@id,其类型为int

关于FormattableString

代码语言:javascript
复制
public T ExecuteObject<T>(FormattableString sql)
{
    return executeSingleRow(sql.Format, sql.GetArguments()).ToType<T>();
}

关于ExecuteQuery

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-10 07:18:39

如果您的executeQuery方法只有一个参数为FormattableString,那么您应该已经很好了--没有从stringFormattableString的转换。例如:

代码语言:javascript
复制
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上使用扩展方法--比如:

代码语言:javascript
复制
public static SqlCommand ToCommand(
    this FormattableString query,
    SqlConnection connection)
{
    // ...
}

这样你就可以把命令创建和执行分开.这意味着(除了其他任何东西),您可以调用ExecuteReaderExecuteNonQuery,而无需自己编写任何额外的代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38866443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档