逍遥一派 发表于 2015-1-16 22:38:25

MSSQL网页编程之在SQL中挪用COM工具

为了在某种程序上弥补这一缺陷,许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。工具
在SQLSERVER中创立OLE工具实例,偶然我们想到数据库中实行存储历程的时分,同时挪用体系中的COM工具。此时我们能够接纳SQL的体系存储历程sp_OACreate,此存储历程的挪用要有必定的权限,只要sysadmin流动服务器脚色的成员才干实行sp_OACreate。

语法
sp_OACreateprogid,|clsid,
objecttokenOUTPUT
[,context]

参数
progid

是要创立的OLE工具的程序标识符(ProgID)。此字符串形貌该OLE工具的类,其情势以下:

OLEComponent.Object

OLEComponent是OLE主动化服务器的组件称号,Object是OLE工具名。指定的OLE工具必需无效而且必需撑持IDispatch接口。

比方,SQLDMO.SQLServer是SQL-DMOSQLServer工具的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-DMOSQLServer工具的CLSID。

objecttokenOUTPUT

是前往的工具令牌,而且必需是数据范例为int的部分变量。该工具令牌用于标识所创立的OLE工具,并将在挪用别的OLE主动化存储历程时利用。

context

指定新创立的OLE工具要在个中运转的实行高低文。假如指定,那末此值必需为以下值之一:

1=仅为历程内(.dll)OLE服务器
4=仅为当地(.exe)OLE服务器
5=历程内OLE服务器和当地OLE服务器都可

假如未指定,其默许值为5。此值将在挪用CoCreateInstance时作为dwClsContext参数传送。

若同意利用历程内OLE服务器(经由过程利用高低文值1或5大概不指定高低文值),该服务器将能够会见SQLServer具有的内存和别的资本。历程内OLE服务器大概会损坏SQLServer的内存或资本并招致不成预知的了局,如SQLServer会见背规。

当高低文值指定为4时,当地OLE服务器不克不及会见任何SQLServer资本,因此不克不及损坏SQLServer的内存或资本。



申明此存储历程的参数按地位指定,而不是按称号指定。


前往代码值
0(乐成)或非零数字(失利),是由OLE主动化工具前往的HRESULT的整数值。

我们来看一下一个详细的示例,在此示例中我们将挪用一个本人写的COM组件,此组件的功效是供应读写序列号的功效。

CREATEPROCEDURE.
@ENCRYPTIONnvarchar(255)out,@typeintout
AS
DECLARE@objectint
DECLARE@hrint
DECLARE@propertyvarchar(255)
DECLARE@returnvarchar(255)
DECLARE@srcvarchar(255),@descvarchar(255)

--创立一个COM工具
EXEC@hr=sp_OACreateSecuritySN.CSecurity,@objectOUT
IF@hr0
BEGIN
set@ENCRYPTION=err
RETURN
END

--挪用办法
declare@aanvarchar(255)--终极前往的值
EXEC@hr=sp_OAMethod@object,GetDiskSN,@aaout
IF@hr0
BEGIN
set@ENCRYPTION=err
RETURN
END
else
begin
set@Type=8--指明注册读取体例
end

---------------------
if@aa=
begin
--再读一次
EXEC@hr=sp_OAMethod@object,GetSNByAPI,@aaout
if@hr0
begin
set@ENCRYPTION=err
RETURN
end
else
begin
set@Type=5--指明是哪一种体例读取注册号的
end
end

--烧毁此工具
EXEC@hr=sp_OADestroy@object
IF@hr0
BEGIN
set@ENCRYPTION=err
RETURN
END
set@ENCRYPTION=@aa
GO


为了避免用户修正存储历程的代码。我们能够将此存储历程举行加密处置。可是加密后的存储历程也大概被破译出来。
导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。

小妖女 发表于 2015-1-19 20:03:48

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

莫相离 发表于 2015-1-28 10:19:38

XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)

飘飘悠悠 发表于 2015-2-5 20:38:25

需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。

因胸联盟 发表于 2015-2-13 13:19:40

这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。

再见西城 发表于 2015-3-3 21:59:14

光写几个SQL实在叫无知。

飘灵儿 发表于 2015-3-11 14:12:04

原来公司用过MYSQL自己也只是建个表写个SQL

谁可相欹 发表于 2015-3-18 22:49:55

入门没那么困难,精通没那么容易

金色的骷髅 发表于 2015-3-26 20:06:13

其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
页: [1]
查看完整版本: MSSQL网页编程之在SQL中挪用COM工具