Dim rs As New ADODB.Recordset    Dim Cmd As Command
    Dim param As ADODB.Parameter
     Set Cmd = New Command
    Cmd.ActiveConnection = db   'db 是连接字符串    Cmd.CommandText = "P_PayRents"
    Cmd.CommandType = adCmdStoredProc  
    Set param = Cmd.CreateParameter("aa", adDate, adParamInput, 10, DTPicker1.Value)  'DTPicker1.Value 是一个日期控件
    Cmd.Parameters.Append param    Set rs = Cmd.Execute错误提示
         运行错误 ‘3704’
         对象关闭时,不能访问
       
就是 rs 没有打开

解决方案 »

  1.   

    Cmd.ActiveConnection = db
    这个db应该是数据库连接 不是字符串
    看看你的con打开了吗
      

  2.   

    rs实例化一下Dim rs As ADODB.Recordsetset rs=new adodb.recordset
      

  3.   

    依楼的意思程序应该是已经执行到了Set rs = Cmd.Execute这一句,也就是说Cmd.ActiveConnection = db是没有问题的
    从所给的代码中确实是难看出问题来
    不如把这个过程的代码贴全再让大家看看
      

  4.   

    Cmd.ActiveConnection = db
    -----------------------------
    不知道你的连接串是否正确呀?你可以先建个连接对象,用这个连接串连接一下,
    看一下state属性是否为 adstateopen
      

  5.   

    存储过程如下,在查询分析器返回正确结果,好像是 rs 不能读取临时表的数据CREATE PROCEDURE P_PayRents
    (
    @date as smalldatetime
    )
        AS create table #Rent
    (
    [PayRentRe] [varchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [PayRent] [smallmoney] NOT NULL ,
    [HouseAddress] [varchar] (60) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [OwnerName] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [OwnerPhone] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [OwnerBankName] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [OwnerAccount] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [OwnerAccountName] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [OwnerContractId] [char] (15) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [RenterContractId] [char] (15) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [PayRent_id] [int]  NOT NULL
    )insert into #Rent
    SELECT dbo.PayRent.PayRentRe, dbo.PayRent.PayRent, dbo.Owner.HouseAddress, 
          dbo.Owner.OwnerName, dbo.Owner.OwnerPhone, dbo.Owner.OwnerBankName, 
          dbo.Owner.OwnerAccount, dbo.Owner.OwnerAccountName, 
          dbo.PayRent.OwnerContractId, '',dbo.PayRent.PayRent_id
    FROM dbo.Owner INNER JOIN
          dbo.PayRent ON dbo.Owner.OwnerContractId = dbo.PayRent.OwnerContractId
    WHERE (dbo.Owner.PayRentStyle <> '年付') AND (dbo.Owner.Cancelled < 2) AND 
          (dbo.PayRent.Finance = '') AND (dbo.PayRent.PayDate = @date)
    update #Rent set #Rent.RenterContractId = renter.RenterContractId from #Rent inner join Renter on #Rent.OwnerContractId = Renter.OwnerContractId
    where Renter.Currents = 1select * from #Rent order by OwnerName  --最后一句临时表查询数据
      

  6.   

    为什么我一直没看见Connection?set recordset=Conn.execute("exec 存储过程名")如果确定调用没问题,则检查存储过程有没有加入 set  nocount  on 
      

  7.   

    以下代码调用没有从临时表返回数据的存储过程,一点问题都没有
    见代码之后的存储过程   Dim rs As New ADODB.Recordset    Dim Cmd As Command
        Dim param As ADODB.Parameter
     
        Set Cmd = New Command
        Cmd.ActiveConnection = db   'db 是连接字符串    Cmd.CommandText = "P_PayRents"
        Cmd.CommandType = adCmdStoredProc  
        Set param = Cmd.CreateParameter("aa", adDate, adParamInput, 10, DTPicker1.Value)  'DTPicker1.Value 是一个日期控件
        Cmd.Parameters.Append param    Set rs = Cmd.Execute存储过程
    CREATE PROCEDURE P_PayRents
    (
    @date as smalldatetime
    )
        AS SELECT dbo.PayRent.PayRentRe, dbo.PayRent.PayRent, dbo.Owner.HouseAddress, 
          dbo.Owner.OwnerName, dbo.Owner.OwnerPhone, dbo.Owner.OwnerBankName, 
          dbo.Owner.OwnerAccount, dbo.Owner.OwnerAccountName, 
          dbo.PayRent.OwnerContractId, OwnerContractId2 ,dbo.PayRent.PayRent_id
    FROM dbo.Owner INNER JOIN
          dbo.PayRent ON dbo.Owner.OwnerContractId = dbo.PayRent.OwnerContractId
    WHERE (dbo.Owner.PayRentStyle <> '年付') AND (dbo.Owner.Cancelled < 2) AND 
          (dbo.PayRent.Finance = '') AND (dbo.PayRent.PayDate = @date)
      

  8.   

    在存储过程中加入
    set nocount on
      

  9.   

    set nocount on 加上也没用set nocount on 是不返回sql语句执行后受影响的行数,
      

  10.   

    我以前就碰到同样的问题,加入  set nocount on  后就没有问题了!CREATE PROCEDURE P_PayRents
    (
    @date as smalldatetime
    )
        AS 
    set nocount on  ---加入
    SELECT dbo.PayRent.PayRentRe, dbo.PayRent.PayRent, dbo.Owner.HouseAddress, 
          dbo.Owner.OwnerName, dbo.Owner.OwnerPhone, dbo.Owner.OwnerBankName, 
          dbo.Owner.OwnerAccount, dbo.Owner.OwnerAccountName, 
          dbo.PayRent.OwnerContractId, OwnerContractId2 ,dbo.PayRent.PayRent_id
    FROM dbo.Owner INNER JOIN
          dbo.PayRent ON dbo.Owner.OwnerContractId = dbo.PayRent.OwnerContractId
    WHERE (dbo.Owner.PayRentStyle <> '年付') AND (dbo.Owner.Cancelled < 2) AND 
          (dbo.PayRent.Finance = '') AND (dbo.PayRent.PayDate = @date)
      

  11.   

    set nocount on  已添加到存储过程,还是行啊
      

  12.   

    set nocount on  已添加到存储过程,还是不行啊
      

  13.   

    还是存储过程的问题,你要查询分析器中执行看看,应该有提示警告才对。
    set 或聚合删除了空值
      

  14.   

    郁闷!!!,我也是遇到这个问题。只要在存储过程中select临时表就不行!!!有没有高手指点一下啊!!
      

  15.   

    由于数据环境不同,所以修改了一下存储过程,不过大致步骤还是相同的存储过程:
    CREATE PROCEDURE testpro
    (
    @date as varchar(10)
    )
        AS create table #Rent
    (
    [pa_no] [varchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [pa_name] [varchar] (20) NOT NULL ,
    [pa_oudat] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [pa_arno1] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL 
    )insert into #Rent
    select pa_no,pa_name,pa_oudat,pa_arno1 from iepa00h where  pa_oudat=@dateupdate #Rent set pa_arno1=pa_arno1+'qq'select * from #Rent order by pa_no
    VB中:
    Option Explicit
    Dim db As String
    Private Sub Command1_Click()
       Dim rs As New ADODB.Recordset
       Dim Cmd As Command
       Dim param As ADODB.Parameter
       
       Set Cmd = New Command
       Cmd.ActiveConnection = db   'db 是连接字符串   Cmd.CommandText = "testpro"
       Cmd.CommandType = adCmdStoredProc 
       Set param = Cmd.CreateParameter("aa", adVarChar, adParamInput, 10, "2006/10/25")
       Cmd.Parameters.Append param   Set rs = Cmd.Execute
       
       Debug.Print rs.RecordCount
    End SubPrivate Sub Form_Load()
       db = "Driver=SQL Server;Server=127.0.0.1;UID=sa;PWD=123456;DataBase=TEST"
    End Sub
    经以上测试没有任何问题,其中也用到了临时表
      

  16.   

    "还是存储过程的问题,你要查询分析器中执行看看,应该有提示警告才对。
    set 或聚合删除了空值"
      在查询分析器中执行没有任何问题,也没有任何提示
      我有新建了一个与临时表完全相同的实际表,把临时表中的数据全部倒入到这个新建的表中,
    之后从这个新建的表中 select 数据,就可以了
      项目急,先这么对付,没办法