捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
修正ODAC中当字段名以X开头时出错的问题。
关键字:ODAC 字段名 以X开头
来 自:原创
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:中级 完成时间:2008/3/5
发布者:dfw@83037 发布时间:2008/3/5
编辑器:DELPHI7 语  种:简体中文
分 类:打印 下载浏览:137/6417
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
在ODAC的所有版本中,一直存在着这样的问题:当字段名以X开头而且以后的字母能够组成一组16进制的数时,很可能会引起数值类型“漂移”,比如我们常用XB来做性别的字段名,当使用fieldbyname('xb')函数时经常会出错。这个问题是出在DBACCESS.PAS中以下的一段:
function TCustomDADataSet.FieldByParamName(var ParamName: string; var Old: boolean; var AFieldNo: integer): TField;
// Returns field that corresponds to ParamName
  function FindFieldByFieldNo(FieldNo: integer): TField;
  var
    i: integer;
  begin
    for i := 0 to Fields.Count - 1 do begin
      Result := Fields[i];
      if Result.FieldNo = FieldNo then
        Exit;
    end;
    Result := nil;
  end;

var
  e: integer;
begin
  Old := CompareText(Copy(ParamName, 1, 4), 'OLD_') = 0;
  Result := nil;
  if Old then begin
    Result := FindField(ParamName);
    if Result <> nil then
      Old := False // fieldname is starting with OLD_
    else
      ParamName := Copy(ParamName, 5, Length(ParamName) - 4);
  end;

  if Result = nil then begin
    Val(ParamName, AFieldNo, e); //问题就出在这里,如果字段名是XB,则会被转换成数值11,因而会导致下面出现问题
    
    //modify by xiucai 以下两行是我加的,加了以后就解决了这个问题
    if not ParamName[1] in ('0'..'9') then
      e :=-1;
      
    if e = 0 then
      Result := FindFieldByFieldNo(AFieldNo)
    else
      AFieldNo := -1;
  end
  else begin
    AFieldNo := -1;
  end;

  if Result = nil then
    Result := FindField(ParamName);
end;
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论1条 当前显示最后1条评论
ty_unix 2008/3/14 11:24:09
你好,谁有详细的odac的安装方法,希望能给我一个,谢谢,信箱tyanany3344@163.com
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表