sp_oacreate??????

了解 2012-01-10 05:48:47
请高手给讲下sp_oacreate的详细应用?下面是微软的例子,看不懂.

A. 使用 Prog ID
下面的示例通过使用 SQL-DMO SQLServer 对象的 ProgID 创建该对象。

DECLARE @object int
DECLARE @hr int
DECLARE @src varchar(255), @desc varchar(255)
EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @object OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END

B. 使用 CLSID
下面的示例通过使用 SQL-DMO SQLServer 对象的 CLSID 创建该对象。

DECLARE @object int
DECLARE @hr int
DECLARE @src varchar(255), @desc varchar(255)
EXEC @hr = sp_OACreate '{00026BA1-0000-0000-C000-000000000046}',
@object OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END

--/* 上面用红色标记的东西是什么?如果想创建其它对象要怎样改呢?比如要创建.mdb文件,.txt文件,.xls文件,.doc文件,等等。
请高手给出代码和详细解释。
...全文
496 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
睡着的一休 2014-06-22
  • 打赏
  • 举报
回复
引用 4 楼 dongxugu 的回复:
OLEComponent 是 OLE 自动化服务器的组件名称,Object 是 OLE 对象名。 这句话在微软的帮助里也有,看过了,细想一下就能看出还有其它内容,我想知道的就是他的全部,不是单纯的这句话。请高手门深入进去,一定要把这个问题搞清楚呀。看过邹建老大的一个例子: 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 /*--数据导出Access 导出数据库中的表到Access,可以同时导出指定的N个表 如果文件不存在,将自动创建文件 如果表存在,将覆盖现有的表 --邹建 2004.04--*/ /*--调用示例 --导出所有用户表 p_exporttb @s_tbname='',@path='c:\',@fname='test.mdb' --导出指定表 p_exporttb @s_tbname='syscolumns,sysobjects',@path='c:\',@fname='test.mdb' --*/ create proc p_exporttb @s_tbname varchar(4000)='', --要导出的表名列表,用逗号分隔,如果不指定,导出所有表 @path nvarchar(1000), --文件存放目录 @fname nvarchar(250), --文件名 @password varchar(20)='', --ACCESS数据库的密码 @s_user sysname='', --如果提示连接错误,则需要提供登陆sql服务器的用户名及密码 @s_password varchar(50)='' as set nocount on 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.mdb' --检查文件是否已经存在 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 --数据库创建 select @sql=@path+@fname ,@constr='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+@sql +case isnull(@password,'') when '' then '' else ';Jet OLEDB:Database Password='+@password end if not exists(select 1 from #tb where a=1) begin exec @err=sp_oacreate 'ADOX.Catalog',@obj out if @err<>0 goto lberr exec @err=sp_oamethod @obj,'Create',null,@constr if @err<>0 goto lberr exec @err=sp_oadestroy @obj if @err<>0 goto lberr end --连接数据库 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 --导出处理 declare @tbname sysname,@s varchar(8000) set @s=case isnull(@s_tbname,'') when '' then '' else ' and name in('''+replace(@s_tbname,',',''',''')+''')' end exec('declare tb cursor global for select name from sysobjects where xtype=''U'''+@s) open tb fetch next from tb into @tbname while @@fetch_status=0 begin --删除现有的表 set @sql='drop table ['+@tbname+']' exec @err=sp_oamethod @obj,'execute',@out out,@sql --if @err<>0 goto lberr --导入表 if isnull(@s_user,'')='' set @sql='SELECT * into ['+@tbname +'] FROM [ODBC;Driver=SQL Server;Server='+ @@servername +';database='+db_name()+'].['+@tbname+']' else set @sql='SELECT * into ['+@tbname +'] FROM [ODBC;Driver=SQL Server;Server='+ @@servername +';Uid='+@s_user+';Pwd='+isnull(@s_password,'') +';database='+db_name()+'].['+@tbname+']' exec @err=sp_oamethod @obj,'execute',@out out,@sql if @err<>0 goto lberr fetch next from tb into @tbname end close tb deallocate tb --释放对象 exec @err=sp_oadestroy @obj return lberr: exec sp_oageterrorinfo 0,@src out,@desc out if @obj<>0 exec @err=sp_oadestroy @obj lbexit: select cast(@err as varbinary(4)) as 错误号 ,@src as 错误源,@desc as 错误描述 select @sql,@constr,@fdlist go 我觉得很好,用的很巧秒,很熟练,但自己不会呀,sp_oacreate都能创建什么呢?怎么用呢?
我试了下这个,老是提示连接数据库失败,有大神指导下吗
wjx_0_2001 2012-12-20
  • 打赏
  • 举报
回复
引用 1 楼 maco_wang 的回复:
progid 是要创建的 OLE 对象的程序标识符 (ProgID)。此字符串描述该 OLE 对象的类,其形式如下: 'OLEComponent.Object' OLEComponent 是 OLE 自动化服务器的组件名称,Object 是 OLE 对象名。指定的 OLE 对象必须有效并且必须支持 IDispatch 接口。 例如,SQLDMO.SQLServer 是 SQ……
还是没觉得说清楚了 首先sp_oacreate第一个参数 怎么给? 什么叫prgID 比如SQL中调用一个DLL 这里如何写? 我在网上找了一大堆,没发现能有人说清楚
叶子 2012-01-11
  • 打赏
  • 举报
回复
了解 2012-01-10
  • 打赏
  • 举报
回复
OLEComponent 是 OLE 自动化服务器的组件名称,Object 是 OLE 对象名。
这句话在微软的帮助里也有,看过了,细想一下就能看出还有其它内容,我想知道的就是他的全部,不是单纯的这句话。请高手门深入进去,一定要把这个问题搞清楚呀。看过邹建老大的一个例子:
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

/*--数据导出Access

导出数据库中的表到Access,可以同时导出指定的N个表

如果文件不存在,将自动创建文件
如果表存在,将覆盖现有的表

--邹建 2004.04--*/

/*--调用示例

--导出所有用户表
p_exporttb @s_tbname='',@path='c:\',@fname='test.mdb'

--导出指定表
p_exporttb @s_tbname='syscolumns,sysobjects',@path='c:\',@fname='test.mdb'
--*/
create proc p_exporttb
@s_tbname varchar(4000)='', --要导出的表名列表,用逗号分隔,如果不指定,导出所有表
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250), --文件名
@password varchar(20)='', --ACCESS数据库的密码
@s_user sysname='', --如果提示连接错误,则需要提供登陆sql服务器的用户名及密码
@s_password varchar(50)=''
as
set nocount on
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.mdb'

