找不到可安装的 ISAM。

changeZ 2010-05-20 10:01:11
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_exporttb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)   
drop procedure [dbo].[p_exporttb]
GO
create proc p_exporttb
@sqlstr sysname, --查询语句,如果查询语句中使用了order by ,请加上top 100 percent,注意,如果导出表/视图,用上面的存储过程
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250), --文件名
@sheetname varchar(250)='' --要创建的工作表名,默认为文件名
as
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)

--参数检测
if isnull(@fname,'')='' set @fname='temp.xls'
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')

--检查文件是否已经存在
if right(@path,1)<>'\' set @path=@path+'\'
create table #tb(a bit,b bit,c bit)
set @sql=@path+@fname
insert into #tb exec master..xp_fileexist @sql

--数据库创建语句
set @sql=@path+@fname
if exists(select 1 from #tb where a=1)
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'
+';CREATE_DB="'+@sql+'";DBQ='+@sql
else
set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 5.0;HDR=YES'
+';DATABASE='+@sql+'"'

--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberr

exec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 goto lberr

--创建表的SQL
declare @tbname sysname
set @tbname='##tmp_'+convert(varchar(38),newid())
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'
exec(@sql)

select @sql='',@fdlist=''
select @fdlist=@fdlist+','+a.name
,@sql=@sql+',['+a.name+'] '
+case when b.name in('char','nchar','varchar','nvarchar') then
'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'
when b.name in('tynyint','int','bigint','tinyint') then 'int'
when b.name in('smalldatetime','datetime') then 'datetime'
when b.name in('money','smallmoney') then 'money'
else b.name end
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype
where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
and a.id=(select id from tempdb..sysobjects where name=@tbname)
select @sql='create table ['+@sheetname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)

exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0 goto lberr

exec @err=sp_oadestroy @obj

--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')

set @sql='drop table ['+@tbname+']'
exec(@sql)
return

lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
select @sql,@constr,@fdlist
go
本人系菜鸟一名,使用某前辈写的这个存储过程想实现导出表中数据到EXCEL 但是执行的时候总是报错
错误源:Microsoft JET Database Engine
错误描述:找不到可安装的 ISAM。
我已经安装好了OFFICE 2003上网搜了好久 也没找到解决方法 请各位大虾指路 万分感谢
...全文
2034 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoliangkou2222 2012-08-15
  • 打赏
  • 举报
回复
我用的8.0可以用时可以用但是我装的是2007,导出的后缀居然是.XLS大写的,倒是可以用,数据超过7w行就不知道可用不了,把8.0改成12.0过后就报和楼主一样的错误了,郁闷死了
changeZ 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 andkylee 的回复:]
》》The stored proc uses ADO connection to create an excel file

---------------

明显的中国式英语。


很明显不是外国人,通过他的回复,有些表达不太地道。
[/Quote]

我觉得他挺好的。。。不管是什么语言,只要对方习惯。而且通过他的回复我可以解决我的问题。
很明显,csw200201 能看懂中文,而习惯用English表达。
不要把问题放在这些问题上吧。。。
csw200201 2010-05-23
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 andkylee 的回复:]

明显的中国式英语。


很明显不是外国人,通过他的回复,有些表达不太地道。
[/Quote]

那请你写一下正宗的 English English or American English, rather than my Chinglish
来表达 "The stored proc uses ADO connection to create an excel file".

  • 打赏
  • 举报
回复
》》The stored proc uses ADO connection to create an excel file

---------------

明显的中国式英语。


很明显不是外国人,通过他的回复,有些表达不太地道。
changeZ 2010-05-23
  • 打赏
  • 举报
回复
I see.
csw200201 2010-05-22
  • 打赏
  • 举报
回复
Sorry I meant to say
(6) mark Connection object to be released back into memory
changeZ 2010-05-22
  • 打赏
  • 举报
回复
创建ADODB.Connection 对象
设置联接字符串
打开连接
执行SQL语句
关闭连接
mark Connection object?
mark mean?
我的不会自动关闭。。。。难道跟我的是windows xp SP3有关系?

Thank you very much.
yjh53615728 2010-05-22
  • 打赏
  • 举报
回复
英语好棒啊
csw200201 2010-05-22
  • 打赏
  • 举报
回复
The stored proc uses ADO connection to create an excel file (if necessary), create the sheet, and then download the data.

