首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以使用脚本将计算机上的系统DSN与实例上的SQL数据库进行比较?

问有没有一种方法可以使用脚本将计算机上的系统DSN与实例上的SQL数据库进行比较?
EN

Stack Overflow用户
提问于 2014-09-05 15:34:35
回答 1查看 45关注 0票数 0

我正在寻找一种可能的方法,让脚本从服务器获取所有系统DSN,以及获取实例上的所有SQL数据库,并比较这两个实例,以确保在此服务器上安装了所有DSN。我有一个脚本来获取DSN,我有一个单独的脚本来获取SQL的。

DSN脚本:

代码语言:javascript
复制
Const HKEY_LOCAL_MACHINE = &H80000002

strComputer = "."

Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\ODBC\ODBC.INI\ODBC DATA SOURCES"

objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes

For i = 0 to Ubound(arrValueNames)
    strValueName = arrValueNames(i)
    If LEFT(strValueName, 2) = "SB" Then
        objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue    
        strDSN = strDSN & strValueName & VBCRLF 
    End If
Next

wscript.echo strDSN

SQL DB脚本:

代码语言:javascript
复制
dim sServer, sConn, oConn, colDatabases, sDatabaseName, sUser, sPassword, strQry, run, rslt

sDatabaseName="Master"
sServer="."
sUser="."
sPassword="."
sConn="provider=sqloledb;data source=" & sServer & ";initial catalog=" & sDatabaseName
Set oConn = CreateObject("ADODB.Connection")
oConn.Open sConn, sUser, sPassword

strQry = "select name from sys.databases where name like 'sb%'"
set run = oConn.execute(strQry)
run.MoveFirst
Do Until run.EOF
rslt = rslt & "Database: " & run("name") & VBCRLF 
run.MoveNext
Loop 
MsgBox rslt
oConn.Close

我可以单独运行这两个程序,并亲自比较它们,但是我希望能够合并它们,让脚本比较它们,并给出可能缺少的内容的反馈。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-05 18:00:15

您需要将DSN(名称)和数据库(名称)收集到两个数组中,即ArrayLists或Dictionaries。然后可以使用标准集操作(并、交、差、补)来识别感兴趣的(子)集,例如没有对应数据库的DSNs、没有对应DSN的数据库、'good‘对、.)。

只需两行就可以在第一个脚本中添加字典:

代码语言:javascript
复制
Set dicODBC = CreateObject("Scripting.Dictionary") ' <<<<<<<<
For i = 0 to Ubound(arrValueNames)
    strValueName = arrValueNames(i)
    If LEFT(strValueName, 2) = "SB" Then
        objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
        strDSN = strDSN & strValueName & VBCRLF
        dicODBC(strValueName) = 0 ' <<<<<<<<
    End If
Next

您当然可以将此策略应用于您的第二个脚本,并将两个程序组合成一个以两个集合(字典) dicODBC和dicDB结尾的程序(确保其键不包括"Database:“前缀)。

现在看一下this脚本,看看如何比较通过dicX.Keys()获得的数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25689397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档