我遇到一个奇怪的问题:有个存储过程会返回一个结果集,在查询分析器下执行没有问题,确实也返回了结果集,但在delphi程序中调用,则返回的是空结果集。我用的是bde组件。经过试验,发现只要把存储过程中的一条delete语句删除,delphi程序即可获得结果集了,存储过程简写后大致如下:
begin
  ......
  select * from t1 where 条件a --返回结果集的语句
  ......
  delete from t1 where 条件a --把这一句去掉,delphi程序才能获得结果集
enddelete语句在select语句后面,为什么会对查询的结果产生影响?

解决方案 »

  1.   

    select * from t1 where 条件a 
    delete from t1 where 条件a 同样是"where 条件a"已经把记录删除了当然没有返回结果集了。
      

  2.   

    分析器是一步一步执行的,当然先select 然后显示,然后delete,看不明白你这么写的意义!
      

  3.   

    在查詢分析器中是單步執行的
    但在delphi中,就只有最後的一個結果比如:
    Insert into tablename(Field1) values('1')
    這個是一個插入記錄的語句,那麼在Delphi中
    要執行這麼一句SQL語句,得用Query.ExecSql;
    那麼能不能用Query.Open;呢?
    答案是肯定的,只要在下面加入一條語句:
    Insert into tablename(Field1) values('1')
    select @@rowcount這樣就可以調用Query.Open
    而這條語句在查詢分析器中,卻有兩個返回集因此可以說在Delphi中的數據集,用的最後的返回結果
      

  4.   

    楼主,COOL!   呵呵!!
      

  5.   

    select * from t1 where 条件a   --此时如果有记录符合条件a
    delete from t1 where 条件a 可以还返结果集,而不受delete from t1 where 条件a如果你没有返回结果集,只有两种情况:1:DELPHI程充中的存储过程没有执行,或执行失败.
    2:你正确执行完的DELPHI程充中的存储过程,但你没有打开存储过程:存储过程无论是否正确执行完,它总是关闭的,这时当然没有结果集给你,你必须执行Open在行.你的想法是正确的.
      

  6.   

    应该不是吧,因为我的程序不做任何修改,只要把delete语句删掉就正常。
    看来你要和我一样纠正一下了。
    没有不同意见就揭帖了
      

  7.   

    我用的测试环境:xp+sql server2000桌面版 ado组件 delphi6;可以返回结果集
      

  8.   

    这样啊,既然你测试过,看来这个问题还真是问题了。
    会不会很客户端游标/服务端游标有关?
    ado好像是可以选择游标类型的,bde不行。
      

  9.   

    我用的测试环境:xp+sql server2000桌面版 ado组件 delphi6  OLE DB Provide for Sql SERVER 驱动 ;可以返回结果集.
    为了验证测试的正确性,你可以在:select * from t1 where 条件a   
    delete from t1 where 条件a 前面加一条 insert into 语句,增加一条符合条件a的记录.
      

  10.   

    在DELPHI看来:
      delete from t1 where 条件a 
      不是结果集  结果集必须包含字段集,请问 
        delete from t1 where 条件a
      的字段集是什么?
      

  11.   

    没错,可以返回结果集
    我又试了一下BDE,也是可以返回结果集的
    看来问题在其他地方,我自己再找找
    对ten_years_ago(昨天上班,今天下岗) 的实践精神表示敬佩!