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

大神"玻璃碴子"回答:
最近遇到一个很诡异的问题: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
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