--检查文件是否已经存在
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

--数据库创建
select @sql=@path+@fname
,@constr='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+@sql
+case isnull(@password,'') when '' then ''
else ';Jet OLEDB:Database Password='+@password end

if not exists(select 1 from #tb where a=1)
begin
exec @err=sp_oacreate 'ADOX.Catalog',@obj out
if @err<>0 goto lberr

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

exec @err=sp_oadestroy @obj
if @err<>0 goto lberr
end

--连接数据库
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

--导出处理
declare @tbname sysname,@s varchar(8000)
set @s=case isnull(@s_tbname,'') when '' then ''
else ' and name in('''+replace(@s_tbname,',',''',''')+''')' end
exec('declare tb cursor global for select name from sysobjects where xtype=''U'''+@s)

open tb
fetch next from tb into @tbname
while @@fetch_status=0
begin
--删除现有的表
set @sql='drop table ['+@tbname+']'
exec @err=sp_oamethod @obj,'execute',@out out,@sql
--if @err<>0 goto lberr

--导入表
if isnull(@s_user,'')=''
set @sql='SELECT * into ['+@tbname
+'] FROM [ODBC;Driver=SQL Server;Server='+ @@servername
+';database='+db_name()+'].['+@tbname+']'
else
set @sql='SELECT * into ['+@tbname
+'] FROM [ODBC;Driver=SQL Server;Server='+ @@servername
+';Uid='+@s_user+';Pwd='+isnull(@s_password,'')
+';database='+db_name()+'].['+@tbname+']'

exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0 goto lberr
fetch next from tb into @tbname
end
close tb
deallocate tb

--释放对象
exec @err=sp_oadestroy @obj

return

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

我觉得很好,用的很巧秒,很熟练,但自己不会呀,sp_oacreate都能创建什么呢?怎么用呢?

SQL77 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dongxugu 的回复:]

怎样创建其它对象呢?
比如要创建.mdb文件,.txt文件,.xls文件,.doc文件,等等。
sp_oacreate可以创建的ole对象都有什么?
[/Quote]

只能创建
OLEComponent 是 OLE 自动化服务器的组件名称,Object 是 OLE 对象名
了解 2012-01-10
  • 打赏
  • 举报
回复
怎样创建其它对象呢?
比如要创建.mdb文件,.txt文件,.xls文件,.doc文件,等等。
sp_oacreate可以创建的ole对象都有什么?
叶子 2012-01-10
  • 打赏
  • 举报
回复
progid

是要创建的 OLE 对象的程序标识符 (ProgID)。此字符串描述该 OLE 对象的类,其形式如下:

'OLEComponent.Object'

OLEComponent 是 OLE 自动化服务器的组件名称,Object 是 OLE 对象名。指定的 OLE 对象必须有效并且必须支持 IDispatch 接口。

例如,SQLDMO.SQLServer 是 SQL-DMO SQLServer 对象的 ProgID。SQL-DMO 的组件名称为 SQLDMO,SQLServer 对象是有效的,并且同所有 SQL-DMO 对象一样,SQLServer 对象支持 Idispatch。

clsid

是要创建的 OLE 对象的类标识符 (CLSID)。此字符串描述该 OLE 对象的类,其形式如下:

'{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}'

指定的 OLE 对象必须有效并且必须支持 IDispatch 接口。

例如,{00026BA1-0000-0000-C000-000000000046} 是 SQL-DMO SQLServer 对象的 CLSID。
DECLARE @Object int; DECLARE @HR int; DECLARE @Property nvarchar(255); DECLARE @Return nvarchar(255); DECLARE @Source nvarchar(255), @Desc nvarchar(255); DECLARE @httpStatus int; DECLARE @response varchar(8000); --创建 OLE 对象的实例 EXEC @HR = sp_OACreate N'MSXML2.XMLHTTP.6.0',@Object OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('Error Creating COM Component 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO END_ROUTINE END BEGIN --Open EXEC @HR = sp_OAMethod @Object,N'open',Null,'GET','http://localhost:1728/HttpServer/submit.aspx',FALSE; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('Open 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --setRequestHeader EXEC @HR = sp_OAMethod @Object,N'setRequestHeader',Null,'Content-Type','text/xml'; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('setRequestHeader 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --send EXEC @HR = sp_OAMethod @Object,N'send',Null,''; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('send 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --readyState EXEC @HR = sp_OAGetProperty @Object,'readyState', @httpStatus OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('readyState 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --verify status IF @httpStatus 4 BEGIN RAISERROR('readyState http status bad', 16,1) GOTO CLEANUP END --status EXEC @HR = sp_OAGetProperty @Object,'status', @httpStatus OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('getstatus 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --verify status IF @httpStatus 200 BEGIN Print Cast(@httpStatus As varchar) RAISERROR('Open http status bad', 16,1) GOTO CLEANUP END --responseText EXEC @HR = sp_OAGetProperty @Object, 'responseText', @response OUT IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('responseText 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END Print @response END CLEANUP: BEGIN EXEC @HR = sp_OADestroy @Object; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; SELECT HR = convert(varbinary(4),@HR),Source=@Source,Description=@Desc; END END END_ROUTINE: RETURN; GO

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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