bob 发表于 2011-6-10 19:13:19

Au3调用存储过程事例

本帖最后由 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
    goau3代码如下:

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、无输入输出的存储过程
调用方法与上面讲过的基本相同,只是不用取得记录集,不做例子了

**** Hidden Message *****

bob 发表于 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: 返回值

bob 发表于 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
goau3代码如下

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个参数分别为:参数名、参数数据类型、参数类型、数据长度、参数值。
声明输出参数时,没有最后一个参数:参数值。
需要特别注意的是:在声明参数时,顺序一定要与存储过程中定义的顺序相同,而且各参数的数据类型、长度也要与存储过程中定义的相同。

bob 发表于 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
goau3代码

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个参数分别为:参数名、参数数据类型、参数类型、数据长度、参数值。
声明输出参数时,没有最后一个参数:参数值。
需要特别注意的是:在声明参数时,顺序一定要与存储过程中定义的顺序相同,而且各参数的数据类型、长度也要与存储过程中定义的相同。

bob 发表于 2011-6-10 19:14:06

占楼待续(请斑竹勿删)

bob 发表于 2011-6-10 19:14:11

占楼待续(请斑竹勿删)

xulinghai 发表于 2011-6-10 19:44:21

占楼看楼主作品

komaau3 发表于 2011-6-11 01:09:22

看架势一篇强帖即将诞生,远处观摩,以免误伤!!!

漠北雪~狼 发表于 2011-6-11 16:23:23

楼主之效率,快!

佩服。。。。。

suiyefeng 发表于 2011-6-11 22:07:13

我首先还真不知道存储过程是什么....有的学习了...首下先

qzdisk 发表于 2011-6-13 22:08:53

正是我需要的 一条条 SQL 不如调用过存储过程来得效率高!

qzdisk 发表于 2011-6-15 12:54:44

好像在MSSQL 2005不行!
输入 输出!返回的输出值怎么试都是0!
还望楼主解答一下!

benkel 发表于 2011-6-15 13:14:02

强贴留名!这东东要顶!ADO还有这个东东!

bob 发表于 2011-6-16 08:19:57

好像在MSSQL 2005不行!
输入 输出!返回的输出值怎么试都是0!
还望楼主解答一下!
qzdisk 发表于 2011-6-15 12:54 http://www.autoitx.com/images/common/back.gif

能把存储过程及AU3代码写下吗,应该不会有多大出入的
我这成品都有了

menfan1 发表于 2011-6-16 10:00:40

学习一下,不错。
页: [1] 2 3 4 5 6
查看完整版本: Au3调用存储过程事例