如何用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.表名格式
- 替换Access的
- 错误处理优化:整合错误捕获逻辑,统一在清理阶段释放资源并提示错误,比原代码更健壮
- 格式保留:保留原需求中的日期列格式设置,确保时间显示正确
内容的提问来源于stack exchange,提问作者RDK
相关产品推荐
相关产品推荐

