【问题标题】:Problems with saving data with single quote ' in the query [duplicate]在查询中使用单引号 ' 保存数据的问题 [重复]
【发布时间】:2014-06-13 18:51:37
【问题描述】:

我有一个 asp.net 项目,在其中保存数据时出现错误。我有一个学校名称文本框,大多数学校名称都会保存,但如果我有一个像 St.Xavier's 这样的学校名称,它会创建一个在执行插入查询期间出现问题。这是由于文本中存在单引号而发生的。因此,我得到的最终查询是:

Insert Into tblSchool(SchoolName, CreatedBy, CreatedOn) 
values('St.Xavier's',1,'2014-6-13     13:14:16')

如何在文本中使用单引号保存数据?我正在使用 Microsoft SQL Server 2005。

【问题讨论】:

  • 改用参数化查询。以后你会是一个快乐的人。
  • 2014年了,怎么还有人用串联创建SQL?接触数据时,“使用参数”不就是“0、1、2、3、4课”吗?
  • 以后,请提供导致问题的代码。我已经猜测您的代码是什么样的,但我不应该这样做。

标签: c# asp.net sql sql-server


【解决方案1】:

您尚未展示您的代码,但我强烈怀疑您有如下代码:

// Bad code!
String sql = "Insert Into tblSchool(SchoolName, CreatedBy, CreatedOn) "
           + "values('" + name + "'," + creator + ",'" + date +"')";

不要那样做。它很难阅读,在转换方面容易出错,并且容易受到SQL Injection attacks的攻击。

相反,您应该使用参数化 SQL。比如:

String sql = "Insert Into tblSchool(SchoolName, CreatedBy, CreatedOn) "
           + "values(@Name, @CreatedBy, @CreatedOn)";
using (var command = new SqlCommand(sql, connection))
{
    command.Parameters.Add("@Name", SqlDbType.VarChar).Value = name;
    command.Parameters.Add("@CreatedBy", SqlDbType.Int).Value = creator;
    command.Parameters.Add("@CreatedOn", SqlDbType.DateTime).Value = date;

    int results = command.ExecuteNonQuery();
    ...
}

有关详细信息,请参阅SqlCommand.Parameters 文档。

【讨论】:

  • 对于真正 懒惰 务实的人来说,“dapper” 就是这样:connection.Execute("Insert Into tblSchool(SchoolName, CreatedBy, CreatedOn) values (@name, @creator, @date)", new { name, creator, date });
【解决方案2】:

您需要在您的SqlCommand 中使用bind parameters。其他任何事情都注定会失败。

【讨论】:

    【解决方案3】:

    您需要用另一个 ' 引用 '。即:

    values('St.Xavier''s',1,'2014-6-13     13:14:16')
    

    【讨论】:

    • 虽然这可能会奏效,但它会导致 OP 走上手动转义的黑暗道路。参数化 SQL 是一个远远更好的解决方案。
    • 这可能会导致操作陷入黑暗,但他正试图找到一个直接的解决方案,因此我认为这个答案是准确和有效的。
    • @Ratna:所以你会很高兴 OP 继续使用容易受到 SQL 注入攻击的代码,并且天知道还有什么其他问题?这个答案甚至没有提到直接在 SQL 中包含值是一个坏主意。有时,现有的路径实在太糟糕了,你应该回头而不是稍微转移一下,这只会让你成功地把你扔下悬崖。
    猜你喜欢
    • 2021-01-16
    • 2011-05-26
    • 2020-07-03
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多