Button1按第一次存储过程可以正常运行,按第二次就出错了。procedure TForm1.Button1Click(Sender: TObject);
beginADOStoredProc1.Close;
ADOStoredProc1.Parameters.Refresh();ADOStoredProc1.Parameters.ParamByName('@date1').Value:=date1.DateTime;
ADOStoredProc1.Parameters.ParamByName('@date2').Value:=date2.DateTime;
ADOStoredProc1.Parameters.ParamByName('@strlenght').Value:=StrToInt(length.Text);
ADOStoredProc1.Parameters.ParamByName('@number').Value:=number.Text;
ADOStoredProc1.Parameters.ParamByName('@jiangid').Value:=jiangid.Text;
ADOStoredProc1.Parameters.ParamByName('@jiangxiang').Value:=jiangxiang.Text;
 
ADOStoredProc1.ExecProc;end;
__________________________________________________________
错误提示:
project project.exe raised exception class eaccessviolation with message 'access violation at address 0190a292 in module 'sqloledb.dll' . read of address 00000018' . process stopped . use step or run to continue .
谢谢~

解决方案 »

  1.   

    用单步调试ADOStoredProc1.ExecProc;第一次经过时可以。第二次经过ADOStoredProc1.ExecProc;就出错。
      

  2.   

    ADOStoredProc1是不是已经被Free了,错误是在那一步发生的?
      

  3.   

    不大清楚,没去试验,你可以把ADOStoredProc1设成局部变量,每次进函数创建他估计就没有问题了
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    beginADOStoredProc1.Close;ADOStoredProc1.Parameters.ParamByName('@date1').Value:=date1.DateTime;
    ADOStoredProc1.Parameters.ParamByName('@date2').Value:=date2.DateTime;
    ADOStoredProc1.Parameters.ParamByName('@strlenght').Value:=StrToInt(length.Text);
    ADOStoredProc1.Parameters.ParamByName('@number').Value:=number.Text;
    ADOStoredProc1.Parameters.ParamByName('@jiangid').Value:=jiangid.Text;
    ADOStoredProc1.Parameters.ParamByName('@jiangxiang').Value:=jiangxiang.Text;
     
    ADOStoredProc1.ExecProc;
    end;
    第二次就出错了,是不是你修改数据库后没有进行前台刷新后再次使用了些记录?
      

  5.   

    刚才用这个存储过程ALTER    procedure us_wyj_yaojiang
    @date1 datetime
    as Declare @lc_date1 char(8),@lc_date2 char(8)
    -------------------------------------------------delphi调用procedure TForm1.Button1Click(Sender: TObject);
    beginADOStoredProc1.Close;
    ADOStoredProc1.Parameters.Refresh;
    ADOStoredProc1.Parameters.ParamByName('@date1').Value:=date1.DateTime;
     
    ADOStoredProc1.ExecProc;
    end;也是
    Button1按第一次存储过程可以正常运行,按第二次就出错了。
      

  6.   

    谢谢大家。用adoquery调用存储过程解决了。接分吧。
      

  7.   

    ALTER      proc cp_AfterSend 
    @IdMap varchar(256),
    @MaxSendId bigint OUTPUT
    /* 功能:
           在短信发送后,更新相应的数据库:
           1.在tRandIdMap中记录分组信息
           2.在把该短信记录从tSentLog_wait表转移到tSentLog_Sending表,并更新相关信息       
       参数:
           @IdMap - 发送记录信息,格式:RandId1#n1*nBegin1,RandId2#n2@nBegin2,......
                      n1,n2是分组数量,Begin1,Begin2SendId的起点
           @MaxSendId - tRandIdMap中Id的最大值,输出
       返回:
           如果成功返回 0,失败返回负数
    */
           
    AS
    DECLARE
    @strIdMap varchar(256),
    @Rid bigint,
    @nPkg smallint,
    @nBegin bigint,
    @nPos int, 
    @nPos1 int,
    @nPos2 int, 
    @i intset @strIdMap = @IdMap
    set @MaxSendId = -1WHILE(LEN(@strIdMap) > 0)    
    BEGIN
         /*先分解参数*/
         set @nPos = CHARINDEX('#',@strIdMap,1)
         set @nPos1 = CHARINDEX('*',@strIdMap,1)
         set @nPos2 = CHARINDEX(',',@strIdMap,1)     set @Rid = CONVERT(int,SUBSTRING(@strIdMap,1,@nPos-1))
         set @nPkg = CONVERT(int,SUBSTRING(@strIdMap,@nPos+1,@nPos1-@nPos-1))
         set @nBegin = CONVERT(smallint,SUBSTRING(@strIdMap,@nPos1+1,@nPos2-@nPos1-1))     set @strIdMap = STUFF(@strIdMap,1,@nPos2,NULL)     --更新数据库   
         begin tran
             -- 从 Wait表复制到Sending表
             insert into tSentlog_sending select * from tSentLog_wait where RandId = @Rid
             if @@error <> 0 OR @@rowcount =0 
                   goto ERR
             -- 更新SentTime,ItemCount字段
             update tSentLog_sending set SentTime = GetDate(),ItemCount = @nPkg where RandId = @Rid
             if @@error <> 0 OR @@rowcount =0 
                   goto ERR
             -- 删除Wait表中原记录
             delete tSentLog_wait where RandId = @Rid
             if @@error <> 0 OR @@rowcount =0 
                   goto ERR
             -- 建立RandId 与 SendId 映射关系
             set @i = 0 
             while(@i < @nPkg) 
             begin
                 insert into tRandIdMap(SendId,RandId) values(@nBegin+@i,@Rid)
                 if @@error <> 0 OR @@rowcount =0 
                     goto ERR
                 else 
                     set @i = @i+1
             end         
         commit tran                      print @Rid
         print @nPkg 
         print @nBegin           
    END
    -- 退出前取SendId 字段的最大值`
    set @MaxSendId = @@identity
    RETURN 0
    ERR:
    begin
        rollback tran
    -- 退出前取SendId 字段的最大值`
        select @MaxSendId = max(SendId) from tRandIdMap
        print @MaxSendId
        return -1 
    end