找回密码
 加入
搜索
查看: 36218|回复: 84

[原创] Au3调用存储过程事例

 火... [复制链接]
发表于 2011-6-10 19:13:19 | 显示全部楼层 |阅读模式
本帖最后由 bob 于 2011-6-10 19:39 编辑

不要问我存储过程是个什么东东有什么用途,百度、Google可回答一切!

测试环境:
系统: 瘟逗死 XP  
软件: autoit(3.3.6.1)  
数据库系统: mssql 2000
数据库: mssql2000 自带的 Pubs ,没有的或有问题的可先删除在执行本附件中的 instpubs.sql 安装

根据存储过程输入输出调用方法,简单分为以下7种类型

1、返回单一记录集的存储过程
存储过程如下
CREATE PROCEDURE getEmployee
    as
    set nocount on
    begin
       select * from employee
    end
    go
au3代码如下:

Dim $sServer = '192.168.1.249', $sUsername = 'sa', $sPassword = '',$sDatabase = 'Pubs' ;四个变量分别是连接数据库用的地址、账号、密码及所使用数据库名

$Comm = ObjCreate("ADODB.Command") ;建一个command对象
With $Comm
    .ActiveConnection = "DRIVER={SQL Server};SERVER=" & $sServer & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";Database=" & $sDatabase & "" ;建立连结
    .CommandText = 'getEmployee' ;定义command 对象调用名称,即存储过程名称
        .CommandType = 4   ;设置command调用类型是存储过程
        .Prepared = True ;将SQL命令先行编译
EndWith

$Rs = $Comm.Execute ;存储过程取得的记录集赋给$Rs

MsgBox(0,0,$Rs.Fields (0).value)

在以上代码中,CommandType属性表明请求的类型,取值及说明如下:
        -1   表明CommandText参数的类型无法确定
        1    表明CommandText是一般的命令类型
        2    表明CommandText参数是一个存在的表名称
        4    表明CommandText参数是一个存储过程的名称


2、无输入输出的存储过程
调用方法与上面讲过的基本相同,只是不用取得记录集,不做例子了

游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1威望 +10 金钱 +50 贡献 +20 收起 理由
pusofalse + 10 + 50 + 20 学习了。

查看全部评分

 楼主| 发表于 2011-6-10 19:13:53 | 显示全部楼层
本帖最后由 bob 于 2011-6-10 19:58 编辑

3、带返回值的存储过程
存储过程
CREATE PROCEDURE dbo.delUser
    as
    set nocount on
    begin
       BEGIN TRANSACTION
       delete from employee where fname='bob'
       IF @@error=0 
          begin
             COMMIT TRANSACTION
             return 1
          end
       ELSE
          begin
             ROLLBACK TRANSACTION
             return 0
          end         
       return
    end
    go
以上存储过程,在delete顺利执行时,返回1,否则返回0,并进行回滚操作。
au3代码

Dim $sServer = '192.168.1.249', $sUsername = 'sa', $sPassword = '',$sDatabase = 'Pubs' ;四个变量分别是连接数据库用的地址、账号、密码及所使用数据库名

$Comm = ObjCreate("ADODB.Command") ;建一个command对象
With $Comm
    .ActiveConnection = "DRIVER={SQL Server};SERVER=" & $sServer & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";Database=" & $sDatabase & "" ;建立连结
    .CommandText = 'delUser' ;定义command 对象调用名称,即存储过程名称
        .CommandType = 4   ;设置command调用类型是存储过程
        .Prepared = True ;将SQL命令先行编译
EndWith

;声明返回值
$Comm.Parameters.Append($Comm.CreateParameter("RETURN",2,4))
$Comm.Execute

;取得返回值
$retValue = $Comm(0)    ;或$retValue = $Comm.Parameters(0)
MsgBox(0,0,$retValue.value)


在$Comm.CreateParameter("RETURN",2,4)中,各参数的含义如下:
    第一个参数("RETURE")为参数名。参数名可以任意设定,但一般应与存储过程中声明的参数名相同。此处是返回值,我习惯上设为"RETURE";
   
        第二个参数(2),表明该参数的数据类型,具体的类型代码请参阅ADO参考,以下给出常用的类型代码:
    adBigInt: 20 ;
    adBinary : 128 ;
    adBoolean: 11 ;
    adChar: 129 ;
    adDBTimeStamp: 135 ;
    adEmpty: 0 ;
    adInteger: 3 ;
    adSmallInt: 2 ;
    adTinyInt: 16 ;
    adVarChar: 200 ;
    对于返回值,只能取整形,且-1到-99为保留值;
   
        第三个参数(4),表明参数的性质,此处4表明这是一个返回值。此参数取值的说明如下:
    0 : 类型无法确定; 1: 输入参数;2: 输入参数;3:输入或输出参数;4: 返回值
 楼主| 发表于 2011-6-10 19:13:58 | 显示全部楼层
本帖最后由 bob 于 2011-6-10 20:03 编辑

4、带输入输出参数的存储过程
存储过程
CREATE PROCEDURE getEmp_id
       @emp_id char(9),
       @fname varchar(20) output
    as
    set nocount on
    begin
       if @emp_id is null return
       select @fname=fname from employee where emp_id=@emp_id
       return
    end
go
au3代码如下