To use the ADO object you need to do the following:
(1) create ADODB.Connection object
(2) Set ConnectionString
(3) Open connection
(4) Execute whatever SQL statement
(5) Close connection
(6) mark Connection object

Normally, if you go straight to step (6) without executing step (5), Ado connection should be automatically closed anyway. However, obviously in your case, it hasn't. It could be that you have an out-of-date version of MDAC.

I presume you are aware what the stored proc is supposed to do. I made a copule of changes to it just to see what is going on. You need to revert back to the original version and simply add the extra code with sp_oamethod 'close' into the proc.
永生天地 2010-05-21
  • 打赏
  • 举报
回复
到进程里看看是不是还有excel的进程没有结束,把它结束掉再执行
changeZ 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dawugui 的回复:]
那段代码我用过,没有问题.
[/Quote]
我执行exec p_exporttb @sqlstr='select * from Student',@path='c:\',@fname='student2.xls',@sheetname='student'
又出了新提示 而且文件生成了 但是里面没有数据。。。

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_exporttb]
GO
create proc p_exporttb
@sqlstr sysname, --查询语句,如果查询语句中使用了order by ,请加上top 100 percent,注意,如果导出表/视图,用上面的存储过程
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250), --文件名
@sheetname varchar(250)='' --要创建的工作表名,默认为文件名
as
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)



--参数检测
if isnull(@fname,'')='' set @fname='temp.xls'
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')

--检查文件是否已经存在
if right(@path,1)<>'\' set @path=@path+'\'
create table #tb(a bit,b bit,c bit)
set @sql=@path+@fname
insert into #tb exec master..xp_fileexist @sql

--数据库创建语句
set @sql=@path+@fname
if exists(select 1 from #tb where a=1)
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'
+';CREATE_DB="'+@sql+'";DBQ='+@sql
else
set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES;DATABASE='+@sql+'"'

--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberr

exec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 goto lberr

--创建表的SQL
declare @tbname sysname
set @tbname='##tmp_'+convert(varchar(38),newid())
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'
exec(@sql)

select @sql='',@fdlist=''
select @fdlist=@fdlist+','+a.name ,@sql=@sql+',['+a.name+'] '
+case when b.name in('char','nchar','varchar','nvarchar') then
'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'
when b.name in('tynyint','int','bigint','tinyint') then 'int'
when b.name in('smalldatetime','datetime') then 'datetime'
when b.name in('money','smallmoney') then 'money'
else b.name end
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype where b.name not in
('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
and a.id=(select id from tempdb..sysobjects where name=@tbname)
select @sql='create table ['+@sheetname +']('+substring(@sql,2,8000)+')' ,@fdlist=substring(@fdlist,2,8000)
exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0 goto lberr

exec @err=sp_oadestroy @obj

--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE='+@path+@fname+''',['+@sheetname+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')

set @sql='drop table ['+@tbname+']'
exec(@sql)
return

lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
select @sql,@constr,@fdlist
go

让我百思不得其解 不知道怎么回事 还请多多指教


(所影响的行数为 1 行)


(所影响的行数为 3 行)---这个可以说明我的数据表中有3行数据

服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'MICROSOFT.JET.OLEDB.4.0' 报错。
[OLE/DB provider returned message: Microsoft Jet 数据库引擎打不开文件''。 它已经被别的用户以独占方式打开,或没有查看数据的权限。]
changeZ 2010-05-21
  • 打赏
  • 举报
回复
比对你给我的最后两次代码,发现

exec @err=sp_oamethod @obj, 'close'
if @err<>0
begin
print 'error closing ADODB.Connection object'
end

此处close为什么意思呢?是不是类似与打开了数据源需要关闭呢?
changeZ 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xys_777 的回复:]
到进程里看看是不是还有excel的进程没有结束,把它结束掉再执行
[/Quote]
按照这个说法 我重启了机器 然后打开任务管理器 没有发现excel.exe然后再运行
还是报错

服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'MICROSOFT.JET.OLEDB.4.0' 报错。
[OLE/DB provider returned message: Microsoft Jet 数据库引擎打不开文件''。 它已经被别的用户以独占方式打开,或没有查看数据的权限。]


这个刚产生的文件 并没有打开啊 怎么回事呢。
changeZ 2010-05-21
  • 打赏
  • 举报
回复
To csw200201
1.运行新版本之后再执行

exec p_exporttb @sqlstr='select * from Student',@path='c:\',@fname='aa.xls',@sheetname='student'

文件被正确生成(含T-SQL查询的数据)[true]
2.如果再次执行


error creating data sheet most likely sheet already alreayd exists

这里也是正确的,文件已经存在当然打印出这句咯。呵呵[true]

3.新建一个aa.xls于C盘下
执行代码


(所影响的行数为 1 行)


(所影响的行数为 5 行)


(所影响的行数为 5 行)

数据被生成到aa.xls的student表中,这里也是正确的。[true]

Thank you very much!Problem solved.
我保存了你所有次数的代码,等下会进行分析的。。。
能否请您也做一个更改总结呢?非常感谢您的帮助。。my QQ:47054567 MSN:zouli890216@hotmail.com
Nice to meet you.
csw200201 2010-05-21
  • 打赏
  • 举报
回复
ok, again install the latest version and let me know of the error message when the excel does not exist or if the file exists already.


alter proc p_exporttb
@sqlstr sysname, --查询语句,如果查询语句中使用了order by ,请加上top 100 percent,注意,如果导出表/视图,用上面的存储过程
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250), --文件名
@sheetname varchar(250)='' --要创建的工作表名,默认为文件名
as
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)



