【问题标题】:Syntax error in query. Incomplete query clause in Max statement inside a function查询中的语法错误。函数内Max语句中的查询子句不完整
【发布时间】:2014-05-11 22:03:09
【问题描述】:

我正在尝试简单地连接到数据库。但是问题出现在 Sql 查询的串联部分。

当我这样做时:

 cmd = New OleDbCommand("Select max(ID) from Table1", con)

没有错误,但是当我这样做时

 cmd = New OleDbCommand("Select max(ID) from'" & tablename & "'", con)

vb.net 出现错误:查询语法错误。查询子句不完整。

这是完整的代码

Function Get_Max(ByVal Get_Table_Name As String)
    Dim tablename As String = Get_Table_Name
    Dim found_max As Integer
    Call connect()
    con.Open()
    cmd = New OleDbCommand("Select max(ID) from'" & tablename & "'", con)
    dr = cmd.ExecuteReader
    While dr.Read
        found_max = dr(0)
    End While
    con.Close()
    MsgBox(found_max)

    Return found_max

End Function

【问题讨论】:

  • 当我调试变量表名时,里面有字符串“Table1”,但连接肯定有问题
  • 连接时不要引用表名,如果必须,请在表名周围使用方括号。 Max(ID) 非常不安全。
  • 我只是在学习。在此之后,我将切换到 Paramatized 并重试。谢谢大家
  • 好吧,好意,但您不能参数化表或字段的名称

标签: sql vb.net concatenation comma


【解决方案1】:

不要在变量表名两边加上单引号

cmd = New OleDbCommand("Select max(ID) from " & tablename, con)

否则,tablename 变量将变为文字字符串,并且从数据库的角度来看,您正在请求字符串 'Table1' 的 MAX(ID)。

您应该绝对确定变量tablename 的值。

不允许最终用户直接键入此值(至少让他在预定义名称列表中进行选择)。
这种代码很弱,对 Sql Injections 开放。

而且,正如其他答案已经概述的那样,如果您的一个或多个表格包含空格或与保留关键字具有相同的名称,则需要在表格名称周围加上几个方括号

cmd = New OleDbCommand("Select max(ID) from [" & tablename & "]", con)

【讨论】:

  • 我需要知道的关于在哪里学习所有这些逗号和连接的任何资源
  • 只是任何 SQL 方言的基本规则 - 你可以try this,但它非常基本
  • 史蒂夫,我已经说过两次了,但我真的必须再说一遍。 Max(ID) 极其不安全,不应用于获取最后一个 ID。
  • @Remou 也适用于单线程、单用户?不是为了反驳你的论点(我同意你的观点),只是为了了解你的观点。
  • @Steve,通常不针对单个用户,虽然可以在单个 pc 上创建问题,但是在使用 vb,net 时可能是单个用户吗?另外如果是单用户,sql注入也不是问题:)
【解决方案2】:

改变这一行

cmd = New OleDbCommand("Select max(ID) from " & tablename & "", con)

到这里

cmd = New OleDbCommand("Select max(ID) from " & tablename, con)

你只是错过了一个空格并删除了“'”

【讨论】:

  • 感谢您的快速响应,但尚未解决
【解决方案3】:

您正在添加额外的引号字符。你的初始字符串

cmd = New OleDbCommand("Select max(ID) from'" & tablename & "'", con)

正在评估

cmd = New OleDbCommand("Select max(ID) from'Table1'", con)

相反,您可能应该使用:

cmd = New OleDbCommand("Select max(ID) from [" & tablename & "]", con)

[] 为您提供额外的保护,防止与表名匹配的保留字,虽然不是 SQL 查询注入,但此代码可能仍然容易受到攻击。

【讨论】:

  • 您可能需要方括号。 Max(ID) 几乎总是一个非常糟糕的主意。
  • @Remou 我同意;我自己总是使用identity_insert
  • 这在 MS Access 中不起作用,但 @@identity 会。
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多