租号玩代理申请
A- A+

SQL Server导入数据时发生错误 SQL Server 导入导出工具 DTSWizard.exe 一启动就报错。

2022年05月18日 电脑网络 暂无评论 阅读 1525 次 打印

提问者:sql server导入数据时发生错误,求大神指点,看看该怎么解决呢?SSMS SQL Server 导入导出向导弹窗报错,提示未指定的错误,错误图片如下图。
SSMS SQL Server 导入导出向导弹窗报错,提示未指定的错误

SSMS导入导出向导高级错误详情,异常调用堆栈 get_DBProviderInfos,提示未指定的错误

大神"玻璃碴子"回答:

最近遇到一个很诡异的问题:SQL Server 导入导出工具 DTSWizard.exe 一启动就报错。
错误信息大概是这样:

作者:玻璃碴子
链接:https://www.zhihu.com/question/449957199/answer/2067746376834881467
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

===================================
This wizard will close because it encountered the following error: (Microsoft SQL Server)
For help, click: https://go.microsoft.com:80/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=17.0.1016.0&EvtSrc=Microsoft.SqlServer.Management.UI.WizardFrameworkErrorSR&EvtID=UncaughtException&LinkId=20476
===================================
数据无效。
Program Location:
   在 Microsoft.SqlServer.Dts.Runtime.Wrapper.ApplicationClass.get_DBProviderInfos()
   在 Microsoft.SqlServer.Dts.DtsWizard.DTSWizard.GetDtsDbProviderInfos(WizardInputs wizardInputs)
   在 Microsoft.SqlServer.Dts.DtsWizard.DataSourceCombo.PopulateProviders(Boolean fSources, WizardInputs wizardInputs)
   在 Microsoft.SqlServer.Dts.DtsWizard.Step1.OnInitializePage(EventArgs e)
   在 Microsoft.SqlServer.Management.UI.WizardPage.RaiseEnterPage()
   在 Microsoft.SqlServer.Management.UI.WizardForm.NextPage(WizardPage nextPage)
   在 Microsoft.SqlServer.Management.UI.WizardForm.Next_Click(Object sender, EventArgs e)

一开始很容易怀疑是 SQL Server、SSMS、SSIS、ODBC、OLE DB Provider 的问题。

搞了一天,最后发现,根因居然是百度网盘写坏了 HKCR下面 Windows Packaged COM 注册表项。

现象
问题只出现在某一台客户端电脑上。
同一个 SQL Server:换另一台客户端,导入导出工具正常;出问题的客户端,SSMS 能连 SQL Server。
重装 SSMS 没用。重启电脑没用。修复 SQL Server 组件也没用。
报错点一直卡在:

ApplicationClass.get_DBProviderInfos()

这说明导入导出向导是在连接 SQL Server 枚举本机数据提供程序时挂掉。

怀疑
ODBC Driver 或 OLE DB Provider 存在内部故障
SSIS Runtime COM 没注册 32/64 位组件不匹配

这些方向都有一定道理,因为 DBProviderInfos 确实会枚举本机数据提供程序。但后来用 C# 手动调用 Microsoft.SqlServer.Dts.Runtime.Application().DBProviderInfos 时,又遇到 80040154 没有注册类,这个反而是另一个干扰项。反编译和 manifest 看下来,DTSWizard 170 这里使用了 manifest / registration-free COM 机制,不能简单用:

reg query HKCR\CLSID\{...}

来判断 DTSWizard 是否能加载对应 COM 类。

所以最后决定直接抓 DTSWizard.exe 本身。

关键定位方法:ProcMon
用 Sysinternals Process Monitor 过滤:

Process Name is DTSWizard.exe

然后启动导入导出工具,让它报错。

重点看报错前访问了哪些注册表项和 DLL,尤其是:

HKCR\PackagedCom
HKCR\CLSID
ODBCINST.INI
InprocServer32
OLE DB
ODBC

最后在 ProcMon 里发现了一个非常可疑的注册表项:

HKCR\PackagedCom\ClassIndex\{499C8928-90D7-411D-8DBD-E35B92529123-}

这个 GUID 明显是非法的。

合法 GUID 应该是这种格式:

{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

但这个最后多了一个横杠:

{499C8928-90D7-411D-8DBD-E35B92529123-}

导出这个 key 之后看到:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\PackagedCom\ClassIndex\{499C8928-90D7-411D-8DBD-E35B92529123-}]
[HKEY_CLASSES_ROOT\PackagedCom\ClassIndex\{499C8928-90D7-411D-8DBD-E35B92529123-}\BaiduNetdisk.DesktopSyncClient_7.17.5.6_neutral__r5kxaep58dem0]

破案了,来源是:

BaiduNetdisk.DesktopSyncClient

解决方法
先备份,再删除这个坏 key。

reg export "HKCR\PackagedCom\ClassIndex\{499C8928-90D7-411D-8DBD-E35B92529123-}" C:\Temp\bad-baidunetdisk-packagedcom.reg /y
reg delete "HKCR\PackagedCom\ClassIndex\{499C8928-90D7-411D-8DBD-E35B92529123-}" /f

然后删除对应位置。

删完直接重新打开 DTSWizard.exe,导入导出工具直接恢复正常。

作者:玻璃碴子
链接:https://www.zhihu.com/question/449957199/answer/2067746376834881467
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

给我留言

7 * 7 =
评论规范提醒