--参数检测
if isnull(@fname,'')='' set @fname='temp.xls'
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')

--检查文件是否已经存在
if right(@path,1)<>'\' set @path=@path+'\'
create table #tb(a bit,b bit,c bit)
set @sql=@path+@fname
insert into #tb exec master..xp_fileexist @sql

--数据库创建语句
set @sql=@path+@fname
if exists(select 1 from #tb where a=1)
--set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'
-- +';CREATE_DB="'+@sql+'";DBQ='+@sql
set @constr='Driver={Microsoft Excel Driver (*.xls)};Dbq='+@sql+';ReadOnly=0;'
else
set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES;DATABASE='+@sql+'"'

--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 begin print 'error creating adodb.connection object' goto lberr end

exec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 begin print 'error opening adodb.connection object' goto lberr end

--创建表的SQL
declare @tbname sysname
set @tbname='##tmp_'+convert(varchar(38),newid())
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'
exec(@sql)

select @sql='',@fdlist=''
select @fdlist=@fdlist+','+a.name ,@sql=@sql+',['+a.name+'] '
+case when b.name in('char','nchar','varchar','nvarchar') then
'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'
when b.name in('tynyint','int','bigint','tinyint') then 'int'
when b.name in('smalldatetime','datetime') then 'datetime'
when b.name in('money','smallmoney') then 'money'
else b.name end
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype where b.name not in
('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
and a.id=(select id from tempdb..sysobjects where name=@tbname)
select @sql='create table ['+@sheetname +']('+substring(@sql,2,8000)+')' ,@fdlist=substring(@fdlist,2,8000)
--print @sql
--print @fdlist
exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0
begin
print 'error creating data sheet most likely sheet already alreayd exists'
end


exec @err=sp_oamethod @obj, 'close'
if @err<>0
begin
print 'error closing ADODB.Connection object'
end
exec @err=sp_oadestroy @obj

--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE='+@path+@fname+''',['+@sheetname+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')

if @@error<>0 begin print 'error inserting detailed records' end
set @sql='drop table ['+@tbname+']'
exec(@sql)
return

lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
select @sql,@constr,@fdlist
go


changeZ 2010-05-21
  • 打赏
  • 举报
回复
To csw200201

我照你的做了啊 错误还是一样的是这个

服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'MICROSOFT.JET.OLEDB.4.0' 报错。
[OLE/DB provider returned message: Microsoft Jet 数据库引擎打不开文件''。 它已经被别的用户以独占方式打开,或没有查看数据的权限。]


student.xls被创建到了指定位置 但是里面只有表头没有数据。
再次执行就会有数据了 但是会打印出
error creating data sheet most likely sheet already alreayd exists
csw200201 2010-05-21
  • 打赏
  • 举报
回复
Delete the Excel file and do NOT recreate it. Let the stored proc create it for you. Execute it and let me know what error you get.
changeZ 2010-05-21
  • 打赏
  • 举报
回复
to csw200201

My English is not perfect, but I thank you very much.

我现在重新运行了你的代码,出现了如下情况,可能还需要你指点一下。
我使用的是SQL 2000的查询分析器
执行这个存储过程的代码是

exec p_exporttb @sqlstr='select * from Student',@path='c:\',@fname='student.xls',@sheetname='student'


情况一:在C盘下,不存在student.xls运行 还是报同样的错误

服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'MICROSOFT.JET.OLEDB.4.0' 报错。
[OLE/DB provider returned message: Microsoft Jet 数据库引擎打不开文件''。 它已经被别的用户以独占方式打开,或没有查看数据的权限。]

于是我再运行一遍


(所影响的行数为 1 行)


(所影响的行数为 3 行)

error creating data sheet most likely sheet already alreayd exists

(所影响的行数为 3 行)

在执行这个存储过程到创建文件的时候,提示文件存在,当然这个是一个提示。此时对应的student.xls内已经有了传输的T-SQL查询到的数据。【突破性进展。。。。】
情况二:我删除掉情况一生成的所有文件。自己新建一个student.xls在c盘根目录下。然后运行存储过程
依然报错


(所影响的行数为 1 行)


(所影响的行数为 3 行)

服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'MICROSOFT.JET.OLEDB.4.0' 报错。
[OLE/DB provider returned message: Microsoft Jet 数据库引擎打不开文件''。 它已经被别的用户以独占方式打开,或没有查看数据的权限。]

问题究竟在哪里呢?在写入数据到student.xls部分的代码有问题吗?

csw200201 2010-05-21
  • 打赏
  • 举报
回复
(1) Can you run the script (updated againn) in query analyser to install the update
(2) Execute the stored proc from query analyser and advise the exact parameters you are passing into the stored proc. Also advise whether you are attempting to update an existing Excel spreadsheet or trying to create a new one (i.e., whether @path+@file is an existing file or not). If you are doing both, then advise the behaviour of either cases and the parameters you are passing into the stored proc
(3) Advise what message you see from query analyser output


alter proc p_exporttb
@sqlstr sysname, --查询语句,如果查询语句中使用了order by ,请加上top 100 percent,注意,如果导出表/视图,用上面的存储过程
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250), --文件名
@sheetname varchar(250)='' --要创建的工作表名,默认为文件名
as
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)



