如何通过 Access VBA 连接到启用了 web-API 的数据库
How to connect to a web-API enabled database via Access VBA
在 Windows 2007 年,我尝试使用我在互联网上找到的以下 Access VBA 子例程将 Access(2016 64 位)数据库连接到另一个 web-API启用Access(2016 64位)数据库提取一些数据元素:
Sub DownloadFile0()
Dim Stm As ADODB.Stream
Dim Rec As New ADODB.Record
Dim Conn As New ADODB.Connection
Dim Url As String, Str As String
Url = "http://www.elesteshary.com/sosdata.accdb/sdr/doll_per_sdr" ' URL, database, record, and field names
Conn.Provider = "ExOLEDB.DataSource"
Conn.Open Url
Rec.Open Url, Conn
Set Stm = Rec.Fields(adDefaultStream).Value
Str = Stm.ReadText
...
Conn.Close
Rec.Close
Stm.Close
Set Conn = Nothing
Set Rec = Nothing
Set Stm = Nothing
End Sub
当 运行 时,我收到“找不到提供商”。建议我可以使用哪个提供商来代替“ExOLEDB”,我怎样才能得到它?当我绕过“Conn.Provider”语句时,我收到“数据源名称太长”。这是因为缺少提供者吗?如果有问题,请更正代码。如果都设置了,“Str”会不会包含“doll_per_sdr”的值? “sdr”是一条记录 table。如果我需要从多记录table的特定记录中查询一个字段怎么办?最后,这个子程序可以从非Access数据库中提取数据吗?
注意:不允许下载“sosdata.accdb”。
此致。
El Noshokaty 博士说,
信息系统教授
你不能这样做。您发现的代码需要特定的 URL 语法和知道如何解析它的 Web 服务器才能知道:
- 要打开的数据库(sosdata.accdb)
- 要在数据库中使用的 table (sdr)
- 要从 table
检索的记录的索引 (doll_pr_sdr)
- return那个记录
没有开箱即用的 web-API 启用访问(2016 64 位) 能够做到这一点。这样的 API 将使用发布 API 服务(在内部)与 Access 数据库交互的 Web 服务器构建。
附录:
因为你可以下载文件,所以你可以使用 DAO。
- 设置引用以包括这些:
从我的项目 VBA.PictureUrl
下载并插入模块 Internet.bas
创建一个新模块并复制粘贴此代码:
Option Compare Database
Option Explicit
Public Function DownloadSdrValue() As Currency
Const Url As String = "http://www.elesteshary.com/sosdata.accdb"
Dim Database As DAO.Database
Dim Records As DAO.Recordset
Dim FileName As String
Dim Value As Currency
FileName = DownloadCacheFile(Url)
Set Database = DBEngine(0).OpenDatabase(FileName)
Set Records = Database.OpenRecordset("Select * From sdr")
If Records.RecordCount > 0 Then
Records.MoveFirst
Value = Records.Fields("doll_per_sdr").Value
End If
Records.Close
Database.Close
Debug.Print "Value:", Value
DownloadSdrValue = Value
End Function
编译并保存模块
像这样检索值:
DollarPerSdr = DownloadSdrValue
- 结果:1.57
在 Windows 2007 年,我尝试使用我在互联网上找到的以下 Access VBA 子例程将 Access(2016 64 位)数据库连接到另一个 web-API启用Access(2016 64位)数据库提取一些数据元素:
Sub DownloadFile0()
Dim Stm As ADODB.Stream
Dim Rec As New ADODB.Record
Dim Conn As New ADODB.Connection
Dim Url As String, Str As String
Url = "http://www.elesteshary.com/sosdata.accdb/sdr/doll_per_sdr" ' URL, database, record, and field names
Conn.Provider = "ExOLEDB.DataSource"
Conn.Open Url
Rec.Open Url, Conn
Set Stm = Rec.Fields(adDefaultStream).Value
Str = Stm.ReadText
...
Conn.Close
Rec.Close
Stm.Close
Set Conn = Nothing
Set Rec = Nothing
Set Stm = Nothing
End Sub
当 运行 时,我收到“找不到提供商”。建议我可以使用哪个提供商来代替“ExOLEDB”,我怎样才能得到它?当我绕过“Conn.Provider”语句时,我收到“数据源名称太长”。这是因为缺少提供者吗?如果有问题,请更正代码。如果都设置了,“Str”会不会包含“doll_per_sdr”的值? “sdr”是一条记录 table。如果我需要从多记录table的特定记录中查询一个字段怎么办?最后,这个子程序可以从非Access数据库中提取数据吗?
注意:不允许下载“sosdata.accdb”。
此致。
El Noshokaty 博士说, 信息系统教授
你不能这样做。您发现的代码需要特定的 URL 语法和知道如何解析它的 Web 服务器才能知道:
- 要打开的数据库(sosdata.accdb)
- 要在数据库中使用的 table (sdr)
- 要从 table 检索的记录的索引 (doll_pr_sdr)
- return那个记录
没有开箱即用的 web-API 启用访问(2016 64 位) 能够做到这一点。这样的 API 将使用发布 API 服务(在内部)与 Access 数据库交互的 Web 服务器构建。
附录:
因为你可以下载文件,所以你可以使用 DAO。
- 设置引用以包括这些:
从我的项目 VBA.PictureUrl
下载并插入模块Internet.bas
创建一个新模块并复制粘贴此代码:
Option Compare Database
Option Explicit
Public Function DownloadSdrValue() As Currency
Const Url As String = "http://www.elesteshary.com/sosdata.accdb"
Dim Database As DAO.Database
Dim Records As DAO.Recordset
Dim FileName As String
Dim Value As Currency
FileName = DownloadCacheFile(Url)
Set Database = DBEngine(0).OpenDatabase(FileName)
Set Records = Database.OpenRecordset("Select * From sdr")
If Records.RecordCount > 0 Then
Records.MoveFirst
Value = Records.Fields("doll_per_sdr").Value
End If
Records.Close
Database.Close
Debug.Print "Value:", Value
DownloadSdrValue = Value
End Function
编译并保存模块
像这样检索值:
DollarPerSdr = DownloadSdrValue
- 结果:1.57