我测试过,象这样写是可以的:
CREATE PROCEDURE aa  AS
select*from atable但是象这样就错了:
CREATE PROCEDURE aa  AS
insert into atable values(2)
select*from atable
仅仅添加了一条记录,VC用ADO调用时
strcpy(sql,"aa");
try
{
hr = m_rs->Open((_bstr_t)(sql),m_cn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdStoredProc);
while(!m_rs->EndOfFile)//这儿错了,提示"对象关闭时,不能操作"
{
vFieldValue=m_rs->GetCollect("AlarmName");
strcpy(sql,(char*)_bstr_t(vFieldValue));
m_rs->MoveNext();
}
}
catch(_com_error e){
strcpy(sql,e.Description());
}atable只一个字段,没任何限制.
谁知道为什么呀?
在VB里用ADO这样调用很正常呀.

解决方案 »

  1.   

    hr = m_rs->Open((_bstr_t)(sql),m_cn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdStoredProc);这句话肯定执行失败了
    判断一下 hr为多少,是否open成功.
    跟数据库应该没关系.
      

  2.   


    你使用什么数据库呢?
    应该是存储过程写错了,没有定义返回记录。oracle的如下:
    create or replace package aa is
    type curtype is ref cursor;
      procedure go(retcur out curtype);
    end aa;
    /
    create or replace package body aa is
      procedure go(retcur out curtype)is
    strsql varchar2(2000);
    begin
    strsql := 'insert into atable values(2)';
    execute immediate strsql;strsql := 'commit';
    execute immediate strsql;open retcur for
    select*from atable;end go;
    end aa;
    /参考:http://www.cnxuexi.com/computer/chengxusheji/shujuku/4368.htmlms sql server应该这样吧
    CREATE PROCEDURE dbo.aa
    as
    set nocount on
    begin
    insert into dbo.atable values(2)
    select*from dbo.atable
    end
    go
    参考:
    http://dev.yesky.com/web/42/2261542.shtmloracle的我写过类似代码,不过ms sql server的没有写过。见谅!
      

  3.   

    我是用的SQL Server 2000.
      

  4.   

    能说说set nocount on是什么意思吗?
      

  5.   

    当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
    在存储过程中,象create table返回了记录集,而且连insert into语句也返回了记录集,不过该记录集得一种特别的记录集(没有字段,不能对该记录集进行任何操作), OLEDB和ODBC存在一个很大的差别,向odbc取记录集时,odbc过滤了上面所称的特殊记录集(那种只占位置但不能进行任何操作的记录集——多由create table或insert into产生),而向oledb取记录集时,oledb并没有将特殊记录集过滤。所以在使用存储过程返回记录集时,在不希望返回记录的地方,应该使用set nocount on禁止存储过程返回记录集。
    你使用的是ADO,是基于oledb的,所以需要设置一下。
      

  6.   

    详细信息可以参考:
    http://down.dvbbs.net/InfoView/Article_2926.html