vba中adodb.command对象的execute方法在win10系统下出错

探讨了VBA代码在Windows 10系统上执行时遇到的兼容性问题,特别是在调用ADODB组件执行存储过程时出现的错误。

各位大神,能否帮忙解答一个vba的问题
用下面代码在win7系统下可以运行,在win10系统中就出问题,
运行到倒数第三行 Set rs = adocmd.Execute 就报错,
提示:方法“execute”作用于对象“_command”时失败
不知道是不是vba中的execute方法在win10中不兼容的原因
求大神解答,感激不尽!
Sub test()

Dim rs As New ADODB.Recordset
Set adocmd = CreateObject(“ADODB.Command”)
Dim prm As New ADODB.Parameter
'Call DB_CONNECT

Dim x As New ADODB.Connection
x.ConnectionString = "Provider=msdasql;Data Source=WEBDC;User ID=xxxggg;Password=xxxggg123"
x.Open

Set adocmd.ActiveConnection = x
adocmd.CommandText = "PORT_BASIC_INFO"   '存储过程名
adocmd.CommandType = adCmdStoredProc  '类型

Set prm = adocmd.CreateParameter("parameter" & i + 1, adBSTR, adParamInput, , "260116")
adocmd.Parameters.Append prm
Set prm = adocmd.CreateParameter("parameter" & i + 1, adBSTR, adParamInput, , "2050-12-31")
adocmd.Parameters.Append prm
Set prm = adocmd.CreateParameter("parameter" & i + 1, adBSTR, adParamInput, , "组合代码")
adocmd.Parameters.Append prm

Set rs = adocmd.Execute
Debug.Print rs.fields.Count
End Sub

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

