0

首先,我了解让用户通过 excel 更新数据库的过程存在很多风险,我感谢任何反对这种方法的建议,但让我们推测我有一个从不犯错误的完美用户:)

因此,首先我设法通过 excel 中的 vba 访问存储过程,以根据特定单元格中的参数提取数据。现在,如果我想更新这些字段,我将如何做呢?

我的第一个建议是创建一个基于电子表格中所有字段更新的存储过程。如果这是正确的途径,我将如何遍历所有行?

人们可以提供的任何其他建议将不胜感激。

4

2 回答 2

1

有关更新 SQL Server 的一些说明。这[ODBC;FileDSN=z:\docs\test.dsn]可以是任何有效的连接字符串。

Dim cn As Object,  rs As Object
Dim scn As String, sSQL As String, sFile As String

    sFile = ActiveWorkbook.FullName

    scn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sFile _
        & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

    ''Late binding, so no reference is needed

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cn.Open scn

    sSQL = "SELECT * INTO [ODBC;FileDSN=z:\docs\test.dsn].FromXL " _
         & "FROM [Sheet8$]"
    cn.Execute sSQL, recs
    Debug.Print recs

    sSQL = "INSERT INTO [ODBC;FileDSN=z:\docs\test.dsn].FromXL " _
         & "SELECT * FROM [Sheet8$]"
    cn.Execute sSQL, recs
    Debug.Print recs

    sSQL = "UPDATE [ODBC;FileDSN=z:\docs\test.dsn].FromXL x " _
         & "INNER JOIN [Sheet8$] w " _
         & "ON x.ID = w.ID SET x.Field =w.field"
    cn.Execute sSQL, recs
    Debug.Print recs

    rs.Open "SELECT * FROM [ODBC;FileDSN=z:\docs\test.dsn].FromXL", cn
    Debug.Print rs.GetString
于 2012-10-01T21:41:31.567 回答
0

你必须熟悉微软的 COM 对象。我的 VBA 生锈了,所以要小心。

str t = Range("A1:A4").Value

如果您正在执行大量动态处理,您应该让自己成为一些 microsoft 存根的包装器方法。

function getValue(str location)
    return Range(location + ":" + location).Value
end function

我之前做过大型 VBA 项目,从前端读取值是一项昂贵的操作。您应该设置对象来保存这些值,这样您就不必多次读取相同的值。

最后,您需要大量验证,从检查数据库以确保用户拥有最新版本到确保电子表格不在打印视图中(因为这会影响能够读取的范围)。

验证版本很重要,因为您将需要发布修复程序并且您需要验证这些修复程序是否正在使用。

于 2012-10-01T21:08:28.037 回答