我的form2里有一个DBGRID1和删除的按钮
点删除按钮就可以把DBGRID1的指定记录(就是根据我存储过程的条件)删除
但指能删除一次第二次就报错
我的代码如下
begin
  if messagedlg('确定要删除'+dbgrid1.fields[2].asstring+'吗?',mtconfirmation,[mbYes,mbNo],0)=mryes then
  begin
     with dataform.StoredProc6 do
     begin
      close;
      unprepare;
      parambyname('@样本控制号').Value:=dbgrid1.Fields[0].AsString;
   {执行的这句是就报错:'Access violation at address 004bf77 in module 'project1.exe'.read of address 00000000'} 
      prepare;
      execproc;
    end;
    dataform.StoredProc6.Close;
    dataform.StoredProc6.Open;
    dbgrid1.DataSource:=dataform.DataSource10;
  end;
end;
先谢谢了,对了,我是用BDE连的,datafrom是数据模块.

解决方案 »

  1.   


        dataform.StoredProc6.Close;
        dataform.StoredProc6.Open;
    这2句是否应该改成你的查询控件,不应该是执行存储过程的控件啊!
      

  2.   

    to  cg1120(代码最优化-§新年祝福你,好运伴着你§) 
    大侠:写具体点好吗?
    把大概的代码写上好吗?
    to  lincanwen(密码错误)
    查询控件我没有啊
      

  3.   

    dataform.StoredProc6.Close;
    dataform.StoredProc6.Open;  
    这2句应该改成:
    dataform.adoquery1.Close;
    dataform.adoquery1.Open;  
    //其中Adoquery1是你的dataform.DataSource10的DataSet属性中设置的控件
      

  4.   

    数据库刷新了,而你的DBGRID内容没有跟着刷新的话,就会出错
      

  5.   

    to  cg1120(代码最优化-§新年祝福你,好运伴着你§) 
    我在后面用接着用dbgrid1.DataSource.DataSet.Close;
             dbgrid1.DataSource.DataSet.Open;
    或者是dbgrid1.Refresh;还是会在那报错
    那DBGRID的内容怎么刷新呢?不好意思啊,我很菜的
      

  6.   

    begin
      if messagedlg('确定要删除'+dbgrid1.fields[2].asstring+'吗?',mtconfirmation,[mbYes,mbNo],0)=mryes then
      begin
         with dataform.StoredProc6 do
         begin
          close;
          unprepare;
          parambyname('@样本控制号').Value:=dbgrid1.Fields[0].AsString;
       {执行的这句是就报错:'Access violation at address 004bf77 in module 'project1.exe'.read of address 00000000'} 
          prepare;
          execproc;
        end;
        dataform.StoredProc6.Close;
        dataform.StoredProc6.Open;
        dbgrid1.DataSource:=dataform.DataSource10;
      end;
    end;//不是很清楚的問題:你的控件StoredProc6的作用是什麼?
    如果是執行刪除功能:Execproc就可以了,為何後面還要來個Close與Open????
    如果是執委檢索數據功能:Open就得了,為何上面又Execproc??如果象這樣的功能實現是不會有問題的.
         with dataform.StoredProc6 do
         begin
          close;
          unprepare;
          parambyname('@样本控制号').AsString:=dbgrid1.Fields[0].AsString;
          prepare;
          execproc;
        end;
    我覺得問題的關鍵在於你的控件StoredProc6在使用時所實現的功能目的不明確.
      

  7.   

    to pengdali(大力) 
    加入了参数
    我不知道怎样刷新顾DBGRID?不好意思啊,我很菜的
      

  8.   

    query和StoredProc不能直接刷新只能close再open;但我看你好像不需要刷新吧!!
      

  9.   

    to pengdali(大力) 
    我现在的问题是
    我可以删除一次
    但要删除第二次就不行了
    好像是刷新DBGRID的问题
      

  10.   

    begin
      if messagedlg('确定要删除'+dbgrid1.fields[2].asstring+'吗?',mtconfirmation,[mbYes,mbNo],0)=mryes then
      begin
         with dataform.StoredProc6 do
         begin
          close;
          unprepare;
          parambyname('@样本控制号').Value:=dbgrid1.Fields[0].AsString;
       {执行的这句是就报错:'Access violation at address 004bf77 in module 'project1.exe'.read of address 00000000'} 
          prepare;
          execproc;
        end;
    //去掉刷新
        dbgrid1.DataSource:=dataform.DataSource10;
    //你是想刷新grid1吗?那DataSource10的数据原是什么???????
      end;
    end;
      

  11.   

    //去掉刷新
        dbgrid1.DataSource:=dataform.DataSource10;
    //你是想刷新grid1吗?那DataSource10的数据原是什么???????
      end;
    end;数据源是删除的存储过程 StoredProc6
      

  12.   

    你应该将显示和执行分开两个StoredProc控件!!!!!!!!!!!!
    过程也分开!!!!!!!!!!!!!!!!!!
      

  13.   

    过程或改为:
    create proce 名
    @flag int
    as
    if @flag=1
      del...
    else
      select..
      

  14.   

    你的delphi可以这样写呀!
    begin
      if messagedlg('确定要删除'+dbgrid1.fields[2].asstring+'吗?',mtconfirmation,[mbYes,mbNo],0)=mryes then
      begin
         with dataform.StoredProc6 do
         begin
          close;
          unprepare;
          parambyname('@样本控制号').Value:=dbgrid1.Fields[0].AsString;
          prepare;
          execproc;
        end;
    ///另一个专门用来显示的storedproc刷新
          dataform.StoredProc7.close;
          dataform.StoredProc7.open;
    ///
      end;
    end;