【问题标题】:Update SQL table from VB multiple where condition从 VB 多个 where 条件更新 SQL 表
【发布时间】:2018-07-13 03:24:54
【问题描述】:

我正在尝试从 VBA(使用以下代码)更新 SQL 表,但似乎无法正确。我想根据 A、B、C、D、E 的搜索条件更新第一、二、三和四列。我在这里做错了什么?没有给出错误,但表只是没有更新?谢谢

Sub UpdateData(A As String, B As String, C As String, D As String, E As String, one As Double, two As Double, three As Double, four As Double)

Dim sA As String, sB As String, sC As String, sD As String, sDesk As String, sE As String
Dim sone As Double, stwo As Double, sthree As Double, sfour As Double

Dim objConn As ADODB.Connection
Set objConn = New ADODB.Connection
objConn.ConnectionString = "Provider=SQLOLEDB;Data Source=source;Initial Catalog=Model_table;Integrated Security=SSPI"
objConn.Open
Set objRec = New ADODB.Recordset


Date = Format(Range("date").Value, "YYYY-MM-DD")
sA = A
sB = B
sC = C
sD = D
sE = E
sone = one
stwo = two
sthree = three
sfour = four
     StrSQL = "UPDATE pnl_results SET (" & sone & "," & stwo & "," & sthree & "," & sfour & ") Where  ('" & date =  sDate & "', '" & AA= sA & _
              "','" & BB= sB & "','" CC= & sC & "','" & DD= sD & "','" & EE=sE & ")"
     Set objRec = objConn.Execute(StrSQL)

objConn.Close
Set objConn = Nothing

End Sub

【问题讨论】:

  • 这里的一个大问题是这个查询对sql注入很开放。首先,您应该考虑对此进行参数化。
  • 我同意参数化它会更好,但如果编码器控制所有变量,则确实没有必要。
  • @braX 缺乏经验的程序员正是需要学习如何使用参数的人。如果有一些教学正在进行,学习并不是那么难。除了以正确的方式去做之外的任何事情都是对危险代码感到满意的标志。这是不可接受的。如果您知道如何使用参数并且不教人们如何保护自己,那么您就是在伤害他们。
  • 此外,鉴于你们所有人对实际问题的回答如此严格,这个问题是关于 SQL 语法的。告诉人们使用参数实际上并不能回答问题。
  • @braX meh.. cmets(甚至聊天)不适合这个......这是一个很好的讨论我希望我们都可以喝啤酒!干杯!

标签: sql vba sql-update


【解决方案1】:

您混淆了Update 和Insert Into 之间的语法。它应该看起来更像这样:

StrSQL = "UPDATE pnl_results SET field1='value1', field2='value2' WHERE field3='value3' AND field4='value4'

【讨论】:

    【解决方案2】:

    您的代码中有几个错误:

    • 您不需要括号。
    • 将列名直接放在字符串中,不要用撇号括起来。
    • 用撇号将所有字符串值括起来。
    • 使用AND 或OR 运算符来组合不同的条件,而不是逗号。

    试试这个:

    StrSQL = "UPDATE pnl_results SET " & _
             " one = '" & sone & _
             "', two = '" & stwo & _
             "', three = '" & sthree & _
             "', four = '" & sfour & _
             "' Where date = '" & sDate & _
             "' AND AA = '" & sA & _
             "' AND BB = '" & sB & _
             "' AND CC = '" & sC & _
             "' AND DD = '" & sD & _
             "' AND EE = '" & sE & "'"
    

    如 cmets 中所述,使用直接来自用户输入的值的内联查询会使您的代码容易受到 SQL 注入攻击。在查询中使用之前验证用户输入,或者更好地使用参数化查询。

    【讨论】:

    • 验证/清理用户输入归结为“自己动手”,我强烈建议不要这样做。参数化,周期。 =)
    • @Mat'sMug 一般来说,是的,但并非总是如此。在某些情况下,输入验证就足够了,在极少数情况下,参数化查询是不可能的。在所有情况下,即使使用参数化查询,仍然强烈建议进行输入验证。
    • 根据“验证”的含义,我绝对同意。如果这意味着转义单引号和剥离 SQL 关键字,那么... big fat "nope" ;-)
    • 没有。输入验证是个笑话。参数使用起来非常简单。我不明白为什么这么多人掉进了输入验证的陷阱。
    • @SeanLange 限制评论框的最大长度,然后,好吧,这就是你所能做的;将内容发送到 nvarchar 参数并收工!至于 db-vs-app 验证/约束,这是有争议的:作为开发人员,我喜欢仅执行 PK、FK 和 NK 的“哑 db”,并将“业务规则”等留在客户端/应用程序等级。但是有 DBA 背景的人可能不同意。这是一场永恒的辩论;-)
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 2022-01-19
    • 2013-07-09
    • 2012-12-11
    • 2020-06-11
    • 1970-01-01
    • 2012-02-23
    • 2014-05-17
    相关资源
    最近更新 更多