我在Windows 2008R2服务器上运行的MS 2008R2 SQL服务器Hyper V下的两个虚拟服务器有5个主数据库都链接到ERP程序。
我的用户全部再次运行终端服务器(TS)Windows 2008R2虚拟,我们在TS(系统DSN下)上设置了ODBC连接,以允许用户将数据从SQL数据库导入到MS Excel 2010中。
由于TS服务器的需求,我们正在添加我们正在测试的第二个TS,现在如果用户在新TS上打开新的Excel电子表格并建立ODBC连接并导入数据,他可以保存并重新打开它在新的TS上没有问题。
现在,如果用户在使用ODBC链接的旧TS上创建的新TS上打开现有Excel电子表格,则不会加载电子表格(电子表格会打开,但不会加载任何内容)。
如果用户继续使用旧TS并尝试打开使用ODBC链接在新TS上创建的新电子表格,则此电子表格也不会打开。
我们发现如果我们从ODBC连接字符串中删除WSID(这是正确的术语吗?),您可以在任何TS上打开任何ODBC链接的电子表格,但是当您保存并关闭电子表格时会出现问题,因为WSID是重新添加到ODBC连接字符串。
我相信WSID是连接字符串的可选组件,但无法在任何地方找到它来删除它,这是解决我们问题的最佳方法吗?旧的和新的TS
上的两组ODBC设置都是相同的很抱歉,如果我听起来含糊不清或使用了错误的术语,但这对我来说都是新的。
答案 0 :(得分:0)
我遇到了创建链接到SQL数据库的Excel电子表格的问题,并且用户没有正确的ODBC连接,或者它在客户端计算机上不存在。因此,我创建了一个方法,可以在Excel文件打开时自动在计算机/服务器注册表中创建ODBC连接。
注意:这将创建Microsoft Office 2010及以下数据库连接所需的32位ODBC连接。较新版本的Microsoft Office使用64位ODBC驱动程序,此方法无效。
我创建的第一个方法是将连接信息作为静态数据。
Private Sub Workbook_Open()
'This VBA script will automaticall create the ODBC connection for Excel
'when the user opens the Excel file. If the ODBC already exists, the
'valuse will simply be over written with the values you specify below
'without prompting the user.
'
'Please note: The connection password is not permited here and not allowed.
' you will need to save it in the Workbook connections if you
' do not want to prompt the user everytime for the password.
odbcName = "SQL-ODBC"
odbcDesc = "Pentagon2000 Database Connection"
odbcSrvr = "10.33.0.2"
odbcUser = "Reports"
odbcDB = "GDB_01_100"
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
'Write value in the Registry
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\", 1, "REG_DWORD"
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\Database", odbcDB
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\Description", odbcDesc
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\Driver", "C:\Windows\system32\SQLSRV32.dll"
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\LastUser", odbcUser
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\Server", odbcSrvr
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources\" & odbcName, "SQL Server"
End Sub
我之后改变了这种方法,因为我希望有一个地方可以读取所有我的Excel报告中的数据库连接,这使得从IT角度进行管理变得更加简单。这将读取XML文件并加载值以创建ODBC。
Private Sub Workbook_Open()
'This VBA script will automaticall create the ODBC connection for Excel
'when the user opens the Excel file. If the ODBC already exists, the
'valuse will simply be over written with the values you specify below
'without prompting the user.
'
'Please note: The connection password is not permited here and not allowed.
' you will need to save it in the Workbook connections if you
' do not want to prompt the user everytime for the password.
Dim nodeList As IXMLDOMNodeList
Set oXMLDoc = New MSXML2.DOMDocument
'Locates the setup directory and loads the Configuration.xml
'This assumes the Excel report is located in the Reports directory
oXMLDoc.Load (Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.Path, "\") - 1) + "\Apps\Setup\Configuration.xml")
Set nodeList = oXMLDoc.SelectNodes("/data")
odbcName = "BSC_Reports"
odbcDesc = "Pentagon2000 Database Connection for BSC Custom Reports"
odbcSrvr = nodeList(0).SelectNodes("server").Item(0).Text
odbcUser = nodeList(0).SelectNodes("user").Item(0).Text
odbcDB = nodeList(0).SelectNodes("pentdb").Item(0).Text
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
'Write value in the Registry
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\", 1, "REG_DWORD"
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\Database", odbcDB
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\Description", odbcDesc
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\Driver", "C:\Windows\system32\SQLSRV32.dll"
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\LastUser", odbcUser
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\" & odbcName & "\Server", odbcSrvr
WshShell.RegWrite "HKCU\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources\" & odbcName, "SQL Server"
End Sub
这是" Configuration.XML"我读的文件。
<?xml version="1.0" encoding="utf-8" ?>
<data>
<server>WBenhart-M6600\SQL_2008</server>
<user>Reports</user>
<pentdb>GDB_01_100</pentdb>
</data>
这两种方法都适用于您的终端服务器,您不需要手动创建ODBC。
我希望这会对你有所帮助。
韦恩本哈特