【问题标题】:What is wrong with this VB/SQL query这个 VB/SQL 查询有什么问题
【发布时间】:2015-08-08 08:45:15
【问题描述】:

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

{"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()

【问题讨论】:

  • 这里去掉前导单引号:'" & DeviceType
  • @jarlh 他可能应该添加一个尾随单引号来关闭第一个引号,因为 DeviceType 可能是一个字符串。
  • DeviceType 之后添加一个单引号,如下所示:"','" & DeviceType & "');" 或者使用参数查询,不要理会带引号的字符串值。
  • What is wrong... 您正在连接 SQL 而不是使用参数。使用参数不会发生额外/缺失的滴答声(以及其他更具破坏性的事情)。
  • 有人说小鲍比桌吗?

标签: sql vb.net ms-access vba


【解决方案1】:

您在末尾缺少一个单引号来关闭 DeviceType 之前的单引号:

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

添加它,它应该可以解决您的问题:

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

无论如何,您目前拥有的东西很容易受到 SQL 注入的攻击,parameterizing 您的查询确实是您应该解决此问题的方法。

【讨论】:

  • 谢谢你的眼睛先生。我一吃完午饭就接受你的回答,因为要等 4 分钟。
  • 你能指导我更多关于参数化的文档吗?我正在努力更好地了解他们实际上为我做了什么。
【解决方案2】:

您在查询中的最后一个字段缺少尾随单引号,但仅添加引号确实是解决此问题的错误方法。你应该这样做:

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. 它会自动处理可能包含撇号的品牌、型号和位置等字段的数据。
  3. 它修复了查询格式日期的问题。例如,您可以将 VB.Net DateTime 对象直接分配给 PurchDate 查询参数,而无需关心格式。
  4. 填补了现有代码中的一个巨大安全漏洞

【讨论】:

  • 我一定会研究这个以备将来使用。这里的一件好事是这一切都将是本地的,并且只能从它正在进行的网络内部访问。如果你有时间,我们可以在这里建立一个聊天。如果你不能说我不是最有经验的编码员,我也不能 100% 确定上述代码中发生了什么。
  • 答案基于 ADO.Net 的功能msdn.microsoft.com/en-us/library/aa286484.aspx 当您在代码中使用动态 SQL 时,您使用的是 ADO.Net 的子集。
  • 好的,所以我继续通过我的项目备份运行它,看看它是如何工作的,我让它正确输入数据,但我仍然不明白它到底对我做了什么。另一方面,我确实看到了我最初拥有它的方式的主要漏洞。如果可能的话,我想要一个解释,或者一个链接,说明这究竟是如何解决问题的,比如小圆桌示例。
猜你喜欢
  • 2011-01-15
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
相关资源
最近更新 更多