作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 VBA 中枚举 LAN 上的 SQL Server 实例?
这是针对 Windows 10 上的 Microsoft Office 2019 的,服务器是 2008 年到 2019 年的各种版本。
我有一个 Excel 工作簿,它使用 VBA 中的 ADODB 2.8 在一个 SQL 实例上运行查询。我想扩展代码以对我们 LAN 上的任何实例运行查询。为此,我将添加一个表单和列表框来选择实例,但我找不到用实例名称填充列表框的代码的想法。
找到这些信息比我预期的要困难。我经常看到 SQLDMO 被提及,但是很多帖子和文章都是 15-20 年的,我在我的系统上找不到这个 DLL。
我可以在 VB.Net 中轻松地做到这一点,但在 VBA 中却是一个难以捉摸的答案。
Imports System.Data.Sql
Module Module1
Sub Main()
Dim instance As SqlDataSourceEnumerator = SqlDataSourceEnumerator.Instance
Dim table As System.Data.DataTable = instance.GetDataSources()
For Each row As DataRow In table.Rows
Console.WriteLine(row("ServerName") & "\" & row("InstanceName"))
Next
Console.WriteLine("Press any key to continue.")
Console.ReadKey()
End Sub
End Module
最佳答案
编辑 我认为下面的代码无论如何都行不通,因为它似乎需要 CDecl
调用约定。SqlDataSourceEnumerator
使用名为 sni.dll
的内部本地 DLL没有文档。
我已经在 VBA 中实现了这个,但我没有声称它的可靠性,因为它完全没有文档记录。
我什至无法测试它,因为我网络上唯一的 SQL Server 没有出现在 SqlDataSourceEnumerator
中任何一个。
您可能还需要获取 sni.dll
的确切位置。在您的机器上,您可能需要下载 Microsoft.Data.SqlClient.SNI
NuGet 包。
Declare PtrSafe Function SNIServerEnumOpen Lib "sni.dll" (ByRef handle As LongPtr, ByVal dummy As Long) As LongPtr
Declare PtrSafe Sub SNIServerEnumClose Lib "sni.dll" (ByRef handle As LongPtr)
Declare PtrSafe Function SNIServerEnumRead Lib "sni.dll" (ByVal handle As LongPtr, ByVal buffer As String, ByVal bufferSize As Long, ByRef more As Long) As LongPtr
Function EnumDataSources() As String()
On Error GoTo finally
Dim buffer, strbldr As String
Dim bufferSize, readLength As Long
Dim handle As LongPtr
Dim more As Long
buffer = Space(1024)
SNIServerEnumOpen(handle, 0)
If handle = 0 Then GoTo finally
Do While more <> 0
readLength = SNIServerEnumRead(handle, buffer, 1024, more)
If readLength > bufferSize Then
Exit Do
ElseIf 0 < readLength Then
strbldr = strbldr & Mid(buffer, 0, readLength)
End If
Loop
finally:
If handle <> 0 Then SNIServerEnumClose (handle)
EnumDataSources = Split(strbldr, ChrW(0))
End Function
关于sql-server - 如何在 VBA 中枚举 LAN 上的 SQL Server 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72192799/
我是一名优秀的程序员,十分优秀!