用COM自动处事扩展SQL Server的成果
SQL Server的T-SQL编程说话在数据存储和规复方面成果强盛,但在与SQL Server数据库之外的体系交互方面则成果较弱。然而,我们可以通过SQL Server内置的COM自动操尽兴况来降服这个限定,SQL Server内置的COM自动操尽兴况可以行使户在存储进程中自动操纵COM工具。 在SQL Server 7.0和SQL Server 6.5中提供了7个扩展的存储进程,可以通过本身开拓的或Office等现成的COM工具扩展SQL Server的成果。SQL Server还提供了一种错误处理赏罚机制,可以把堕落信息写到SQL署理日记中。操作COM自动化操纵处事,还可以把SQL Server与微软的Exchange Server、Index Server和其他可以通过COM自动化操纵处事节制其他软件举办集SQL Server 6.5引进了工具自动操尽兴况,它最初被称作OLE。跟着时刻的变迁工具操纵的名称也有所变革,然而与SQL Server 6.5对比,SQL Server 7.0中的自动操尽兴况没有改变,因此微软的文档中如故把这一成果称作OLE操纵而不是COM操纵,在查阅SQL Server在线手册(BOL)时尤其必要留意这一点。下面我们来接头怎样行使SQL Server的COM自动操纵存储进程以及COM自动操纵怎样辅佐我们办理实际的编程题目。 COM操纵的细节 表1列出了SQL Server中的7个用于COM操纵的扩展存储进程。当自动操纵一个COM工具时,必要起首通过挪用sp_OACreate成立一个COM工具的实例,然后通过一系列的sp_OAGetProperty、sp_OASetProperty和sp_OAMethod挪用完成必要完成的使命,在完成对COM工具的操纵后,还必要挪用sp_OADestroy开释该工具。在具体地研究每个储存进程时,请留意二个很重要的题目。 第一,必需提供挪用的全部参数,由于自动操纵成果不支持著名参数,假如不能行使一个具体的参数,必要向它转达一个NULL作为占位符;第二,每个挪用返回一个整数范例的HRESULT,假如挪用乐成则该值为0。在后头,我们将接头如那里理赏罚返回值为非。 存储进程 描写 COM操纵必需以挪用sp_OACreate存储进程开始,语法名目如下所示: sp_OACreate progid | clsid, objecttoken OUT.PUT, 第一个参数是措施ID(ProgID━━一个应用措施名.类名情势的字符串,譬喻: Excel.Application,)可能一个类ID(CLSID━━一个nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn情势的环球独一的ID),它标明你但愿建设实例的COM工具。 在也许的环境下,我提议行使ProgID参数,由于它易于输入和影象。你会发明,只有很少的但愿自动操纵的工具没蠵rogID,假如无意碰上这样的工具,就只有行使CLSID了。第二个变量objecttoken也是一个整型变量,一个工具的标志是指向SQL Server建设的工具的句柄和指针,我们必要在随后的对工具的自动操纵中行使这个返回的工具标志来确定这个工具。最后的context变量是可选的,可以强制建设的工具行使某种自动操纵的机制。假如其值为1,则要求工具在一个ActiveX DLL文件中;值为4,则要求工具在ActiveX EXE处事器中;假如是缺省的值5,则可以行使任一自动操纵。在这里我们提议行使缺省的选项,而无须为context参数提供一个适当的值。下面挪用op_OACreate 的呼吁将建设一个微软的Excel措施的实例:
在建设一个工具后,必要获取其一些属性。要获得这些属性,可以通过下面的语法调 在获取这个值是有几种选择,假如该属性是一个单一的值,可以把它存储在一个变量中,可能把它作为一个单行、单字段的功效集;假如属性值是一个一维或二维的数组,则必需把它作为一个功效集;假如假如该属性的值是一个多于二维的数组,sp_OAGetProperty就不能返回它的值,会呈现一个错误。要返回一个功效集,只须简朴地不指定propertyvalue参数的值即可(假如必要它有一个值以便行使index参数,就把NULL赋给它好了。 不然的话,应该赋给propertyvalue一个恰当的范例的值,而且必然要把该参数标志为OUTPUT。假如你会见的属性是一个荟萃,就必要行使index参数指定这个荟萃中一个特定的数字。假如一个工具的属性是另一个工具,就应该把这个工具存入一个整数型变量中,sp_OAGetProperty返回的也是一个工具标志,不外与sp_OACreate返回的并不沟通。我们可以行使这个工具标志对存储进程返回的任何工具举办自动化操纵。下面的呼吁挪用sp_OAGetProperty把一个名字为DefaultFilePath的属性值存入变量@DFP中: Exec sp_OAGetProperty @Object, 'DefaultFilePath', 可以通过如下名目行使sp_OASetProperty存储进程改变一个工具的属性值: sp_OASetProperty objecttoken, propertyname,newvalue [, index] 第一个参数objecttoken是由sp_OACreate返回的,参数Propertyname是要改变的工具的属性名字,Newvalue参数是想赋给属性的新变量,可所以一个变量或一个笔墨值。假如设定的属性值是作为一个荟萃的一个工具,可以行使可选的index参数来指定这个荟萃的一个特定的位置。下面的呼吁挪用sp_OASetProperty把名字为FixedDecimalPlaces的属性配置为6:Exec sp_OASetProperty @Object, 'FixedDecimalPlaces', 6 可以用下面的语法挪用sp_OAMethod存储进程执行一个工具的要领: sp_OAMethod objecttoken, methodname [, returnvalue OUTPUT] [, Sp_OAMethod是最机动的,因而也是最伟大的自动操纵存储进程,我们乃至可以用它象挪用一个要领那样挪用一个属性,并且还能获得一个返回值,虽然,我们也能行使sp_OAGetProperty来完成这一使命。该存储进程的第一个参数objecttoken是由sp_OACreate返回的工具标志,参数methodname是但愿执行的要领的名字,假如该要领有返回值,则下一个参数returnvalue该当是一个包括该要领返回值的恰当范例的变量;假如返回值是一个一维或二维的数组,则用NULL作为一个占位符,该进程将返回一个功效集。该存储进程不能返回一个高出二维的数组作为功效荟萃,在这种环境下,SQL Server就会堕落。假如该要领没有返回范例。 假如挪用的要领必要参数,就必要在挪用sp_OAMethod时提供这些参数。假如要领应承按次序提供参数,则按要求的次序列出每个参数,并用逗号脱离每个参数,还可以用变量或笔墨变量作为参数。假如必要行使著名参数,SQL Server也提供了响应的机制,只需行使:@变量名=变量值 的情势列出所需的变量即可。必要留意的是不要由于有@前缀而把变量名看成局部变量,当挪用存储进程sp_OAMethod时,SQL Server就会理会出@,因此,纵然在挪用的要领中著名字为HostName的参数时,如故可以行使名字为@HostName的局部变量。 下面是二个挪用sp_OAMethod的例子。第一个例子挪用一个名字为CentimetersToPoints的要领,它只接管在@CMVal变量中提供的一个参数,返回的值存储在变量@RetVal中。第二个例子挪用一个名字为MailLogon的要领,它接管三个可选的变量,这个例子中按照名字接管二个变量,把Name配置为字符串"MyUserName",把 Password配置为字符串: Exec sp_OAMethod @Object, 'CentimetersToPoints',@RetVal OUTPUT, @CMVal 不再行使一个工具后,必要通过下面的语法挪用存储进程sp_OADestroy开释对该工具的引sp_OADestroy objecttoken 挪用sp_OADestroy存储进程可以开释由参数objecttoken指定的工具,同时还开释这个工具所行使的内存和其他资源。下面是一个挪用sp_OADestroy的呼吁: Exec sp_OADestroy @Object 必要留意的是,T-SQL中的数据范例与其他的编程说话并非是逐一对应的,在挪用一个必要特定的数据范例的要领时就也许堕落。"数据范例转换"器材条可以将SQL Server的数据。 错误处理赏罚 象在前面提到的那样,假如对存储进程的挪用乐成了,则会返回一个为0的HRESULT值,其他的HRESULT值则意味着产生了错误。要判定一个非零的HRESULT值,可以把HRESULT值传: sp_OAGetErrorInfo [objecttoken] [, source OUTPUT] [, description OUTPUT] 第一个参数objecttoken是由sp_OACreate返回的工具标志。 下面的四个参数返回错误信息。Source是发生这一错误信息的应用措施或库,Description是该错误的描写,假若有辅佐文件的话,则该Helpfile是辅佐文件的路径。这三个参数都是有标记或无标记字符型数据,sp_OAGetErrorInfo会按照界说的变量的巨细截取返回的值。最后一个参数helpid是特定错误在辅佐文件中的索引号。下面的呼吁挪用sp_OAGetErrorInfo以得到某一个错误的更具体的信息: Declare @Source varchar(100), @Description varchar(255), @HelpFile SQL Server在线手册还提供了一个有关sp_DisplayOAErrorInfo存储进程的例子,该存储进程可以挪用sp_OAGetErrorInfo把返回的值组织成名目化的字符串,以便把该信息写入日记文件中。 关于sp_DisplayOAErrorInfo的更具体的信息,请参阅器材条, 其它,挪用sp_OAStop储存进程可以封锁SQL Server的COM自动操尽兴况,它无需任何参数。封锁自动操尽兴况在大大都环境下并非是必须的,第一次挪用sp_OACreate时自动操尽兴况会自动开启,SQL Server封锁时自动操尽兴况也会自动封锁。假如一个存储进程正在对一个工具举办自动操纵,而另一个进程挪用sp_OAStop时就会呈现错误,因此我们不提议在措施中挪用sp_OAStop,只有在调试一个没有运行的进程时,才可以通过一个查询窗口挪用它。 在现实事变中行使COM自动操纵 至此,我们已经进修了怎样行使每一个COM自动操纵存储进程,我们此刻来接头一下一个综合应用它们的例子。措施清单1是一个名字为sp_OpenWordIfCoProcAvailable的进程,在这个进程中,我们用sp_OACreate建设了一个Microsoft Word的实例,然后行使sp_OAGetProperty来获取Word的MathCoProcessorAvailable属性,假如sp_OAGetProperty返回1,则sp_OpenWordIfCoProcAvailable向挪用进程返回Word工具的工具标志;不然, 措施清单 1:自动操纵Word的要领的例子
假如必要对一个行使Visual Basic编写的COM工具举办自动操纵,调试它与SQL Server之间的互操纵性是一件相等轻易的事。我们必要在运行SQL Server的呆板上安装有Visual Basic,在Visual Basic的编辑器中加载COM项目,配置一些断点,然后编译并运行该COM工具。在有存储进程对该工具举办自动操纵时,在运行到一个断点时,编辑器就会自动切换到调试模式,我们就可以象调试其他的Visual Basic措施那样调试这个COM工具。假如要对换试进程实验更多的节制,可以行使T-SQL Debugger for VB插件,它能回收步进方法执行存。 另外,在SQL Server中应用COM自动操纵我们还能作什么呢?下面是我曾行使SQL Server强盛的COM自动操纵成果的现实例子。前不久,我必要从一个SQL Server存储进程中行使一个通过定名管道举办通信,而SQL Server中没有提供通过编程方法打开和行使定名管道的机制,我正好有一个可以行使定名管道通信的VB例和库,因此就把这个库文件作成一个类,并建设了一个ActiveX DLL文件,然后从存储进程中对DLL举办自动操纵。 另一次,我必要复制一些文件和数据库表。行使SQL Server的复制成果可以很利便地复制这些数据,但复制文件则要可贵多,NT的目次同步成果很弱,不能满意要求。尽量我还可以把拷贝呼吁存到字符变量中,然后把变量转达给xp_cmdshell,但会碰着呼吁行长度的限定。更不利便的是,假如在拷贝进程中产生了错误,我不能很利便地判定错误产生在什么处所,因此,我就编写了一个ActiveX DLL,并通过自动操纵它来处理赏罚文件的拷贝事变。 尚有一次,我必要在SQL Server 6.5和Index Server 2.0之间先执行连结后再完成查询使命,假如行使带ADO的Windows 2000 Indexing Services和SQL Server 7.0,完成这样的事变很是简朴,但假如不是行使这些产物,则要坚苦得多。 起首,必要编写一个可以执行Index Server查询工具ixsso.dll的ActiveX DLL,对它举办自动操纵,从Index Server目次中得到信息,并通过一个要领将信息返回到存储进程中。 然后把这些数据生涯到一个姑且表中,再对它举办联络操纵。COM自动操纵再一次帮我办理了题目。在存储进程中执行COM自动操纵险些可以使我们完成任何想完成的操纵。SQL Server 2000中的COM自动操纵没有什么变革,因此回收这种要领编写的代码在未来如故可以行使下去。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |