首先我理解让用户通过excel更新数据库的过程会产生很多风险,我很感激任何反对这种方法的建议,但我们推测我有一个永远不会犯错的完美用户:)
首先,我设法通过excel中的vba访问存储过程,以根据特定单元格中的参数提取数据。现在,如果我想更新这些字段,我将如何进行此操作?
我的第一个建议是创建一个基于电子表格中所有字段进行更新的存储过程。如果这是一个正确的途径,我将如何遍历所有行?
人们可以提供的任何其他建议将不胜感激。
答案 0 :(得分: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
答案 1 :(得分:0)
您必须熟悉微软COM对象。我的VBA生锈了所以要小心。
str t = Range("A1:A4").Value
如果你正在进行大量的动态处理,你应该把自己作为一些微软存根的包装方法。
function getValue(str location)
return Range(location + ":" + location).Value
end function
我以前做过大型VBA项目,从前端读取值是一项代价高昂的操作。您应该设置对象来保存这些值,这样您就不必多次读取相同的值。
最后,您需要进行大量的验证,从检查数据库之间的所有内容确保用户拥有最新版本以确保电子表格不在打印视图中(因为这会影响能够读取的范围) )。
验证版本很重要,因为您需要发布修补程序,并且需要验证是否正在使用这些修补程序。