Dim $sServer = '192.168.1.249', $sUsername = 'sa', $sPassword = '',$sDatabase = 'Pubs' ;四个变量分别是连接数据库用的地址、账号、密码及所使用数据库名
$empid = 'F-C16315M'

$Comm = ObjCreate("ADODB.Command") ;建一个command对象
With $Comm
    .ActiveConnection = "DRIVER={SQL Server};SERVER=" & $sServer & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";Database=" & $sDatabase & "" ;建立连结
    .CommandText = 'getFname' ;定义command 对象调用名称,即存储过程名称
        .CommandType = 4   ;设置command调用类型是存储过程
        .Prepared = True ;将SQL命令先行编译
        .Parameters.append (.CreateParameter('@emp_id',129,1,9,$empid))
        .Parameters.append (.CreateParameter('@fname',200,2,20))
        .Execute
EndWith

 ;获取输出
 $Fname = $Comm(1)
 MsgBox(0,0, $Fname.value)


在以上代码中,可以看到,与声明返回值不同,
声明输入参数时需要5个参数,声明输出参数时需要4个参数。
声明输入参数时5个参数分别为:参数名、参数数据类型、参数类型、数据长度、参数值。
声明输出参数时,没有最后一个参数:参数值。
需要特别注意的是:在声明参数时,顺序一定要与存储过程中定义的顺序相同,而且各参数的数据类型、长度也要与存储过程中定义的相同。
 楼主| 发表于 2011-6-10 19:14:02 | 显示全部楼层
本帖最后由 bob 于 2011-6-16 10:25 编辑

5. 同时具有返回值、输入参数、输出参数的存储过程
存储过程
CREATE PROCEDURE getFname2
       @emp_id char(9),
       @fname varchar(20) output
    as
    set nocount on
    begin
       if @emp_id is null return
       select @fname=fname from employee where emp_id=@emp_id
       if @@rowcount>0 --@@rowcount返回上一语句受影响的行数
          return 1
       else
          return 0
       return
    end
go
au3代码

Dim $sServer = '192.168.1.249', $sUsername = 'sa', $sPassword = '',$sDatabase = 'Pubs' ;四个变量分别是连接数据库用的地址、账号、密码及所使用数据库名
$empid = 'F-C16315M'

$Comm = ObjCreate("ADODB.Command") ;建一个command对象
With $Comm
    .ActiveConnection = "DRIVER={SQL Server};SERVER=" & $sServer & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";Database=" & $sDatabase & "" ;建立连结
    .CommandText = 'getFname2' ;定义command 对象调用名称,即存储过程名称
        .CommandType = 4   ;设置command调用类型是存储过程
        .Prepared = True ;将SQL命令先行编译
        .Parameters.Append  (.CreateParameter("RETURN",2,4)) ;返回值要最先被声明
        .Parameters.append (.CreateParameter('@emp_id',129,1,9,$empid))
        .Parameters.append (.CreateParameter('@fname',200,2,20))
        .Execute
EndWith

 ;获取输出
If $Comm(0).value = 1 then
       MsgBox(0,'输入'&$Comm(1).value, '输出'&$Comm(2).value)
    else
       MsgBox(0,'错误提示','对应输入在数据库不存在')
EndIf


在以上代码中,可以看到,与声明返回值不同,
声明输入参数时需要5个参数,声明输出参数时需要4个参数。
声明输入参数时5个参数分别为:参数名、参数数据类型、参数类型、数据长度、参数值。
声明输出参数时,没有最后一个参数:参数值。
需要特别注意的是:在声明参数时,顺序一定要与存储过程中定义的顺序相同,而且各参数的数据类型、长度也要与存储过程中定义的相同。
 楼主| 发表于 2011-6-10 19:14:06 | 显示全部楼层
占楼待续(请斑竹勿删)
 楼主| 发表于 2011-6-10 19:14:11 | 显示全部楼层
占楼待续(请斑竹勿删)
发表于 2011-6-10 19:44:21 | 显示全部楼层
占楼看楼主作品
发表于 2011-6-11 01:09:22 | 显示全部楼层
看架势一篇强帖即将诞生,远处观摩,以免误伤!!!
发表于 2011-6-11 16:23:23 | 显示全部楼层
楼主之效率,快!

佩服。。。。。
发表于 2011-6-11 22:07:13 | 显示全部楼层
我首先还真不知道存储过程是什么....有的学习了...首下先
发表于 2011-6-13 22:08:53 | 显示全部楼层
正是我需要的 一条条 SQL 不如调用过存储过程来得效率高!
发表于 2011-6-15 12:54:44 | 显示全部楼层
好像在MSSQL 2005不行!
输入 输出  !返回的输出值怎么试都是0!
还望楼主解答一下!
发表于 2011-6-15 13:14:02 | 显示全部楼层
强贴留名!这东东要顶!ADO还有这个东东!
 楼主| 发表于 2011-6-16 08:19:57 | 显示全部楼层
好像在MSSQL 2005不行!
输入 输出  !返回的输出值怎么试都是0!
还望楼主解答一下!
qzdisk 发表于 2011-6-15 12:54


能把存储过程及AU3代码写下吗,应该不会有多大出入的
我这成品都有了
发表于 2011-6-16 10:00:40 | 显示全部楼层
学习一下,不错。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-20 16:58 , Processed in 0.081570 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表