<think>我们正在处理一个VBA数据库连接问题。用户提供的代码片段是: Set conn1 = CreateObject("ADODB.Connection") 这行代码创建了一个ADODB.Connection对象,用于数据库连接。 但是,用户之前提到需要兼容识别xls表格一起转换,这意味着我们需要一个能够同时处理Access数据库和Excel文件的解决方案。 我们已经有了一个较完整的解决方案,但用户可能希望更详细地了解ADODB.Connection的使用,特别是如何同时兼容Access和Excel。 因此,我将提供一个详细的指南,包括如何创建连接、如何根据文件类型选择连接字符串,以及如何执行查询。 以下是一个完整的VBA模块,它演示了如何使用ADODB.Connection来连接Access数据库和Excel文件,并执行一些基本操作。</think># 深入解析ADODB.Connection对象VBA中的使用 下面我将详细解释`ADODB.Connection`对象的使用方法,并提供完整的VBA数据库操作解决方案,包括连接管理、数据操作和错误处理。 ## 完整的ADODB连接管理方案 ```vba ' 数据库连接管理器类 ' ============================================== ' 文件名: clsDBConnection.cls ' 功能: 封装数据库连接和操作 ' ============================================== Private m_conn As ADODB.Connection Private m_connectionString As String Private m_isConnected As Boolean ' 初始化连接 Private Sub Class_Initialize() Set m_conn = New ADODB.Connection m_isConnected = False End Sub ' 清理资源 Private Sub Class_Terminate() CloseConnection Set m_conn = Nothing End Sub ' 属性: 连接状态 Public Property Get IsConnected() As Boolean IsConnected = m_isConnected End Property ' 属性: 连接对象 Public Property Get Connection() As ADODB.Connection Set Connection = m_conn End Property ' 创建Access连接字符串 Public Function CreateAccessConnection( _ filePath As String, _ Optional password As String = "", _ Optional engineType As String = "ACE" _ ) As String Dim connStr As String ' 根据引擎类型选择提供程序 If engineType = "ACE" Then connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" Else connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" End If ' 添加数据源 connStr = connStr & "Data Source=" & filePath & ";" ' 添加密码(如果有) If password <> "" Then connStr = connStr & "Jet OLEDB:Database Password=" & password & ";" End If CreateAccessConnection = connStr End Function ' 创建Excel连接字符串 Public Function CreateExcelConnection( _ filePath As String, _ Optional hasHeaders As Boolean = True, _ Optional readOnly As Boolean = False _ ) As String Dim connStr As String Dim ext As String ' 获取文件扩展名 ext = Right(filePath, 4) ' 根据文件类型设置提供程序 connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filePath & ";" ' 添加扩展属性 If LCase(ext) = ".xls" Then connStr = connStr & "Extended Properties=""Excel 8.0;" Else connStr = connStr & "Extended Properties=""Excel 12.0 Xml;" End If ' 添加其他选项 If hasHeaders Then connStr = connStr & "HDR=YES;" Else connStr = connStr & "HDR=NO;" End If If readOnly Then connStr = connStr & "Mode=Read;" Else connStr = connStr & "Mode=ReadWrite;" End If connStr = connStr & "IMEX=1"";" ' 始终将混合数据作为文本读取 CreateExcelConnection = connStr End Function ' 打开数据库连接 Public Sub OpenConnection(connStr As String) On Error GoTo ErrorHandler ' 如果已连接则关闭 If m_isConnected Then CloseConnection End If ' 设置连接字符串 m_connectionString = connStr ' 打开连接 With m_conn .ConnectionString = m_connectionString .ConnectionTimeout = 30 ' 30秒超时 .Open End With m_isConnected = True Exit Sub ErrorHandler: Dim errMsg As String errMsg = "连接错误 [" & Err.Number & "]: " & Err.Description Err.Raise vbObjectError + 1000, "DBConnection.OpenConnection", errMsg End Sub ' 关闭数据库连接 Public Sub CloseConnection() On Error Resume Next ' 防止关闭时出错 If m_isConnected Then If m_conn.State = adStateOpen Then m_conn.Close End If m_isConnected = False End If End Sub ' 执行SQL查询并返回记录集 Public Function ExecuteQuery( _ sql As String, _ Optional cursorType As ADODB.CursorTypeEnum = adOpenStatic, _ Optional lockType As ADODB.LockTypeEnum = adLockReadOnly _ ) As ADODB.Recordset On Error GoTo ErrorHandler Dim rs As New ADODB.Recordset ' 设置记录集属性 rs.CursorLocation = adUseClient rs.CursorType = cursorType rs.LockType = lockType ' 执行查询 rs.Open sql, m_conn, cursorType, lockType, adCmdText ' 返回记录集 Set ExecuteQuery = rs Exit Function ErrorHandler: Dim errMsg As String errMsg = "查询错误 [" & Err.Number & "]: " & Err.Description & vbCrLf & _ "SQL: " & sql Err.Raise vbObjectError + 1001, "DBConnection.ExecuteQuery", errMsg End Function ' 执行非查询SQL(更新、插入、删除) Public Function ExecuteNonQuery(sql As String) As Long On Error GoTo ErrorHandler ' 执行命令 m_conn.Execute sql, ExecuteNonQuery Exit Function ErrorHandler: Dim errMsg As String errMsg = "执行错误 [" & Err.Number & "]: " & Err.Description & vbCrLf & _ "SQL: " & sql Err.Raise vbObjectError + 1002, "DBConnection.ExecuteNonQuery", errMsg End Function ' 开始事务 Public Sub BeginTransaction() If m_isConnected Then m_conn.BeginTrans Else Err.Raise vbObjectError + 1003, "DBConnection.BeginTransaction", "未连接数据库" End If End Sub ' 提交事务 Public Sub CommitTransaction() If m_isConnected Then If m_conn.Properties("Transaction DDL").Value > 0 Then m_conn.CommitTrans End If End If End Sub ' 回滚事务 Public Sub RollbackTransaction() If m_isConnected Then If m_conn.Properties("Transaction DDL").Value > 0 Then m_conn.RollbackTrans End If End If End Sub ' 获取数据库元数据 Public Function GetMetaData(Optional objectType As ADODB.SchemaEnum = adSchemaTables) As ADODB.Recordset On Error GoTo ErrorHandler If Not m_isConnected Then Err.Raise vbObjectError + 1004, "DBConnection.GetMetaData", "未连接数据库" End If Set GetMetaData = m_conn.OpenSchema(objectType) Exit Function ErrorHandler: Dim errMsg As String errMsg = "元数据错误 [" & Err.Number & "]: " & Err.Description Err.Raise vbObjectError + 1004, "DBConnection.GetMetaData", errMsg End Function ``` ## 使用示例 ### 示例1: 连接Access数据库并读取数据 ```vba Sub AccessDatabaseExample() Dim db As New clsDBConnection Dim rs As ADODB.Recordset Dim i As Long On Error GoTo ErrorHandler ' 创建连接字符串 Dim connStr As String connStr = db.CreateAccessConnection("C:\Database\Sample.accdb") ' 打开连接 db.OpenConnection connStr ' 执行查询 Set rs = db.ExecuteQuery("SELECT * FROM Customers") ' 在Excel中显示结果 With ThisWorkbook.Sheets.Add .Name = "Customers" ' 写入列标题 For i = 0 To rs.Fields.Count - 1 .Cells(1, i + 1) = rs.Fields(i).Name Next i ' 写入数据 .Range("A2").CopyFromRecordset rs ' 格式化 .Columns.AutoFit .Rows(1).Font.Bold = True End With ' 清理资源 rs.Close db.CloseConnection MsgBox "数据导入完成!", vbInformation Exit Sub ErrorHandler: MsgBox "错误: " & Err.Description, vbCritical If Not rs Is Nothing Then If rs.State = adStateOpen Then rs.Close End If db.CloseConnection End Sub ``` ### 示例2: 连接Excel文件并更新数据 ```vba Sub ExcelAsDatabaseExample() Dim db As New clsDBConnection Dim rs As ADODB.Recordset On Error GoTo ErrorHandler ' 创建连接字符串 Dim connStr As String connStr = db.CreateExcelConnection("C:\Reports\SalesData.xlsx") ' 打开连接 db.OpenConnection connStr ' 开始事务 db.BeginTransaction ' 执行更新 Dim updateSql As String updateSql = "UPDATE [Sales$] SET Discount = 0.15 " & _ "WHERE Amount > 1000 AND Region = 'North'" Dim rowsAffected As Long rowsAffected = db.ExecuteNonQuery(updateSql) ' 提交事务 db.CommitTransaction ' 验证更新 Set rs = db.ExecuteQuery("SELECT * FROM [Sales$] WHERE Discount = 0.15") MsgBox "更新完成! " & rowsAffected & " 行已更新。" & vbCrLf & _ "找到 " & rs.RecordCount & " 条匹配记录。", vbInformation ' 清理资源 rs.Close db.CloseConnection Exit Sub ErrorHandler: ' 回滚事务 db.RollbackTransaction MsgBox "错误: " & Err.Description, vbCritical If Not rs Is Nothing Then If rs.State = adStateOpen Then rs.Close End If db.CloseConnection End Sub ``` ## ADODB.Connection关键功能解析 ### 1. 连接字符串详解 - **Access连接字符串**: ```vba "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DB.accdb;" ``` - ACE引擎支持.accdb和.xlsx等新格式 - Jet引擎仅支持.mdb和.xls旧格式 - **Excel连接字符串**: ```vba "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Data.xlsx;" & _ "Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";" ``` - `HDR=YES`:第一行包含列标题 - `IMEX=1`:将混合数据列作为文本读取 ### 2. 事务处理 ```vba ' 开始事务 conn.BeginTrans ' 执行操作 conn.Execute "UPDATE Table SET Value = 100 WHERE ID = 1" ' 提交或回滚 If success Then conn.CommitTrans Else conn.RollbackTrans End If ``` ### 3. 参数化查询(防SQL注入) ```vba Dim cmd As New ADODB.Command With cmd .ActiveConnection = conn .CommandText = "INSERT INTO Users (Name, Email) VALUES (?, ?)" .CommandType = adCmdText ' 添加参数 .Parameters.Append .CreateParameter("Name", adVarChar, adParamInput, 50, "John") .Parameters.Append .CreateParameter("Email", adVarChar, adParamInput, 100, "john@example.com") ' 执行 .Execute End With ``` ### 4. 元数据查询 ```vba ' 获取所有表名 Dim rs As ADODB.Recordset Set rs = conn.OpenSchema(adSchemaTables) ' 获取所有列信息 Set rs = conn.OpenSchema(adSchemaColumns) ``` ## 性能优化技巧 1. **批量插入**: ```vba conn.BeginTrans For i = 1 To 1000 conn.Execute "INSERT INTO Log (Message) VALUES ('Entry " & i & "')" Next i conn.CommitTrans ``` 2. **使用CopyFromRecordset**: ```vba ' 比逐行写入快100倍以上 sheet.Range("A2").CopyFromRecordset rs ``` 3. **连接池管理**: ```vba ' 在应用程序启动时 Set globalConn = New ADODB.Connection globalConn.Open connStr ' 在需要时复用连接 Set rs = globalConn.Execute(sql) ``` 4. **异步操作**: ```vba conn.Execute "LONG_RUNNING_PROCEDURE", , adAsyncExecute ' 检查是否完成 Do While conn.StillExecuting DoEvents Loop ``` ## 常见错误处理 | 错误号 | 原因 | 解决方案 | |--------|------|----------| | -2147217843 | 文件未找到 | 检查文件路径和权限 | | -2147467259 | 无效的提供程序 | 安装正确的数据库引擎 | | 3706 | 提供程序未注册 | 安装Access Database Engine | | -2146824582 | 表不存在 | 检查表名和拼写 | | 3021 | 无当前记录 | 检查记录集是否为空 | ## 高级应用:跨数据库查询 ```vba Sub CrossDatabaseQuery() Dim db As New clsDBConnection Dim connStr As String ' 连接Access数据库 connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MasterDB.accdb;" db.OpenConnection connStr ' 执行跨数据库查询 Dim sql As String sql = "SELECT a.*, b.* " & _ "FROM [Customers] a " & _ "INNER JOIN [Excel 12.0;Database=C:\SalesData.xlsx;HDR=YES].[Q1_Sales$] b " & _ "ON a.CustomerID = b.ClientID" Dim rs As ADODB.Recordset Set rs = db.ExecuteQuery(sql) ' 处理结果... rs.Close db.CloseConnection End Sub ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值