开发环境
Delphi 7.0
MySQL 5.0
MySQL Connector ODBC 3.51开发时采用了
ADOConnection 通过ODBC连接MySQL数据库
ADOQuery 用来查询数据库中表record里有一列ipv4_src_addr是UNSIGNED UINTEGER类型  sSql := 'select distinct ipv4_src_addr as signed as ip from record ';
  qryIP.SQL.Clear;
  qryIP.SQL.Add(sSql);
  qryIP.Open;在访问qryIP.FieldByName('IP')的值的时候,不论我用.ASInteger,.AsVariant,还是.Value
都会报错
"Project ***** raised Exception class EVariantOverFlowError with Message 'Overflow while converting variant of type (LongWord) into Type (Integer)'"

解决方案 »

  1.   

    as   signed   as   ip  
    --------------------
    从来没有用过这个语法,楼主可以解释一下什么意思吗?还有,UNSIGNED   UINTEGER类型是什么类型?我只记得int ,big int,没见过UINTEGER。
      

  2.   

    是啊,语法错啦,不过unsigned还是有的,呵呵
      

  3.   

    unsigned的都是针对int的,啰嗦了,:)
      

  4.   

    如果是这样的 sSql='select distinct ipv4_src_addr as ip from record';类型是UNSIGNED int的话,直接用as integer是可以读出来的,我已经测过了。不过你的sql语句本来就怪怪的,还有UNSIGNED UINTEGER中的UINTEGER是没有的吧。
      

  5.   

    还有,如果你的数据库数据超过了delphi里integer的正取值,会显示负数,那在delphi可以用cardinal这个无符号的整形类型
      

  6.   

    UNSIGNED   UINTEGER
    <===〉
    UNSIGNED   INT
      

  7.   

    代码少许有些错误,是    sSql   :=   'select   distinct   ipv4_src_addr   as   ip   from   record   '; 
        qryIP.SQL.Clear; 
        qryIP.SQL.Add(sSql); 
        qryIP.Open; 而且错误的情况是在数字很大的情况下出现的
    也就是说,在从32位无符号数,转成32位有符号数的情况下,出现了溢出但是为什么我用qryIP.FieldByName('IP').AsVariant 或者 qryIP.FieldByName('IP').Value 的时候也会报错呢?
    两者都返回Variant类型啊。
    为什么没有返回正确的类型呢
      

  8.   

    ipv4_src_addr 创建时的类型是 UNSIGNED INT(10)
    如果值比较大 例如
    3741039308那么不论是qryIP.FieldByName('IP').AsVariant,qryIP.FieldByName('IP').Value,qryIP.FieldByName('IP').AsInteger都会发生溢出
      

  9.   

    procedure TForm1.Button9Click(Sender: TObject);
    var
      a:Cardinal;
    begin
      with ADOQuery1 do
      begin
        Close;
        SQL.Text := 'SET NAMES GB2312;';
        ADOQuery1.ExecSQL();
        SQL.Clear;
        SQL.Add('select text as IP from a');
        Open;
        a:=ADOQuery1.fieldbyname('IP').AsInteger;
        label3.Caption:=inttostr(a);
      end;
    end;我的表改成了这样了,上面的代码也没有出错。
    ALTER TABLE `a` CHANGE `text` `text` INT( 4 ) UNSIGNED NOT NULL而且mysql数据库里,不管是int(10)还是int(4)最大也只能有2147483647,无符号可以有这个数的两倍,不会因为改了是10还是4就会增加范围的。
      

  10.   

    加一句,delphi代码不出错,用的数值是你提供的3741039308,如果delphi的a变量改成integer这个,也不会有错误,显示的是一个负数,好像是负5亿多的。mysql里改成int(10)也是这样。
      

  11.   

    To 12楼,我用你的代码在我本机测试也是出错的,你的数据库环境和ODBC Connector分别是?
      

  12.   

    我用的和你用的完全一样啊,delphi7,mysql5.0,ODBC 3.51所以也不知道你问题所在。
      

  13.   

    我用的和你用的完全一样啊,delphi7,mysql5.0,ODBC 3.51所以也不知道你问题所在。
      

  14.   

    建议楼主换个机子试试,我试不出来你的错误,我觉得别的机子可能可以使用。
    真的没办法了在数据库中用varchar存吧,拿出来后再转回来。
      

  15.   

    我明天会换一台机器试试看,不过会不会和ConnectString有关?
    XFliangwh你的ConnectString是怎么写的?
      

  16.   


    ADOConnection1.ConnectionString:= 'Provider=MSDASQL.1;Persist Security Info=False;;User ID=root;Password=ababc;DATABASE=mytest;DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;PORT=0;SERVER=localhost;';
      

  17.   

    建议使用MyDAC控件
    http://www.ccrun.com/view.asp?id=446