日期:2014-05-18  浏览次数:20730 次

SQL SERVER遭遇DLLHOST
我下面的存储过程本来是好使的

我执行此存储过程是这样的,在上点右键,出框,因为它需要一个文件名作参数,我输入“C:\DiBao\2009年12月发放.XLS”

这样执行是正常的

但是我运行几回后出错信息如下:

消息 7399,级别 16,状态 1,第 1 行
链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 报错。访问被拒绝。
消息 7301,级别 16,状态 2,第 1 行
无法从链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 获取所需的接口("IID_IDBCreateCommand")。

并且这时出现一个怪现象,“C:\DiBao\2009年12月发放.XLS”文件不能删也不能改名,就连我退出SSNS也不能。
我结束了进程中的dllhost.exe,就能删和改了。一定是文件被这进程使用了。

在网上找了,有人让考以下几个问题:

1、文件是不是加密码了
2、xls要关闭,不能打开
3、是否允许OPENDATASOURCE 支持
4、你是2005 还是2000?
这些都没关系啊,我什么也没动啊,原来好使,一会儿就不好使了啊

请大侠说说是怎么办?一开始好使怎么后来不好使了呢。

请大家不要想太远,我系统中什么也没动,不是什么Excel版本问题等。

出问题的存储过程如下:

ALTER PROCEDURE [dbo].[ffmx]
@FileName char(500) --C:\DiBao\2009年12月发放.XLS
AS
BEGIN
declare @s nvarchar(max)
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

  -- Insert statements for procedure here

truncate table SJ_DB_FFMX
select * from SJ_DB_FFMX

set @s='insert SJ_DB_FFMX SELECT [行政区划代码],[家庭编号],[户主姓名],'
set @s=@s+'[户主身份证号],[低保证号],[银行帐号],[发放时间]=convert(varchar(6),cast([发放时间] as datetime),112),'
set @s=@s+'[低保金],[其他补贴金额] '
set @s=@s+'FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'','
set @s=@s+'''Data Source='+@FileName+';User ID=Admin;Password=;Extended properties=Excel 5.0'') ...[sheet1$]'

execute(@s)
select * from SJ_DB_FFMX

END

------解决方案--------------------
SQL code

--从官方示例来看你的文件名左右缺少双引号
This example accesses data from a table on another instance of SQL Server.

SELECT   *
FROM      OPENDATASOURCE(
         'SQLOLEDB',
         'Data Source=ServerName;User ID=MyUID;Password=MyPass'
         ).Northwind.dbo.Categories

This is an example of a query against an Excel spreadsheet through the OLE DB provider for Jet.

SELECT * 
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
  'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions