直接上代码吧Option ExplicitPrivate Sub Command1_Click()
    
    Dim MyComm As New ADODB.Command
    Dim Rs_GetList As New ADODB.Recordset
    
    With MyComm
    .ActiveConnection = Cn           'MarketConn是数据库连接字串
    .CommandText = "pp(3)" '" 'SP_Ping_Dialtest"              '指定存储过程名
    .CommandType = adCmdStoredProc                        '表明这是一个存储过程
    .Prepared = True                        '要求将SQL命令先行编译
'    .Parameters(1) = "1"
    Set Rs_GetList = .Execute    End With
    'Set Rs_GetList = Cn.Execute("call pp()")
    While Not Rs_GetList.EOF
        Debug.Print Rs_GetList.Fields(0).Value
        Rs_GetList.MoveNext
    Wend
End Sub上面是VB的代码。CN通过数据源和MYSQL联系起来下面是存储过程的代码
[code=SQL]
create procedure PP(a int)
begin
     select * from t where s1>a;
end
[/code]t表的记录(1,2,3,4)======================================================
问题:
调用方法1:CommandText = "pp(3)"   参数带到这里,既然这样,那和STRSQL直接传SQL命令进去有什么不同
调用方法2:'    .Parameters(1) = 1  参数传递进去后,在最后    Set Rs_GetList = .Execute的时候就报错了。对于VB调用MYSQL的存储过程,是不是只能用命令,把参数全部写到命令字符串里面??

解决方案 »

  1.   

    调用方法1:CommandText = "pp(3)"  参数带到这里,既然这样,那和STRSQL直接传SQL命令进去有什么不同 前者在服务器运行,如果有100条语句要运行就知道有什么不同了吧?
      

  2.   

    对于VB调用MYSQL的存储过程,是不是只能用命令,把参数全部写到命令字符串里面??
    不是,调用的是一个可带参数的子程序,也可不带,子程序在服务器里,只是让它执行起来
      

  3.   

    这样传递参数是不正确的,添加参数方法如下: Dim param As ADODB.Parameter
    Set param = cmd.CreateParameter("@a", adInteger, adParamInput, 4, 1)
    cmd.Parameters.Append param
      

  4.   


    感谢VBMAN2003,搞定了。。我整理下,做一个通用的模板出来。。
      

  5.   

    做了一些简单注释。代码如下。Private Sub Command1_Click()
        
        Dim MyComm As New ADODB.Command      '定义一个命令对象
        Dim Rs_GetList As New ADODB.Recordset '定义一个记录集对象
        Dim param As ADODB.Parameter         '定义一个参数对象
        
        With MyComm
            .ActiveConnection = Cn           '数据连接
            .CommandText = "pp"              '存储过程名称
            .CommandType = adCmdStoredProc   '表明这是一个存储过程
            .Prepared = True                 '要求将SQL命令先行编译
            Set param = .CreateParameter("@a", adInteger, adParamInput, 4, 3)   '申明一个参数
            .Parameters.Append param         '把参数添加到参数列表里
            Set Rs_GetList = .Execute        '执行此存储过程,返回记录集
        End With
        
        While Not Rs_GetList.EOF             '循环打印记录集的字段
            Debug.Print Rs_GetList.Fields(0).Value
            Rs_GetList.MoveNext
        WendEnd Sub
    抛砖引玉。
      

  6.   

    虽然SQL存储过程我用的比较少。不过我对数据库数据的处理,一般习惯尽量用参数化的方式,即使是ACCESS也是如此。参数化将变量作为对象来处理,一是安全,二是更加可靠....只是代码量可能会多一点,不过我自己感受是代码不容易出错,好写,好查...断断续续的想过,要是能写一个高效的通用过程就好了,一直没有好思路...
      

  7.   

    新问题,借老帖子发吧。省点分;
    直接贴代码;drop procedure IF EXISTS `pp`;  create procedure PP(a int)
    begin
    DECLARE v int;
            set v=(select SUM(case when s1 >2 then 1 else 0 end )from t);
            select * from t where s1>v;
    end我想做一个SQL文件,导入后,直接执行,就创建一个存储过程,这个里面需要判断是否已经存在此过程现在的问题是。第一行的判断语句和下面的,不能一次执行。贴出来的代码就是我这个SQL文件的全部,执行错误,单独执行,先执行检查重复的,再执行创建代码,可以执行。。怎么样做到一起呀??
      

  8.   

    参考创建表的SQL命令DROP TABLE IF EXISTS `sys_dictionary`;
    CREATE TABLE `sys_dictionary` (
      `SYS_DICTIONARY_ID` int(8) NOT NULL,
      `NAME` varchar(50) default NULL,
      `REMARKS` varchar(1000) default NULL,
      `PARENT_ID` int(8) default NULL,
      `SORT` int(8) default NULL,
      `ISFLAG` char(1) default NULL,
      `SIGN` varchar(50) default NULL,
      `SYS_VALUE` varchar(50) default '',
      PRIMARY KEY  (`SYS_DICTIONARY_ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
    这里咋可以啊。VBMAN,帮忙看下。。
      

  9.   

    补充一个问题:
    MYSQL的存储过程,可以进行加密发布吗?
      

  10.   

    mssql可以在系统表里查询一个存储过程是否存在....我想mysql应该一样道理吧...
      

  11.   

    我觉得LZ可以借机学学PHP
    因为PHP+mysql是比较完美的