procedure Tadd.panduan;
var
usertel:string;
a,b,c:integer;
begin
 usertel:=edit1.Text;   ADOQuery1.Close;
   ADOQuery1.SQL.Clear;
   ADOQuery1.sql.add('select count(*) from meetmaster');
   ADOQuery1.sql.add('where n_tel='+''''+usertel+''''+'and n_=1');
 try
   ADOQuery1.open;
 except
   ADOQuery1.ExecSQL;
  end;
   edit3.Text:=inttostr((ADOQuery1.Fields[0].Value)+1);
end;我的这个工程,编译时顺利通过,但是运行的时候就会报错(project meet.exe raised exception class eaccessviolation with message 'access violation at address 1F487CAB in module 'msado15.dll'.write of address 0182CD2C '.process stopped ,use stepped.use step orrun to continue.),问题就是出在这段过程上,如果我输入的usertel存在的话,应该是编译和运行都没有错误,如果我输入的usertel的值在数据库中没有的话,就会在运行时报错.我想不明白的就是我已经用的时try和except这种形式写的,就即使是没有返回结果也不会报错的嘛??? 请大家帮忙想想,非常急切!!!

解决方案 »

  1.   

    查詢不用   ADOQuery1.ExecSQL;
    insert ,update 才用execsql
      

  2.   

    procedure Tadd.panduan;
    var
      usertel: string;
      a, b, c: integer;
    begin
      usertel := edit1.Text;  ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.sql.add('select count(*) from meetmaster ');
      ADOQuery1.sql.add('where n_tel=' + QuotedStr(usertel) + ' and n_=1');
      try
        ADOQuery1.open;
        edit3.Text := ADOQuery1.Fields[0].AsString;
      except
        showmessage('查询出错');
      end;
    end;
      

  3.   

    我知道execsql用于不返回结果的sql语句,但是在这个地方有没有ADOQuery.execsql这句话并不是导致错误的关键,毕竟我的正常处理用的是open,起码这个不会错的吧!请大家再帮忙想想!!!
      

  4.   

    procedure Tadd.panduan;
    var
    usertel:string;
    a,b,c:integer;
    begin
    usertel:=edit1.Text;ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.sql.add('select count(*) from meetmaster');
    ADOQuery1.sql.add('where n_tel='+''''+usertel+''''+'and n_=1');
    try
    ADOQuery1.ExecSQL;    我尝试过了这样的话就不会报错了,但是用了execsql,我又得不到返回的结果
    except
    //ADOQuery1.ExecSQL;
    end;
    //edit3.Text:=inttostr((ADOQuery1.Fields[0].Value)+1);请大家根据这一系列的线索再想想..
    end;
      

  5.   

    EAsy!
         
      try
              if (判断输入的usertel的值是不是在数据库中存在) then
              begin
                    ADOQuery1.open;
                    ADOQuery1.ExecSQL;
              end;
            except
              showmsg('XXXXXXXX');
              exit;
            end;
      

  6.   

    我这样做就是为了判断usertel的值在数据库中是否存在,,并且n_=1;
    问题是该怎么样判断呢??
    希望大家写出语句!!
      

  7.   

    要满足“我这样做就是为了判断usertel的值在数据库中是否存在,,并且n_=1;”这个条件
    试着把select count(*) from meetmaster ...改为select * from meetmaster...然后判断
    ADOQuery1.RecrodeCount是否等于0。看看还报不报错
      

  8.   

    ADOQuery1.sql.add('select count(*) from meetmaster');//lose a space?
    ADOQuery1.sql.add('where n_tel='+''''+usertel+''''+'and n_=1');---------------------------------------------------------
    ADOQuery1.sql.add('select count(*) from meetmaster ');//lose a space?
    ADOQuery1.sql.add('where n_tel='+''''+usertel+''''+'and n_=1');
      

  9.   

    procedure Tadd.panduan;
    var
    usertel:string;
    a,b,c:integer;
    begin
     usertel:=edit1.Text;   ADOQuery1.Close;
       ADOQuery1.SQL.Clear;
       //ADOQuery1.sql.add('select count(*) from meetmaster');
       //ADOQuery1.sql.add('where n_tel='+''''+usertel+''''+'and n_=1');
       ADOQuery1.sql.add('select * from meetmaster');
       ADOQuery1.sql.add('where n_tel=' + QuotedStr(usertel) + ' and n_=1');
     try
       ADOQuery1.open;
     except
       ADOQuery1.ExecSQL;
     end;
       a:=ADOQuery1.RecordCount;
       //edit3.Text:=inttostr(ADOQuery1.Fields[0].Value);
       if a=0 then
       showmessage('记录条数为0')
       else
       showmessage('记录条数不为0');
    end;我把程序改成这样以后又试了一下,程序运行起来以后,显示了'记录条数为0'后再次出现以前那个一样的提示(project meet.exe raised exception class eaccessviolation with message 'access violation at address 1F487CAB in module 'msado15.dll'.write of address 0182CD2C '.process stopped ,use stepped.use step orrun to continue.)
      

  10.   

    估计是ado版本或delphi中ado驱动的问题了。试试打一打delphi的相关patch
      

  11.   

    我觉得应该不是ado版本的问题吧,虽然它有这方面的提示,但是我觉得只能作个参考,并不一定就是真正的问题所在!!!
      

  12.   

    从出现借误有条件上来看,是错在了“'where n_tel='+''''+usertel+''''+'and n_=1'”语句上,你可以把语句在查询分析器中去试一下,看是不是你的语句上存在问题或是表“meetmaster”有问题,也可以换一个表试一下,进一步决定问题有根源所在。也很有可能不是出现在以上语句,你断点调试试一下。
      

  13.   

    现在的情况是, ADOQuery1.open;已经可以被正确执行了,就应该不是SQL语句的问题了。你试过用其他的sql语句测试吗,也有可能是adoquery1的某些属性设置不正确,换个adoquery试试。总之,只能多做试验确定真正的问题所在了
      

  14.   

    把输出的语句放在一个EditBox上,到查询分析器或直接在Delphi,看看SQL语句是否有错
      

  15.   

    procedure Tadd.panduan;
    var
    usertel:string;
    a,b,c:integer;
    begin
    usertel:=edit1.Text;ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.sql.add('select count(*)as tmp from meetmaster');
    ADOQuery1.sql.add('where n_tel=:ntel and n_=1');
    adoquery1.parameters.parambyname('ntel').value:=usertel;
    adoquery1.open;edit3.Text:=ADOQuery1.fieldbyname('tmp').asinteger+1;
    end;
    end;
      

  16.   

    (project meet.exe raised exception class eaccessviolation with message 'access violation at address 1F487CAB in module 'msado15.dll'.write of address 0182CD2C '.process stopped ,use stepped.use step orrun to continue.)
    基本可以定性為MSADO的問題了,請升級或補丁
    記錄為0是你SQL語句的問題.
      

  17.   

    问题终于解决了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    我另外用了一个ADOQurey4(ADOQurey1有其他的地方也在用,但是我每次使用之都都"ADOQuery1.Close"了的呀!!!),语句的内容基本上没有修改,只是把语句中的ADOQurey1改成了ADOQurey4,居然在运行的时候没问题了(现在ADOQuery4只有这一处在用了)
     希望高手站出来分析分析,出问题的本质原因在什么地方!!!????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
      

  18.   

    首先把ADOQurey4和ADOQurey1的属性设置做一下对比,看是否有不一样的。其次,检查代码,看其他地方使用ADOQurey1时是否在代码中设置了某个属性。close并不代表你设置的属性的值回复默认值。
      

  19.   

    adoQuery的 CursorLocation属性是否设置为clUseClient?
      

  20.   

    对呀,我的所有adoquery的CursorLocation属性都是设置为clUseClient,这个是默认的设置吧,我一般都没有动过的,(我对这个属性的作用也不是太了解),问题出在这里了吗???请高手解答????????????????????????????????????????????????????????/