在TCarDetail_Form的Edit控件里输入数据,用CarInfo_Manage.AddCar函数添加到数据库,在添加前CarInfo_Manage.GetCarByNo用查找重复键值总是提示重复,各函数的代码如下,请大家帮忙改错,谢谢
procedure TCarDetail_Form.Sav_BtnClick(Sender: TObject);
var
CarIn:TCarInfo;//TCarInfo类成员对应数据表各列
begin
CarIn:=TCarInfo.Create();
if
CarInfo_Manage.GetCarByNo(trim(edit1.Text))<>nil //查找重复键值
then
begin
messagebox(Handle,'车号重复,请重新输入','系统提示',MB_OK) ;
exit;
end else
if   CarInfo_Manage.GetCarByNo(trim(edit1.Text))=nil
then begin
Assignment(CarIn) ;//将edit.text赋值到CarIn的成员
CarInfo_Manage.AddCar(CarIn);//执行T-SQL语句添加数据到数据库
Form_Car.Car_DataS.DataSet.Refresh;
end
end;
/////////////////
function AddCar(Car:TCarInfo):boolean;
var
  sql:string;
begin
  sql:='insert into 设备台帐登记表(牌证号码,购置日期,设备类型,车型,座位,燃油,资产编号,发动机功率,设备状态,原值,生产厂家,发动机号码,底盘号码)'+
  'values('+''''+Car.CarNo+''''+','+''''+Car.BuyDate+''''+','+''''+Car.FixStyle+''''+','+''''+Car.CarStyle+''''+','+''''+Car.Seat+''''+','+''''+Car.Oil+''''+','+''''+Car.CapitalNo+''''+','+''''+(Car.Power)+''''+','+''''+Car.FixState+''''+','+''''+Car.Price+''''+','+''''+Car.Works+''''+','+''''+Car.MotorNo+''''+','+''''+Car.ChassisNo+''''+')';
   result:=DAHelper.ExeSqlNoQuery(sql);
end;
/////////////////
function ExeSqlNoQuery(sql:string):boolean;
var
  query:TADOQuery;
  ref:integer;
begin
  ref:=0;
  //判断连接状态是否关闭, 若关闭则打开
  if stClosed in Config.ADOCon.State then
      Config.ADOCon.Open;
    query:=TADOQuery.Create(nil);
    query.Connection:=Config.ADOCon;
    query.Close;
    Config.ADOCon.BeginTrans;
    try
      query.SQL.Clear;
      query.SQL.Add(sql);
      //query.Open;
    ref:=query.ExecSQL;//影响的行数
      Config.ADOCon.CommitTrans;
    except
      Config.ADOCon.RollbackTrans;
     query:=nil;
      result:=false;
   end;
  if ref>0 then
   result:=true
  else
  result:=false;
end;

解决方案 »

  1.   

    GetCarByNo函数原型:
    function GetCarByNo(CarNo:string):TADOQuery;
    var
      sql :string;
      begin
       sql:='select * from 设备台帐登记表 where 牌证号码='+''''+CarNo+'''';
       result:=DAHelper.ExeSqlQuery(sql);
      end;
      

  2.   


    {你用了不返回数据集的命令来执行要返回数据集的语句}
     ADOQuery1.open;//是返回数据集的,你可以访问这个数据集   
      ADOQuery1.execsql;// 就是只执行你的SQL操作,并不返回数据集
      

  3.   

    你的问题还是没有理解execsql与open的区别.
    当你要返回一个数据集时即,查询出一个数据结果时,要用open而不能用execsql;select的语句就要用open.
    而当你要执行一个增加,删除,修改的语句时,要用execsql而不能用open.
    你的GetCarByNo函数中也调用了ExeSqlQuery这个函数,而你要得到的是一个是否为空的判断,在AddCar这个函数中调用了ExeSqlQuery是插入一条记录,同一个函数要满足两种情况,不行,你要适当的修改一下.
      

  4.   

    GetCarByNo函数中调用的是没有返回值的函数                                function ExeSqlNoQuery(sql:string):boolean;
    var 
        query:TADOQuery; 
        ref:integer; 
    begin 
        ref:=0; 
        //判断连接状态是否关闭,   若关闭则打开 
        if   stClosed   in   Config.ADOCon.State   then 
                Config.ADOCon.Open; 
            query:=TADOQuery.Create(nil); 
            query.Connection:=Config.ADOCon; 
            query.Close; 
            Config.ADOCon.BeginTrans; 
            try 
                query.SQL.Clear; 
                query.SQL.Add(sql); 
                //query.Open; 
            ref:=query.ExecSQL;//影响的行数 
                Config.ADOCon.CommitTrans; 
            except 
                Config.ADOCon.RollbackTrans; 
              query:=nil; 
                result:=false; 
          end; 
        if   ref> 0   then 
          result:=true 
        else 
        result:=false; 
    end;