--参数检测
if isnull(@fname,'')='' set @fname='temp.xls'
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')

--检查文件是否已经存在
if right(@path,1)<>'\' set @path=@path+'\'
create table #tb(a bit,b bit,c bit)
set @sql=@path+@fname
insert into #tb exec master..xp_fileexist @sql

--数据库创建语句
set @sql=@path+@fname
if exists(select 1 from #tb where a=1)
--set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'
-- +';CREATE_DB="'+@sql+'";DBQ='+@sql
set @constr='Driver={Microsoft Excel Driver (*.xls)};Dbq='+@sql+';ReadOnly=0;'
else
set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES;DATABASE='+@sql+'"'

--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 begin print 'error creating adodb.connection object' goto lberr end

exec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 begin print 'error opening adodb.connection object' goto lberr end

--创建表的SQL
declare @tbname sysname
set @tbname='##tmp_'+convert(varchar(38),newid())
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'
exec(@sql)

select @sql='',@fdlist=''
select @fdlist=@fdlist+','+a.name ,@sql=@sql+',['+a.name+'] '
+case when b.name in('char','nchar','varchar','nvarchar') then
'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'
when b.name in('tynyint','int','bigint','tinyint') then 'int'
when b.name in('smalldatetime','datetime') then 'datetime'
when b.name in('money','smallmoney') then 'money'
else b.name end
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype where b.name not in
('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
and a.id=(select id from tempdb..sysobjects where name=@tbname)
select @sql='create table ['+@sheetname +']('+substring(@sql,2,8000)+')' ,@fdlist=substring(@fdlist,2,8000)
--print @sql
--print @fdlist
exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0
begin
print 'error creating data sheet most likely sheet already alreayd exists'
end


exec @err=sp_oadestroy @obj

--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE='+@path+@fname+''',['+@sheetname+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')

if @@error<>0 begin print 'error inserting detailed records' end
set @sql='drop table ['+@tbname+']'
exec(@sql)
return

lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
select @sql,@constr,@fdlist
go


changeZ 2010-05-21
  • 打赏
  • 举报
回复
to csw200201
Is the same error

服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'MICROSOFT.JET.OLEDB.4.0' 报错。
[OLE/DB provider returned message: Microsoft Jet 数据库引擎打不开文件''。 它已经被别的用户以独占方式打开,或没有查看数据的权限。]

加载更多回复(12)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