【问题标题】:Getting a syntax error (missing operator) in query expression in C#在 C# 中的查询表达式中出现语法错误(缺少运算符)
【发布时间】:2015-12-15 11:03:44
【问题描述】:

我正在编写代码并得到一个我不知道从哪里来的语法错误。这是我正在使用的代码:

string u = "select uniqcode from login where users='" + textBoxX1.Text + "' ";

这是我得到的错误:

"查询表达式 ''select uniqcode 中的语法错误(缺少运算符) 来自用户='someuser'''的登录名。” (System.Data.OleDb.OleDbException)A System.Data.OleDb.OleDbException 被抛出:“查询表达式中的语法错误(缺少运算符) ''select uniqcode from login where users='someuser' ''."

【问题讨论】:

  • 你应该绑定参数而不是连接 SQL 字符串,因为用户可以在文本框中写入诸如 '; DROP TABLE ... ;-- 之类的东西
  • 为什么列users是复数形式?您是否存储多个用户逗号分隔??
  • 什么意思?!你能详细说明一下吗?!
  • SQL 参数(OLEDB):msdn.microsoft.com/en-us/library/…
  • @AfshinHaghighat 你试过u = "select uniqcode from login where users=?";然后u.Parameters.Add("@users", OleDbType.VarChar).value = textBoxX1.Text;

标签: c# sql


【解决方案1】:

文本框文本可能包含单引号 (')。如果是,则将单引号 (') 替换为两个单引号 ('')

否则,尝试使用sql参数执行。

【讨论】:

  • 不,文本框的值不包含任何引号,您可以从 OP 的描述中看到:select uniqcode from login where users='someuser' 。引号是查询的一部分......我认为这应该是一个评论而不是一个答案,因为它不会帮助 OP。你告诉他使用 SQL 参数;然后展示一个简短的例子,因为他显然不知道如何使用它们。
【解决方案2】:
string u = "select login.uniqcode from [login] where users='" + textBoxX1.Text.Trim() + "'";

【讨论】:

  • 还是同样的错误{"Syntax error (missing operator) in query expression ''select login.uniqcode from [login] where users='someuser'''."}
  • @AfshinHaghighat 如果您发布完整的代码,那么很容易找出问题所在..
【解决方案3】:

由于您的错误表明您正在使用OleDb 连接,因此您可以使用以下代码。这也将避免SQL Injection。但是,您可能需要做一些工作才能在您的代码中添加以下内容。

u = "select uniqcode from login where users=?"; 

u.Parameters.Add("@users", OleDbType.VarChar).value = textBoxX1.Text;

您可能会看到示例 herehere

【讨论】:

  • 错误 1 ​​'string' 不包含 'Parameters' 的定义,并且找不到接受第一个类型为 'string' 的参数的扩展方法 'Parameters'
  • @AfshinHaghighat 当然不行。我还写了它,您需要对我的代码进行一些工作.. 以及 cmets 部分.. 我要求您显示更多代码以便我们提供帮助.. 您能在这一行周围显示更多代码吗?跨度>
【解决方案4】:

您需要先read and understand OleDB 中存在 SQL 语法限制。

“一个单引号必须用另一个单引号转义。”

但真的,忘记单引号。

阅读有关使用 OleDB 的更多信息here。无论如何,这是一项古老的技术,所以我会离开 OleDB,将您的数据库移植到 SQL Server 或 MySQL。

但是,您可能需要这样的东西......

try
{
    connw.Open();
    OleDbCommand command;
    command = new OleDbCommand(
        "SELECT *" +
        "FROM tableA WHERE Deliveries.EmployeeID = ?, Deliveries.FIN = ?, Deliveries.TodaysOrders = ? , connw);
    command.Parameters.Add(new OleDbParameter("@EMPID", Convert.ToDecimal(empsplitIt[1])));
    command.Parameters.Add(new OleDbParameter("@FIN", truckSplit[1].ToString()));
    command.Parameters.Add(new OleDbParameter("@TodaysOrder", "R"));
    catchReturnedRows = command.ExecuteNonQuery();//Commit   
    connw.Close();

}
catch (OleDbException exception)
{
    MessageBox.Show(exception.Message, "OleDb Exception");
}

数据库编码的黄金法则是永远不要像上面那样将变量直接传递到 SQL 语句中。这为 SQL 注入打开了大门。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2018-09-02
    • 2018-01-29
    • 2012-11-14
    相关资源
    最近更新 更多