高手幫看看,為什麼我下面的語句執行會出錯,真煩啊,煩了我幾天了,怎麼DELHI的數據類型要求這麼嚴格啊?
怎麼改?謝。
說明:
MaxID:string;
Pcid:數據庫表中的自動編號      
//取得SQL語句值的函數
function GetSql(Val:string;sqlstr:string):string;
begin
    with DataM.q1 do
    begin
        DataM.q1.Close;
        DataM.q1.Open;
        sql.Clear;
        sql.Add(sqlstr);
        Open;
        Result :=FieldByName(Val).AsString; //---------出錯的語句---------------
    end 
end; sq2:='select max(pcid)+1 as MaxID from pccon';
        MaxId:=GetSql('MaxId',Sq2);        ShowMessage(MaxID);
        Abort;

解决方案 »

  1.   

    result申明了没有 还有出什么样的错
      

  2.   

    我覺得不是你說的那句有問題,是你的sql語句本身有問題,所以在open時就出錯了,
    把你的sql語句貼上來看看。
      

  3.   

    回樓上:就是下面這句select max(pcid)+1 as MaxID from pccon
      

  4.   

    with DataM.q1 do
        begin
            DataM.q1.Close;
            //DataM.q1.Open;    //去掉这句
            sql.Clear;
            sql.Add(sqlstr);
            Open;
            Result :=FieldByName(Val).AsString; //---------出錯的語句---------------
        end
      

  5.   

    function GetSql(Val:string;sqlstr:string):string;
    begin
        with DataM.q1 do
        begin
            Close;
            sql.Clear;
            sql.Add(sqlstr);
            Open;
            //这里楼主可以ShowMessage看看sql语句和RecordCount
            Result :=FieldByName(Val).AsString;
        end 
    end;
      

  6.   

    跟主樓主說的Sql語句也沒有錯,你自己分步執行一下,看錯在哪裡。
    你提供的所有語句沒有任何問題。
      

  7.   

    最好在select 里加個TOP 1
      

  8.   

    Result :=FieldByName(Val).AsString;
    改成
    GetSql:=FieldByName(Val).AsString;
    看看
      

  9.   

    把Result :=FieldByName(Val).AsString改为
    Result :=FieldByName('MaxId').AsStringfunction GetSql(Val:string;sqlstr:string):string;改为
    function GetSql(sqlstr:string):string;MaxId:=GetSql('MaxId',Sq2);改为
    MaxId:=GetSql(Sq2);
    我怀疑是FieldByName(Val).AsString中Val变量的问题,所以把字段变量先用固定的试试看
      

  10.   

    function GetSql(Val:string;sqlstr:string):string;
    begin
      Result := '';
      with DataM.q1 do
      begin
        Close;
        sql.Clear;
        sql.Add(sqlstr);
        Open;
        if RecordCount > 0 then
          Result := FieldByName(Val).AsString;
        Close;
      end 
    end;
      

  11.   

    你的sql只需要返回一个字段的值是吧。你试试这样:
    function GetSql(Val:string;sqlstr:string):string;
    begin
      Result := '';
      with DataM.q1 do
      begin
        Close;
        sql.Clear;
        sql.Add(sqlstr);
        Open;
        if RecordCount > 0 then
          Result := Fields[0].AsString;
        Close;
      end 
    end;
    可以不用你的第一个参数。如果从多个字段中选择,就把这个参数的类型改为integer;然后调用时
    赋值就行了。0是第一个字段,1是第二个.....
      

  12.   

    第一:数据集有没有记录
    第二:记录集里是否有Val字段。
      

  13.   

    if (RecordCount > 0) and (FindField(Val) <> nil) then
      Result := Fields[0].AsString;
      

  14.   

    try again;
    Button Onlicked event:
         var
           strSql:string;
         begin 
           strSql:='select Max([No])+1 as MaxID From tableName';
           Edit1.text:=GetMaxID('MaxID',strSql);   
         end;  
    Function GetMaxID(MaxID,Sql:string):string;
    var
      strSql:string;
    begin
       Result:='';
       strSql:=Sql;
       with ADOQuery1 do 
        begin
           Close;
           SQL.Clear;
           SQL.Add(strSql);
           try
             Open;
           except
             showmessage('strSql run failure!')
             Exit;
           end;
        end;
       Result:=ADOQuery1.FieldByName(MaxID).value;
    end;