【问题标题】:Why we do SQLiteCommand, Parameters.add while we can use string.Format to compose sql statement?为什么我们做 SQLiteCommand,Parameters.add 而我们可以使用 string.Format 来编写 sql 语句?
【发布时间】:2013-11-16 19:40:43
【问题描述】:

我在很多教程中看到使用变量和参数组成 sql 语句。添加喜欢这个

public void updateStudent(String @studentID, String @firstName, String @lastName)
{
    SQLiteCommand command = conn.CreateCommand();
    command.CommandText = "UPDATE Students SET firstName = @firstName, lastName = @lastName WHERE studentID = @studentID";
    command.Parameters.Add(new SQLiteParameter("@studentID", @studentID));
    command.Parameters.Add(new SQLiteParameter("@firstName", @firstName));
    command.Parameters.Add(new SQLiteParameter("@lastName" , @lastName));
    command.ExecuteNonQuery();
}

我们为什么不使用

string.Format("Update Students SET firstName = '{0}', lastName = '{1}...", @firstName, @lastname)

有什么好处吗??

【问题讨论】:

    标签: c# sqlite


    【解决方案1】:

    四个原因:

    • 避免SQL injection attacks
    • 避免包含 genuine 撇号且无意引起 SQL 注入攻击的字符串出现问题(例如姓氏“O'Reilly”
    • 避免字符串不必要的转换,因为文化原因可能导致失败(例如,“1.23”和“1,23”之间的差异取决于您的文化
    • 将代码 (SQL) 和数据(参数)分开以提高可读性

    另请注意:

    • 这不是特定于 SQLite 的。这是所有个数据库的最佳实践。
    • 您不需要使用@ 作为变量的前缀,除非它们是关键字。所以写起来会更惯用:

      command.Parameters.Add(new SQLiteParameter("@lastName", lastName));
      

      (方法参数声明以...开头也是如此,但不是参数 在 SQL 语句中。)

    【讨论】:

    • 并避免字符串引用中的错误,就像 OP 在其示例中所做的那样
    • 它提供了一种简单快捷的方法来参数化查询。这会产生访问数据的防弹且简单的代码。
    • @Steve:我假设“...”将在实际查询中包含结束引号。但是,是的,点了:)
    • 任何放入参数的内容都将被视为字段数据,而不是 SQL 语句的一部分,这使您的应用程序更加安全
    • @saeed:这不是“避免 SQL 注入攻击”吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2023-03-13
    • 2019-06-27
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多