【问题标题】:Unclosed quotation mark after the character string ' ORDER BY CHECKTIME DESC '字符串'ORDER BY CHECKTIME DESC'后的非闭合引号
【发布时间】:2014-05-19 06:37:16
【问题描述】:

在我的 C# 应用程序中的一个 searchBar 文本框内导致验证时遇到了一个严重问题。

每次我运行程序并输入文本、数字甚至某些特殊字符时,我都没有遇到任何问题...但是,第二次我使用引号 (') 时,我会遇到标题中发现的错误.

以下是我在执行特定过程时使用的代码,请有人救救我:

SqlDataAdapter sda1 = new SqlDataAdapter(
     "SET ROWCOUNT 25 
     select ui.USERID [User ID], 
            ui.BADGENUMBER [Employee No.], 
            ui.NAME [Name], 
            ci.CHECKTIME [Clock Time], 
            ci.CHECKTYPE [I/O], 
            ci.SENSORID [Sensor ID] 
     FROM 
            USERINFO ui, 
            CHECKINOUT ci 
     WHERE 
            ui.USERID = ci.USERID and 
            ci.CHECKTYPE in ('I','O') and 
            ui.NAME like '%" + searchBar.Text + "%' 
     ORDER BY 
            CHECKTIME DESC ", con);

提前谢谢大家...

【问题讨论】:

  • 永远不要连接用户输入来创建 SQL。请搜索“鲍比桌”。您应该使用参数,即... ui.NAME like '%' + @name + '%' ORDER BY ...,其中@name 是从searchBar.Text 获得值的参数。如果您的大部分数据访问看起来像这样,那么您需要立即停止并重新访问您的整个数据访问层:它已经很危险地损坏了。
  • @mrBrown 如果您不这样使用,因为可能存在 SQL 注入的机会。
  • @DhavalPatel 我会说这是肯定的;p
  • 我正在研究参数,我还在学习如何创建和使用干净的代码,所以感谢您的批评和建议。

标签: c# sql sql-server database visual-studio


【解决方案1】:

您必须在 SQL 中转义 ' - ''。下面是一个示例,说明如何使用参数执行此操作。

string SQL = "SET ROWCOUNT 25 select ui.USERID [User ID], ui.BADGENUMBER [Employee No.], ui.NAME [Name], ci.CHECKTIME [Clock Time], ci.CHECKTYPE [I/O], ci.SENSORID [Sensor ID] FROM USERINFO ui, CHECKINOUT ci WHERE ui.USERID = ci.USERID and ci.CHECKTYPE in ('I','O') and ui.NAME like @SearchText ORDER BY CHECKTIME DESC ";
SqlCommand cmd = new SqlCommand(SQL, con);
cmd.Parameters.Add("@SearchText", SqlDbType.VarChar).Value = "%" + searchBar.Text + "%";

SqlDataAdapter sda1 = new SqlDataAdapter(cmd);

这将参数化您的查询并转义搜索文本中的任何单引号。

【讨论】:

  • 上帝保佑你先生,绝对的救星!
  • 我现在正在学习参数,因为我需要在我的许多表单中实现这种使用干净代码搜索数据库的方法。
  • 如果您使用参数,则执行searchBar.Text.Replace("'", "''") 位是不正确 - 它应该只是 .Value = "%" + searchBar.Text + "%";
  • @MarcGravell - 我不知道。我更正了答案。谢谢。 :)
【解决方案2】:

您不能使用 ' 不幸的是,当您运行查询时,SQL 会将字符串中的单引号解释为表示该字符串的结尾。

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2017-12-19
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2014-08-25
    相关资源
    最近更新 更多