这个VB / SQL查询有什么问题

时间:2015-05-26 15:17:38

标签: sql vb.net vba access-vba

这是我在调试时收到的错误。

{"Syntax error in string in query expression ''Laptop);'."}

这是我的SQL语句无法正常工作。无论我做什么,它似乎都是随机添加的。在声明的最后,我不知道为什么会这样做。

Sql = "INSERT INTO Devices ( [Asset Number], [Service Tag], Manufacturer, ModelName, Location, Room, Cart, [Purchase Date], Department, [Device Type] ) VALUES('" & AssetNum & "','" & ServTag & "','" & Manu & "','" & Model & "','" & Location & "','" & Room & "','" & Cart & "','" & PurchDate & "','" & Department & "','" & DeviceType & ");"

这是我所做的声明很好的声明。它只是一个长字符串值。我需要上述变量才能工作的原因是因为它们与文本框相关联,因此用户可以输入数据。

Sql = "INSERT INTO Devices ( [Asset Number], [Service Tag], Manufacturer, ModelName, Location, Room, Cart, [Purchase Date], Department, [Device Type] )VALUES (10, 1234, 'Dell', 'Latitude E6410', 'John McIntire', 100, 0, '5/17/2015', 'Technology', 'Laptop');"

所以是的,基本上我被卡住了,无法弄清楚为什么第一个查询不起作用。我现在已经坚持了一段时间,并且真的可以使用一些帮助。

这就是我执行查询的方式。

cmd = New OleDb.OleDbCommand(Sql)
        cmd.Connection = dbConn
        cmd.ExecuteNonQuery()

2 个答案:

答案 0 :(得分:4)

您在结尾处缺少单引号以关闭DeviceType之前的那个:

"','" & DeviceType & ");"

添加它并解决您的问题:

"','" & DeviceType & "');"

无论如何,您目前所拥有的内容很容易受到SQL注入的攻击,而parameterizing您的查询实际上是您应该采取的解决方法。

答案 1 :(得分:3)

您错过了查询中最后一个字段的尾随单引号,但只是添加引号实际上是错误解决此问题的方法。你应该这样做:

Sql = "INSERT INTO Devices (" &
         "[Asset Number], [Service Tag], Manufacturer, ModelName, Location, Room, Cart, [Purchase Date], Department, [Device Type]" &
         ") VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"

Using cmd AS New OleDb.OleDbCommand(Sql, dbConn)
    'Have to guess at column types/lengths here. Use actual types/lengths from your DB
    cmd.Parameters.Add("@AssetNum", OleDbType.VarChar, 10).Value = AssetNum
    cmd.Parameters.Add("@ServTag", OleDbType.VarChar, 10).Value = ServTag
    cmd.Parameters.Add("@Manu", OleDbType.VarWChar, 20).Value = Manu
    cmd.Parameters.Add("@Model", OleDbType.VarWChar, 30).Value = Model
    cmd.Parameters.Add("@Location", OleDbType.VarWChar, 50).Value = Location
    cmd.Parameters.Add("@Room", OleDbType.Integer).Value = Room
    cmd.Parameters.Add("@Cart", OleDbType.Integer).Value = Cart
    cmd.Parameters.Add("@PurchDate", OleDbType.Date).Value = PurchDate
    cmd.Parameters.Add("@Department", OleDbType.VarWChar, 20).Value = Department
    cmd.Parameters.Add("@DeviceType", OleDbType.VarChar, 20).Value = DeviceType

     cmd.ExecuteNonQuery()
End Using

这对你有四件事:

  1. 它不仅修复了此问题的引用问题,而且还可以更轻松地为将来编写的所有查询获取引号。
  2. 它会自动处理Make,Model和Location等字段的数据,这些字段可能包含撇号。
  3. 它修复了查询格式化日期的问题。例如,您可以将VB.Net DateTime对象直接分配给该PurchDate查询参数,而无需关心格式。
  4. 在现有代码中关闭了一个巨大的安全漏洞