【问题标题】:SQL table update works, but only took value from one rowSQL 表更新有效,但仅从一行中获取值
【发布时间】:2021-08-05 06:29:13
【问题描述】:

我正在创建一个自动文件以在单击按钮时更新 CurrencyTable (dB) 中的货币汇率。我参考了this post 中的示例。 我的Excel数据如下:

CsName    Rate
AUD       1.23
BHD       2.23
BND       3.23
EUR       4.23
IDR       5.23
INR       6.23
MYR       7.23
OMR       8.23
SGD       9.23
THB       10.23
USD       11.23

代码似乎工作正常,但它没有根据 Excel 数据进行更新,相反,它只取了所有内容的第 4 行值。 Here are the updated result.

以下是我的代码:

Sub UpdateCR()

Dim con As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim i As Long
Dim vDB As Variant
Dim Ws As Worksheet

con.ConnectionString = "Provider=SQLOLEDB.1;Password=1234;Persist Security Info=False;User ID=Guest;Initial Catalog=ABC;Data Source=XYZ"
con.Open

Set cmd.ActiveConnection = con
Set Ws = ActiveSheet

vDB = Ws.Range("a1").CurrentRegion

For i = 2 To UBound(vDB, 1)
    cmd.CommandText = "UPDATE CurrencyTable SET Rate='" & vDB(i, 2) & "' WHERE CsName ='" & vDB(i, 1) & "' "
    cmd.Execute
Next i

con.Close


MsgBox "Exchange rates successfully updated"

Set con = Nothing

End Sub

有人知道为什么会这样吗?和UBound函数有关系吗?

对此的任何帮助将不胜感激!

【问题讨论】:

  • 你能像源代码一样显示结果吗,我无法访问工作中的图像。
  • 嗨,第一个 vDB 是 vDB(i, 2) >> vDB(i, 2).value 的范围。和 rate 通常是 number (doable, single ) 并且你更新 string ?所以 ( ...SET Rate=" & vDB(i, 2) & " WHERE......)
  • 您好@Nathan_Sav,Rate 列中的所有值都已更新为 4.23 作为第 4 行中的值。
  • 嗨@xshen,我尝试使用 F8 进行检查,并且每行的值看起来都不错,直到行尾。但是一旦执行,更新的值就出错了。
  • 我没有看到代码有任何问题,您可以在 cmd.Execute Cells(i,3) = "your update string" 之后再添加一行,看看它会打印什么

标签: sql excel vba


【解决方案1】:

您要更新的表中的所有 CSName 是否正确?它们是否都从其他东西设置为欧元,也许编码这个。可能听起来很明显,但以防万一:)

【讨论】:

  • 1) 货币主表的前4行(Currency, Country, Rates);从 AUD-EUR 已从应用程序中删除 - 因此仅更新前 4 个。 2) 手动更正主页前 4 行的 CsName 字段解决了问题,并且宏工作正常。
【解决方案2】:

首先这不是答案,我在这里发帖解释 排除故障,因为 cmets 无济于事。

我所说的是打印另一列中正在执行的字符串。 例如: 试试这个后,能否请您显示第 3 列中的图像?

    Sub UpdateCR()

    Dim con As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim i As Long
    Dim vDB As Variant
    Dim Ws As Worksheet
    
    con.ConnectionString = "Provider=SQLOLEDB.1;Password=1234;Persist Security Info=False;User ID=Guest;Initial Catalog=ABC;Data Source=XYZ"
    con.Open
    
    Set cmd.ActiveConnection = con
    Set Ws = ActiveSheet
    
    vDB = Ws.Range("a1").CurrentRegion
    
    For i = 2 To UBound(vDB, 1)
        cmd.CommandText = "UPDATE CurrencyTable SET Rate='" & vDB(i, 2) & "' WHERE CsName ='" & vDB(i, 1) & "' "
        cmd.Execute
        Cells(i, 3) = "UPDATE CurrencyTable SET Rate='" & vDB(i, 2) & "' WHERE CsName ='" & vDB(i, 1) & "' "
    Next i
    
    con.Close
    
    
    MsgBox "Exchange rates successfully updated"
    
    Set con = Nothing

End Sub

对我来说,结果如下所示,你也一样吗?

【讨论】:

  • 操作,抱歉,我把你的建议弄错了!哈哈。 =D 但是,是的,我的结果与您上表中的结果相同。但是当我检查更新的表格时,它仍然需要在第 4 行之后。
  • 好的,在每次循环执行后,检查表中的值是否发生变化。例如,直到您到达 EUR 线,前 3 的值是否与 4.23 相同?
  • 对不起,我不确定如何测试它。我尝试将第 4 行的值更改为其他数字,但仍然相同。顺便说一句,我试图复制列 C 中的打印字符串并在 SQL 中运行,这就是我得到的。我看起来有点奇怪,但它在某种程度上与我面临的问题有关。 (0 行受影响)(0 行受影响)(0 行受影响)(11 行受影响)在第 4 行显示所有 11 行受影响(0 行受影响)(0 行受影响)( 0 行受影响)(0 行受影响)(0 行受影响)(0 行受影响)(0 行受影响)
  • 哇,这很有趣,您能否按原样发布第四条语句,因为我怀疑查询中的某些内容
  • 我也是这么想的! UPDATE CurrencyTable SET Rate='4.23' WHERE CsName='EUR'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多