快给分!各位大狭快就我!

解决方案 »

  1.   

    Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim cmd As New ADODB.Command
        Dim str As String
        
        str = "{call ado_callpkg.getEmpNames({resultset 100,empid,empname})}"
        cn.Open "Provider=MSDAORA.1;Password=tiger;User ID=scott;Data Source=ORACLE;Persist Security Info=True"
        With cmd
            .CommandText = str
            .ActiveConnection = cn
            .CommandType = adCmdText
        End With
        
        rs.CursorLocation = adUseClient
        rs.Open cmd
        Do While Not rs.EOF
        
            Debug.Print rs.Fields(0).Value & vbTab & rs.Fields(1).Value
            rs.MoveNext
        Loop------------总结
    1 oracle的后台存储过程,应该通过一个类似数组并且带有数字索引的变量返回,有多少个列,就有对应多少个变量
     前台,调用的sql语句写法要注意,
    {call <package_name>.<prodecure name>(<input1>,<input2>,....<inputn>,{resultset <number>,<output1>,<output2>,...<outputn>})}
    注意的细节,
    (1) <number>要自己指定一个数字,表示接受的行数大小,如果太小,而实际返回的记录大于这个数字,会出错
    (2) 如果有输入参数,应该在command中创建输入参数,对应的地方用?替代,如
    {call ado_callpkg.getEmpNames(?,{resultset 100,empid,empname})}
    (3) output和你存储函数的定义一致,参数名要一样,次序也一样,否则也会出错。以上是oracle的下面是sqlserver的
    ---- 1. 创建、调试存储过程。你可以在数据库中也可以在其他外挂程序的支持下进行存储过程的创建和调试工作。本例中的存储过程代码如下(使用PUBS的MS SQL中的例子库 ): CREATE PROCEDURE myprocedure 
    @job_id smallint, 
    @job_lvl tinyint 
    AS 
    SELECT * 
    FROM employee 
    WHERE job_id < @job_id 
    AND job_lvl > @job_lvl 
    ---- 2. 在VB中生成一个新的工程,工程有一窗体,一个COMMAND(NAME:COMMAND1) 按钮,一个 MSFlexGrid(NAME:MSFlexGrid1)控件。 
    ---- 3. 创建连接ADO connection; ---- 4. 创建命令ADO command; ---- 5. 创建参数并设置各个参数的属性; ---- 6. 执行ADO command; ---- 7. 对数据进行处理;MSFlexGrid显示查询到的数据 ---- 8. 释放连接,退出程序。 ---- 其中代码如下: 在窗体中声明以下变量: 
    Dim cnn1 As ADODB.Connection ‘连接 
    Dim mycommand As ADODB.Command ‘命令 
    Dim parm_jobid As ADODB.Parameter ‘参数1 
    Dim parm_joblvl As ADODB.Parameter ‘参数2 
    Dim rstByQuery As ADODB.Recordset ‘结果集 
    Dim strCnn As String ‘连接字符串 在窗体的LOAD事件中加入如下代码: 
    Set cnn1 = New ADODB.Connection 
    ‘生成一个连接 
    strCnn = "DSN=MYDSN;uid=sa;pwd=" 
    ‘创建的系统数据源MYDSN指向PUBS数据库 
    cnn1.Open strCnn ‘打开连接 
    在窗体的UNLOAD中的加入代码如下: 
    cnn1.Close ‘关闭连接 
    Set cnn1 = Nothing ‘释放连接 在按钮中的代码如下: 
    Dim i As integer 
    Dim j as integer 
    Set parm_jobid = New ADODB.Parameter 
    Set mycommand = New ADODB.Command 
    ' parm_jobid.Name = "name1" 
    this line can be ommited 
    parm_jobid.Type = adInteger ‘参数类型 
    parm_jobid.Size = 3 ‘参数长度 
    parm_jobid.Direction = adParamInput 
    ‘参数方向,输入或输出 
    parm_jobid.value = 100 ‘参数的值 
    mycommand.Parameters.Append 
    parm_jobid ‘加入参数 
    Set parm_joblvl = New ADODB.Parameter 
    ‘parm_joblvl.Name = "name2" 
    parm_joblvl.Type = adInteger 
    parm_joblvl.Size = 3 
    parm_joblvl.Direction = adParamInput 
    mycommand.value = 100 
    mycommand.Parameters.Append parm_joblvl 
    mycommand.ActiveConnection = cnn1 
    ‘指定该command 的当前活动连接 
    mycommand.CommandText = " myprocedure " 
    ‘myprocedure 是你要调用的存储过程名称 
    mycommand.CommandType = adCmdStoredProc 
    ‘表明command 为存储过程 
    Set rstByQuery = New ADODB.Recordset 
    Set rstByQuery = mycommand.Execute() 
    i = 0 
    Do While Not rstByQuery.EOF 
    i = i + 1 ‘ i 中保存记录个数 
    rstByQuery.MoveNext 
    Loop 
    MSFlexGrid1.Rows = i + 1 
    ‘动态设置MSFlexGrid的行和列 
    MSFlexGrid1.Cols = rstByQuery.Fields.Count + 1 
    MSFlexGrid1.Row = 0 
    For i = 0 To rstByQuery.Fields.Count - 1 
    MSFlexGrid1.Col = i + 1 
    MSFlexGrid1.Text = rstByQuery.Fields.Item(i).Name 
    Next ‘设置第一行的标题,用域名填充 i = 0 
    Set rstByQuery = mycommand.Execute() 
    Do While Not rstByQuery.EOF 
    i = i + 1 
    MSFlexGrid1.Row = i ‘确定行 
    For j = 0 To rstByQuery.Fields.Count - 1 
    MSFlexGrid1.Col = j + 1 
    MSFlexGrid1.Text = rstByQuery (j) 
    ‘添充所有的列 
    Next 
    rstByQuery.MoveNext Loop ‘这个循环用来填充MSFlexGrid的内容 ---- 特殊说明 
    ---- 1. Set recordset = command.Execute( RecordsAffected, Parameters, Options ) command.Execute RecordsAffected, Parameters, Options 这是command的两种用法,一种有返回结果集,一种没有返回结果集。 ---- RecordsAffected:是指用update、delete操作时所影响的结果,对select的查询,其值为-1;这和在Ms sql server 中的Query Analyzer中的不一样。Query Analyzer中,select、update、delete的结果显示的是实际查、改、删的记录数。 ---- Options:指明command的类型,有adCmdText、adCmdTable、adCmdStoredProc等等,用户可见MSDN。 ---- 2.在参数的类型中,用户可以用varchar来代替integer,系统会帮你自动实施转化; ---- 3.本例中仅为带输入参数的存储过程,如果要有输出参数,根据MSDN的材料,用ADO不行。你可以用RDO数据对象,MSDN中有一个例子,此处不做过多赘述; ---- 4.可以不用ADO COMMAND对象,也可直接调用ADO CONNECTION的execute方法,结果很类似。
      

  2.   

    所用参数是输入参数吧,要返回参数要定义为OUTPUT