我想简单地连接到数据库。但问题出现在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
答案 0 :(得分:3)
不要在变量tablename
周围放置单引号cmd = New OleDbCommand("Select max(ID) from " & tablename, con)
否则tablename变量变为文字字符串,从数据库的角度来看,您正在请求字符串'Table1'
的MAX(ID)。
你应该绝对确定变量tablename
的值。
不允许最终用户直接输入此值(至少让他在预定义名称列表中进行选择) 这种代码非常弱,并且对Sql注入开放。
而且,正如其他答案已经概述的那样,如果一个或多个表包含空格或与保留关键字同名,则需要在表名周围放置几个Square括号
cmd = New OleDbCommand("Select max(ID) from [" & tablename & "]", con)
答案 1 :(得分:2)
更改此行
cmd = New OleDbCommand("Select max(ID) from " & tablename & "", con)
到这个
cmd = New OleDbCommand("Select max(ID) from " & tablename, con)
您错过了空格并删除了"'"
答案 2 :(得分:2)
您正在添加其他引号字符。你的初始字符串
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查询注入,此代码可能仍然容易受到攻击。