vb.net - 是否可以在未安装引擎的情况下使用 ADODB/OleDB 连接?
问题描述
故事:
遗留项目正在从 VBA 迁移到 VB.NET。关键功能之一是与 Excel 的连接。VBA 功能始终适用于任何机器 x32/x64、Windows 7/8/10,只需安装 Excel。
对于未安装 MS-Access 的用户,VB.NET 上的相同功能会引发错误。
System.Runtime.InteropServices.COMException: Provider cannot be found. It may not be properly installed.
at Microsoft.VisualBasic.CompilerServices.LateBinding.InternalLateCall(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack, Boolean IgnoreReturn)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack, Boolean IgnoreReturn)
at ConsoleApp3.Module1.Main() in ...source\repos\ConsoleApp3\ConsoleApp3\Module1.vb:line 11
问题:
用户没有管理员权限,因此任何需要安装任何软件的解决方案都不适用。
功能:
VBA 完美适用于任何地方:
Sub workingVBAFunction()
Dim conn As Object
Dim connStr As String
Dim path As String
path = ThisWorkbook.FullName
connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
Set conn = CreateObject("ADODB.Connection")
Call conn.Open(connStr)
conn.Close
Set conn = Nothing
End Sub
VB.NET 仅适用于安装了 MS-Access 的机器:
Sub failingDotNETFunction()
Dim conn As Object = CreateObject("ADODB.Connection")
Dim connStr As String
Dim path As String
path = Environ("userprofile") & "\desktop\Book1.xlsm"
connStr = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={path};Extended Properties=""Excel 12.0 Xml;HDR=YES;"";"
conn.Open(connStr)
conn.Close
End Sub
问题:
如何在没有 MS-Access 引擎的本地计算机上创建与 VB.NET 的连接?这应该是可能的,因为 VBA 以某种方式做到了。如何将 VBA 的行为复制到 VB.NET?
已经尝试过:
这些都不适用于没有 Access 的机器
- 这个答案
- 更改连接字符串中的提供程序:
- "Provider=Microsoft.JET.OLEDB.4.0;Data Source="&path&";Extended Properties='Excel 8.0 Xml'"
- "Driver={Microsoft Excel 驱动程序 (*.xls, *.xlsx, *.xlsm, *.xlsb)};DSN=Excel 文件; DBQ=" & path & ";"
- “Excel文件=”&路径&“;”
- 为任何 CPU/x64/x86 构建应用程序
解决方案
推荐阅读
- python - python3 -m venv .venv 错误:[WinError 2]
- python - Pandas - df.compare() 如何更改自我/其他标签?
- javascript - 为什么我可以使用 document.getElementsByClassName() 删除某些元素,但不能删除其他元素?
- gitlab - gitlab api 是否允许从一个存储库中挑选樱桃到另一个存储库
- php - 回显结果的数组问题
- c# - 在 IIS 8.5 中发布网站时部分考虑了 CSS
- ios - 如何将带有 transferUserInfo 的字典传输到 Apple Watch?
- node.js - Cheerio 选择具有多个类的元素,用空格分隔
- reactjs - ReactJS DropZone 浏览器尝试在放置时打开文件
- reactjs - 在 React Leaflet 中使用 react-leaflet-geosearch:无法读取属性 addControl