You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Excel VBA的ADODB对象从Linux端SQL Server提取数据

使用ADODB连接Linux上的SQL Server数据库(替代复杂Workbook实现)

需求说明

你现有通过ADODB读取MS Access数据库的Excel VBA代码,希望修改为直接连接Linux服务器上的SQL Server数据库,且希望用简洁的ADODB对象替代当前复杂的Workbook/QueryTable实现,同时已配置好Windows ODBC条目(DSN名为SQL2Pi)。

修改后的简洁ADODB实现代码

Dim objConn As ADODB.Connection, objRS As ADODB.Recordset, strSQL As String
Dim ErrMsg As String

' 初始化连接对象
Set objConn = New ADODB.Connection
On Error Resume Next
' 使用已配置的ODBC DSN连接SQL Server
objConn.Open "ODBC;DSN=SQL2Pi;"
If Err.Number <> 0 Then
    ErrMsg = "连接SQL Server失败: " & Err.Description
    GoTo Cleanup
End If
On Error GoTo 0

' 初始化记录集对象
Set objRS = New ADODB.Recordset
On Error Resume Next
' 编写适配SQL Server的查询语句(取最近1天数据,按时间排序)
strSQL = "SELECT * FROM furnace.temps WHERE Date_Time > DATEADD(day, -1, GETDATE()) ORDER BY Date_Time"
objRS.Open strSQL, objConn, adOpenForwardOnly, adLockReadOnly, adCmdText
If Err.Number <> 0 Then
    ErrMsg = "执行查询失败: " & Err.Description
    GoTo Cleanup
End If
On Error GoTo 0

' 将查询结果写入工作表temp2的A1起始位置
Worksheets("temp2").Range("A1").CopyFromRecordset objRS
' 可选:设置日期列格式(假设Date_Time在B列)
Worksheets("temp2").Columns("B:B").NumberFormat = "m/d/yy h:mm;@"

Cleanup:
' 释放资源
If Not objRS Is Nothing Then
    objRS.Close
    Set objRS = Nothing
End If
If Not objConn Is Nothing Then
    objConn.Close
    Set objConn = Nothing
End If
' 输出错误信息(如果有)
If ErrMsg <> "" Then
    MsgBox ErrMsg, vbCritical
End If

关键修改说明

  • 连接字符串调整:替换原Access的OLEDB连接字符串为ODBC DSN格式ODBC;DSN=SQL2Pi;,直接复用你已配置的Windows ODBC条目
  • SQL语句适配:
    • 替换Access的now()-1为SQL Server的DATEADD(day, -1, GETDATE()),实现取最近1天数据的逻辑
    • 表名写法调整为furnace.temps(对应你原QueryTable中的furnace.temps),符合SQL Server的schema.表名格式
  • 错误处理优化:整合错误捕获逻辑,统一在清理阶段释放资源并提示错误,比原代码更健壮
  • 格式保留:保留原需求中的日期列格式设置,确保时间显示正确

内容的提问来源于stack exchange,提问作者RDK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:33:23