我的有问题的工程可以从这里下载到:http://www.cmddos.cn/store-err.rar
就是,我想从存储过程中查询手机号码为13000000000的这条记录并返回到recordset中。ReportDayTotal_SDYC 是存储过程。问题是:
我需要传递参数到存储过程中,第一种代码如下:
Dim Cn As New ADODB.ConnectionDim cmd As New ADODB.Command
Dim param As New ADODB.Parameter'上面这三行是窗体公共部分Private Sub Command1_Click()
Set cmd.ActiveConnection = CnDim rs As New ADODB.Recordset
rs.CursorLocation = adUseClient
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "ReportDayTotal_SDYC"
cmd.Parameters(1) = "2008-9-25 00:00:00"
cmd.Parameters(2) = "2008-9-25 12:00:00"
cmd.Parameters(3) = 0
cmd.Parameters(5) = "13000000000"
cmd.Executers.Open "ReportDayTotal_SDYC", Cn, adOpenDynamic, adLockOptimistic
Set rs = cmd.ExecuteEnd Sub错误停留在rs.open这一行。错误提示是 没有给begindatetime赋值。但是cmd.Parameters(1)这一个不是给他赋值吗?第二种做法:
  Private Sub Command2_Click()    Dim cmd As ADODB.Command 'Command对象
    Dim para As ADODB.Parameter '参数
    Dim rs As New ADODB.Recordset  '记录集
    rs.CursorLocation = adUseClient
    Set cmd = New ADODB.Command '实例化命令对象
    Set cmd.ActiveConnection = Cn '指定连接
    cmd.CommandText = "存储过程名" '指定要执行的存储过程
    cmd.CommandType = adCmdStoredProc '指定命令类型为存储过程    Set para = cmd.CreateParameter() '实例化参数
    para.Name = "@BeginDateTime" '参数名称,这里用你自己存储过程中的参数名代码
    para.Type = adDBTime '指定参数类型
    para.Value = "2008-9-25 00:00:00" '指定参数值    Set para = cmd.CreateParameter() '实例化参数
    para.Name = "@EndDateTime" '参数名称,这里用你自己存储过程中的参数名代码
    para.Type = adDBTime '指定参数类型
    para.Value = "2008-9-25 12:00:00" '指定参数值    Set para = cmd.CreateParameter() '实例化参数
    para.Name = "@PayTypeID" '参数名称,这里用你自己存储过程中的参数名代码
    para.Type = adInteger '指定参数类型
    para.Value = 1 '指定参数值
    rs.Open "ReportDayTotal_SDYC", Cn, adOpenDynamic, adLockOptimistic
    Set rs = cmd.Execute() '执行存储过程,如果不返回记录集的,可以写成 cmd.Execute
    Set DataGrid1.DataSource = rs
End Sub错误也是停留在 rs.open 这一行。希望大侠赐教了。谢谢。郁闷了快2天了。

解决方案 »

  1.   

    存储过程有几个参数便要有几个参数,不太会使用ado了,创建参数并不是就将参数加入到命令对象的.
      

  2.   

    Dim mRst As ADODB.Recordset 'Recordset 对象表示的是来自基本表或命令执行结果的记录全集。
    Dim prm As ADODB.Parameter 'Parameter 对象代表参数或与基于参数化查询或存储过程的Command 对象相关联的参数。
    adoconn.ConnectionString = Adodc1.ConnectionString 
    adoconn.Open
    Set adocomm.ActiveConnection = adoconn 
    adocomm.CommandText = "doc_ProcName" 
    adocomm.CommandType = adCmdStoredProc 
    Set prm = adocomm.CreateParameter("parameter1", adTinyInt, adParamInput, , "1")
    adocomm.Parameters.Append prm
    Set prm = adocomm.CreateParameter("parameter2", adInteger, adParamOutput)
    adocomm.Parameters.Append prm
    Set mRst = adocomm.Execute
    ReturnValue = adocomm.Parameters(0) 
      

  3.   

    通过Append方法将创建的参数追加到Parameters集合中去
      

  4.   

    但是,我在用rs调用的时候,就提示对象已关闭了。无法调用。现在出现了新的问题。但貌似更清晰了。问题如下:已经事先连接了 cn 并且没有关闭过。 
    ReportDayTotal_SDYC是存储过程名字。 
    我的目的是:查询手机号码为13000000000 的记录。把记录结果返回到rs中。也就是我可以用rs.fields(X)得到我想要的某一字段。 
    下面是代码,错误提示后面说 
    Private Sub Command3_Click() 
    Dim strS As String '定义一变量 
    Dim rs As New ADODB.Recordset 
    Dim adocomm As New ADODB.Command ' 
    Set adocomm.ActiveConnection = Cn 
    With adocomm 
    .CommandText = "ReportDayTotal_SDYC" 
    .CommandType = adCmdStoredProc 
    .Parameters(1) = "2008-9-25 00:00:00" 
    .Parameters(2) = "2008-9-25 12:00:00" 
    .Parameters(3) = 1 
    .Parameters(5) = "13000000000" 
    Set rs = .Execute() 
    '到这里是没有任何错误提示的。 '问题出在这里: 
    rs.Open "reportdaytotal_sdyc", Cn, adOpenDynamic, adLockOptimistic 
    MsgBox rs.RecordCount 
    End With 
    End Sub 问题出在最后这2行语句,返回到rs之后,我要用rs.fields(X)来调用想要查询的字段,但是提示对象已关闭。于是我就 rs.open 这一句,结果这一句老是出现错误提示:多步oledb操作产生错误。 请问:我如何输出想要的值?需要不需要rs.open语句? 如果看不懂我说的什么,那麻烦写一下按条件查询的语句也可以。多谢了。条件是: 查询手机号码为13000000000 的记录。把记录结果返回到rs中。也就是我可以用rs.fields(X)得到我想要的某一字段。 
      

  5.   

    set rs = adocomm.execute("exec 存储过程名称(参数1,参数2....)")这样试试,看着有点乱还有,多步oledb操作产生错误一般是由于没有主键产生的,楼主可以去检查一下
      

  6.   

    With adocomm 
    .CommandText = "ReportDayTotal_SDYC" 
    .CommandType = adCmdStoredProc 
    .Parameters(1) = "2008-9-25 00:00:00" 
    .Parameters(2) = "2008-9-25 12:00:00" 
    .Parameters(3) = 1 
    .Parameters(5) = "13000000000" 
    Set rs = .Execute() 
    '到这里是没有任何错误提示的。 
    MsgBox rs.RecordCount 
      

  7.   

    9楼朋友
    With adocomm 
    .CommandText = "ReportDayTotal_SDYC" 
    .CommandType = adCmdStoredProc 
    .Parameters(1) = "2008-9-25 00:00:00" 
    .Parameters(2) = "2008-9-25 12:00:00" 
    .Parameters(3) = 1 
    .Parameters(5) = "13000000000" 
    Set rs = .Execute() 
    '到这里是没有任何错误提示的。 
    MsgBox rs.RecordCount 如果这样的话,会提示对象已关闭。是指rs关闭状态。
      

  8.   


    在你的代码后面加msgbox mrst.recordcount 会提示没有找到项目。
      

  9.   

    完全按照你的来写,然后我来调用数据。因为你的代码已经把数据返回到记录集mrst中了,所以我msgbox mrst.recordcount 结果出现了错误,对象关闭。这里的对象一定是mrst了。请问如何解决?