|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因此我们的保存数据方法就是:在删除的动作开始之前,把表数据备份起来,然后留一个空表,在空表上执行“删除”操作。serverSQLServer的T-SQL编程言语在数据存储和恢复方面功效壮大,但在与SQLServer数据库以外的体系交互方面则功效较弱。但是,我们能够经由过程SQLServer内置的COM主动操纵情况来克制这个限定,SQLServer内置的COM主动操纵情况可使用户在存储过程当中主动操纵COM工具。 在SQLServer7.0和SQLServer6.5中供应了7个扩大的存储历程,能够经由过程本人开辟的或Office等现成的COM工具扩大SQLServer的功效。SQLServer还供应了一种毛病处置机制,能够把堕落信息写到SQL代办署理日记中。使用COM主动化操纵服务,还能够把SQLServer与微软的ExchangeServer、IndexServer和其他能够经由过程COM主动化操纵服务把持其他软件举行集SQLServer6.5引进了工具主动操纵情况,它最后被称作OLE。跟着工夫的变迁工具操纵的称号也有所变更,但是与SQLServer6.5比拟,SQLServer7.0中的主动操纵情况没有改动,因而微软的文档中仍旧把这一功效称作OLE操纵而不是COM操纵,在查阅SQLServer在线手册(BOL)时特别必要注重这一点。上面我们来会商怎样利用SQLServer的COM主动操纵存储历程和COM主动操纵怎样匡助我们办理实际的编程成绩。
COM操纵的细节
表1列出了SQLServer中的7个用于COM操纵的扩大存储历程。当主动操纵一个COM工具时,必要起首经由过程挪用sp_OACreate创建一个COM工具的实例,然后经由过程一系列的sp_OAGetProperty、sp_OASetProperty和sp_OAMethod挪用完成必要完成的义务,在完成对COM工具的操纵后,还必要挪用sp_OADestroy开释该工具。在具体地研讨每一个贮存历程时,请注重二个很主要的成绩。
第一,必需供应挪用的一切参数,由于主动操纵功效不撑持着名参数,假如不克不及利用一个具体的参数,必要向它传送一个NULL作为占位符;第二,每一个挪用前往一个整数范例的HRESULT,假如挪用乐成则该值为0。在前面,我们将会商怎样处置前往值为非。
存储历程形貌
sp_OACreate创建主动操纵工具的一个实例
sp_OADestroy开释一个工具的实例
sp_OAGetErrorInfo从其他历程前往的HRESULT中取得毛病形貌信息
sp_OAGetProperty把一个工具的属性存储在了局集或部分变量中
sp_OASetProperty改动一个工具属性的值
sp_OAMethod实行工具的办法,向办法传送参数,并失掉前往值
sp_OAStop封闭SQLServer的主动操纵情况
表1:SQLServer的COM主动操纵存储历程
COM操纵必需以挪用sp_OACreate存储历程入手下手,语法格局以下所示:
sp_OACreateprogid|clsid,objecttokenOUT.PUT,
第一个参数是程序ID(ProgID━━一个使用程序名.类名情势的字符串,比方:
Excel.Application,)大概一个类ID(CLSID━━一个nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn情势的环球独一的ID),它标明你但愿创立实例的COM工具。
在大概的情形下,我倡议利用ProgID参数,由于它易于输出和影象。你会发明,只要很少的但愿主动操纵的工具没ProgID,假如偶然碰上如许的工具,就只要利用CLSID了。第二个变量objecttoken也是一个整型变量,一个工具的标志是指向SQLServer创立的工具的句柄和指针,我们必要在随后的对工具的主动操纵中利用这个前往的工具标志来断定这个工具。最初的context变量是可选的,能够强制创立的工具利用某种主动操纵的机制。假如其值为1,则请求工具在一个ActiveXDLL文件中;值为4,则请求工具在ActiveXEXE服务器中;假如是缺省的值5,则可使用任一主动操纵。在这里我们倡议利用缺省的选项,而不必为context参数供应一个得当的值。上面挪用op_OACreate的命令将创立一个微软的Excel程序的实例:- Declare@Objectint
- Declare@RetValint
- Exec@RetVal=sp_OACreateExcel.Application,
- @ObjectOUTPUT
复制代码 在创立一个工具后,必要猎取其一些属性。要失掉这些属性,能够经由过程上面的语法调
sp_OAGetProperty:
sp_OAGetPropertyobjecttoken,propertyname[,propertyvalueOUTPUT][,第一个参数objecttoken的值就是由sp_OACreate前往的值,参数Propertyname是我们但愿猎取的属性。
在猎取这个值是有几种选择,假如该属性是一个单一的值,能够把它存储在一个变量中,大概把它作为一个单行、单字段的了局集;假如属性值是一个一维或二维的数组,则必需把它作为一个了局集;假如假如该属性的值是一个多于二维的数组,sp_OAGetProperty就不克不及前往它的值,会呈现一个毛病。要前往一个了局集,只须复杂地不指定propertyvalue参数的值便可(假如必要它有一个值以便利用index参数,就把NULL赋给它好了。
不然的话,应当赋给propertyvalue一个得当的范例的值,而且必定要把该参数标志为OUTPUT。假如你会见的属性是一个汇合,就必要利用index参数指定这个汇合中一个特定的数字。假如一个工具的属性是另外一个工具,就应当把这个工具存进一个整数型变量中,sp_OAGetProperty前往的也是一个工具标志,不外与sp_OACreate前往的其实不不异。我们可使用这个工具标志对存储历程前往的任何工具举行主动化操纵。上面的命令挪用sp_OAGetProperty把一个名字为DefaultFilePath的属性值存进变量@DFP中:
Execsp_OAGetProperty@Object,DefaultFilePath,
@DFPOUTPUT
能够经由过程以下格局利用sp_OASetProperty存储历程改动一个工具的属性值:
sp_OASetPropertyobjecttoken,propertyname,newvalue[,index]
第一个参数objecttoken是由sp_OACreate前往的,参数Propertyname是要改动的工具的属性名字,Newvalue参数是想赋给属性的新变量,能够是一个变量或一个笔墨值。假如设定的属性值是作为一个汇合的一个工具,可使用可选的index参数来指定这个汇合的一个特定的地位。上面的命令挪用sp_OASetProperty把名字为FixedDecimalPlaces的属性设置为6:Execsp_OASetProperty@Object,FixedDecimalPlaces,6
能够用上面的语法挪用sp_OAMethod存储历程实行一个工具的办法:
sp_OAMethodobjecttoken,methodname[,returnvalueOUTPUT][,
Sp_OAMethod是最天真的,因此也是最庞大的主动操纵存储历程,我们乃至能够用它象挪用一个办法那样挪用一个属性,并且还能失掉一个前往值,固然,我们也能利用sp_OAGetProperty来完成这一义务。该存储历程的第一个参数objecttoken是由sp_OACreate前往的工具标志,参数methodname是但愿实行的办法的名字,假如该办法有前往值,则下一个参数returnvalue应该是一个包括该办法前往值的得当范例的变量;假如前往值是一个一维或二维的数组,则用NULL作为一个占位符,该历程将前往一个了局集。该存储历程不克不及前往一个凌驾二维的数组作为了局汇合,在这类情形下,SQLServer就会堕落。假如该办法没有前往范例。
假如挪用的办法必要参数,就必要在挪用sp_OAMethod时供应这些参数。假如办法同意按按次供应参数,则按请求的按次列出每一个参数,并用逗号分开每一个参数,还能够用变量或笔墨变量作为参数。假如必要利用着名参数,SQLServer也供应了响应的机制,只需利用:@变量名=变量值的情势列出所需的变量便可。必要注重的是不要由于有@前缀而把变量名看成部分变量,当挪用存储历程sp_OAMethod时,SQLServer就会剖析出@,因而,即便在挪用的办法中着名字为HostName的参数时,仍旧可使用名字为@HostName的部分变量。
上面是二个挪用sp_OAMethod的例子。第一个例子挪用一个名字为CentimetersToPoints的办法,它只承受在@CMVal变量中供应的一个参数,前往的值存储在变量@RetVal中。第二个例子挪用一个名字为MailLogon的办法,它承受三个可选的变量,这个例子中依据名字承受二个变量,把Name设置为字符串"MyUserName",把Password设置为字符串:
Execsp_OAMethod@Object,CentimetersToPoints,@RetValOUTPUT,@CMVal
Execsp_OAMethod@Object,MailLogon,NULL,@Name=MyUserName,
不再利用一个工具后,必要经由过程上面的语法挪用存储历程sp_OADestroy开释对该工具的引sp_OADestroyobjecttoken
挪用sp_OADestroy存储历程能够开释由参数objecttoken指定的工具,同时还开释这个工具所利用的内存和其他资本。上面是一个挪用sp_OADestroy的命令:
Execsp_OADestroy@Object
必要注重的是,T-SQL中的数据范例与其他的编程言语并不是是逐一对应的,在挪用一个必要特定的数据范例的办法时便可能堕落。"数据范例转换"工具条能够将SQLServer的数据。
毛病处置
象在后面提到的那样,假如对存储历程的挪用乐成了,则会前往一个为0的HRESULT值,其他的HRESULT值则意味着产生了毛病。要判别一个非零的HRESULT值,能够把HRESULT值传:
sp_OAGetErrorInfo[objecttoken][,sourceOUTPUT][,descriptionOUTPUT]
第一个参数objecttoken是由sp_OACreate前往的工具标志。
上面的四个参数前往毛病信息。Source是发生这一毛病信息的使用程序或库,Description是该毛病的形貌,假如有匡助文件的话,则该Helpfile是匡助文件的路径。这三个参数都是有标记或无标记字符型数据,sp_OAGetErrorInfo会依据界说的变量的巨细截取前往的值。最初一个参数helpid是特定毛病在匡助文件中的索引号。上面的命令挪用sp_OAGetErrorInfo以取得某一个毛病的更具体的信息:
Declare@Sourcevarchar(100),@Descriptionvarchar(255),@HelpFile
Execsp_OAGetErrorInfo@Object,@SourceOUTPUT,@DescriptionOUTPUT,
SQLServer在线手册还供应了一个有关sp_DisplayOAErrorInfo存储历程的例子,该存储历程能够挪用sp_OAGetErrorInfo把前往的值构造成格局化的字符串,以便把该信息写进日记文件中。
关于sp_DisplayOAErrorInfo的更具体的信息,请参阅工具条,别的,挪用sp_OAStop贮存历程能够封闭SQLServer的COM主动操纵情况,它无需任何参数。封闭主动操纵情况在年夜多半情形下并不是是必须的,第一次挪用sp_OACreate时主动操纵情况会主动开启,SQLServer封闭时主动操纵情况也会主动封闭。假如一个存储历程正在对一个工具举行主动操纵,而另外一个历程挪用sp_OAStop时就会呈现毛病,因而我们不倡议在程序中挪用sp_OAStop,只要在调试一个没有运转的历程时,才能够经由过程一个查询窗口挪用它。
在实践事情中利用COM主动操纵</STRONG>
至此,我们已进修了怎样利用每个COM主动操纵存储历程,我们如今来会商一下一个综合使用它们的例子。程序清单1是一个名字为sp_OpenWordIfCoProcAvailable的历程,在这个过程当中,我们用sp_OACreate创立了一个MicrosoftWord的实例,然后利用sp_OAGetProperty来猎取Word的MathCoProcessorAvailable属性,假如sp_OAGetProperty前往1,则sp_OpenWordIfCoProcAvailable向挪用历程前往Word工具的工具标志;不然,
sp_OpenWordIfCoProcAvailable封闭Word,并前往0。为了节俭版面,我们只挪用了堕落处置历程一次,在实践使用中,应当在每次挪用主动操纵存储历程后都挪用堕落处置历程。注重,为对Word举行主动操纵,应当在安装SQLServer的呆板上安装Word。
程序清单1:主动操纵Word的办法的例子- CreateProceduresp_OpenWordIfCoProcAvailableAs
- Declare@Objectint,@hrint,@RetValint
- Exec@hr=sp_OACreateWord.Application,@ObjectOUTPUT
- BEGIN
- Execsp_DisplayOAErrorInfo@Object,@hr
- Return0
- END
- Exec@hr=sp_OAGetProperty@Object,MathCoProcessorAvailable,@RetVal
- If@hr=0
- BEGIN
- Exec@hr=sp_OAMethod@Object,Quit,0
- Exec@hr=sp_OADestroy@Object
- Return0
- END
- Exec@hr=sp_OAMethod@Object,Activate
- Return@Object
复制代码 假如必要对一个利用VisualBasic编写的COM工具举行主动操纵,调试它与SQLServer之间的互操纵性是一件相称简单的事。我们必要在运转SQLServer的呆板上安装有VisualBasic,在VisualBasic的编纂器中加载COM项目,设置一些断点,然后编译并运转该COM工具。在有存储历程对该工具举行主动操纵时,在运转到一个断点时,编纂器就会主动切换到调试形式,我们就能够象调试其他的VisualBasic程序那样调试这个COM工具。假如要对换试历程实行更多的把持,可使用T-SQLDebuggerforVB插件,它能接纳步进体例实行存。
别的,在SQLServer中使用COM主动操纵我们还能作甚么呢?上面是我曾利用SQLServer壮大的COM主动操纵功效的实践例子。前不久,我必要从一个SQLServer存储过程当中利用一个经由过程定名管道举行通信,而SQLServer中没有供应经由过程编程体例翻开和利用定名管道的机制,我恰好有一个可使用定名管道通信的VB例和库,因而就把这个库文件作成一个类,并创立了一个ActiveXDLL文件,然后从存储过程当中对DLL举行主动操纵。
另外一次,我必要复制一些文件和数据库表。利用SQLServer的复制功效能够很便利地复制这些数据,但复制文件则要可贵多,NT的目次同步功效很弱,不克不及满意请求。只管我还能够把拷贝命令存到字符变量中,然后把变量传送给xp_cmdshell,但会碰到命令行长度的限定。更不便利的是,假如在拷贝过程当中产生了毛病,我不克不及很便利地判别毛病产生在甚么中央,因而,我就编写了一个ActiveXDLL,并经由过程主动操纵它来处置文件的拷贝事情。
另有一次,我必要在SQLServer6.5和IndexServer2.0之间先实行保持后再完成查询义务,假如利用带ADO的Windows2000IndexingServices和SQLServer7.0,完成如许的事情十分复杂,但假如不是利用这些产物,则要坚苦很多。
起首,必要编写一个能够实行IndexServer查询工具ixsso.dll的ActiveXDLL,对它举行主动操纵,从IndexServer目次中取得信息,并经由过程一个办法将信息前往到存储过程当中。
然后把这些数据保留到一个一时表中,再对它举行联合操纵。COM主动操纵再一次帮我办理了成绩。在存储过程当中实行COM主动操纵几近可使我们完成任何想完成的操纵。SQLServer2000中的COM主动操纵没有甚么变更,因而接纳这类办法编写的代码在未来仍旧可使用下往。
优化的SQL查询算法,有效地提高查询速度 |
|