我用存储过程来调用,但是报错
cannot perform this operator on a close dataset
但是我的数据集是打开的啊
还有什么原因吗?
我在formActivate中写了这些语句
  dataform.StoredProc1.Edit;
  dataform.StoredProc1.Last;
  dataform.StoredProc1.Next;
我是想要添加记录的,但首先dbedit得在编辑状态,还有就是要在最后一条记录
请问怎么解决,用LOCATE好像不行

解决方案 »

  1.   

    Cannot perform this operator on a close dataset这个操作是“DELPHI”中报的错,跟存储过程所在数据库端无关。
    你可能在调用“存储过程”时引用了其他DATASET的内容作为参数。
    而这个表当时没有打开 ,所以会报错
    在做以下操作时必须使“dataform.StoredProc1”处于AVTIVATE 的状态
      dataform.StoredProc1.Edit;
      dataform.StoredProc1.Last;
      dataform.StoredProc1.Next;
      

  2.   

    呵呵
    写完才发现你要在存储过程中EDIT!!!
    它和QUERY不同
    QUERY可以对一个表返回的数据直接EDIT
    但存储过程不行
    可以看看“存储过程”和“query”的差别
      

  3.   

    to  lxl(蚊蚊) 
    可以写具体点吗?
    有代码最好
      

  4.   

    如果你想这样做,不如用QUERY来执行存储过程
      

  5.   

    function LocalIP:string;
    type
        TaPInAddr = array [0..10] of PInAddr;
        PaPInAddr = ^TaPInAddr;
    var
        phe  : PHostEnt;
        pptr : PaPInAddr;
        Buffer : array [0..63] of char;
        I    : Integer;
        GInitData      : TWSADATA;begin
        WSAStartup($101, GInitData);
        Result := '';
        GetHostName(Buffer, SizeOf(Buffer));
        phe :=GetHostByName(buffer);
        if phe = nil then Exit;
        pptr := PaPInAddr(Phe^.h_addr_list);
        I := 0;
        while pptr^[I] <> nil do begin
          result:=StrPas(inet_ntoa(pptr^[I]^));
          Inc(I);
        end;
        WSACleanup;
    end;
    ========================================
    program get_ip;
    uses
      winsock,sysutils;
    VAR
      ch : ARRAY[1..32] OF Char;
      i : Integer;
      WSData: TWSAData;
      MyHost: PHostEnt;
    begin
      IF WSAstartup(2,wsdata)<>0 THEN
        BEGIN
          Writeln('can''t start Winsock: Error ',WSAGetLastError);
          Halt(2);
        END;
      try
        IF getHostName(@ch[1],32)<>0 THEN
          BEGIN
            Writeln('getHostName failed');
            Halt(3);
          END;
      except
        Writeln('getHostName failed');
        halt(3);
      end;
      MyHost:=GetHostByName(@ch[1]);
      IF MyHost=NIL THEN
        BEGIN
          Writeln(GetHostName('+StrPas(@ch[1])+') failed : Error
    '+IntToStr(WSAGetLastError));
          Halt(4);
        END
      ELSE
        BEGIN
            Write('address ');
             FOR i:=1 TO 4 DO
                BEGIN
                  Write(Ord(MyHost.h_addr^[i-1]));
                  IF i<4 THEN
    then     write('.')
                  ELSE
                    writeln;
                END;
       END;
    end.
      

  6.   

    呵呵
    我还不知道你到底要做什么呢,
    怎么会有代码?
    你只要用一个QUERY来取代你的存储过程返回结果
    并且把QUERY的“REQUESTLIVE”的属性设为TRUE
    就可以把它当作TABLE来EDIT了
    不过这个方法只对返回针对一个表查询的结果有效
    不能改动多个表的返回结果