按月存档:2007年7月

Delphi 2007 Update 1 的 Bug 修正

Delphi 2007 Update 1

Delphi 2007 Update 1 已经推出很长时间了,变化不是很大,只是一点 Bug 修正,主要发现了以下几处:

1、Delphi 2007 Update 1 编译的程序可在任务管理器应用程序列表和 ALT+TAB 列表中显示了。

此 Bug 只在 XP 下出现,起初以为是开发组为了兼容 Vista 作的功能取舍,那成想真的是 Bug,可见 CodeGear 的测试水平了。

2、安装组件时只需添加组件的 Library Path 即可。

未 Update 1时,安装组件后,除了将组件的路径添加到 Library Path,还要添加到 Search Path 。

View Units 显示的是窗体的 Bug 还是照旧。

用习惯了 Delphi 7,总是对 Delphi 2007 的“重量级”有点难以习惯。期待 Delphi 2008,听说这是一个有着重大改进的版本,全面支持 Unicode 了!

下面是 Delphi 及 C++ Builder 的未来路线图:

Delphi 路线图
路线图介绍及 Delphi 2008 改进详见: Delphi and C++Builder Roadmap

  • 1 评论
  • 分类: Delphi
  • SQL Server 数据库转换为 Access 数据库

    最近正在升级一个程序,使其支持多数据库。
    原来的程序数据库为SQL Server,所以使用SQL Server 的“导入和导出数据”功能将一个 SQL Server 数据库转换成了Access数据库,但其中发现了一些问题,但也找到了解决方案,一并记录于此:

    1、转换程序会将SQL Server的视图转换成表,而不是Access的查询;
    2、在为字段设置默认值为空字符的时候,SQL Server用‘’(空单引号),而Access用“”(空双引号);
    3、Access中没有GetDate()函数,应该使用Now()函数代替;
    4、Access没有SQL Server用来获取客户端机器名的host_name()函数;
    5、Access中没有Case When Then语句,但可以用IIF()函数模拟实现功能;
    6、发现:Access使用的是Visual Basic的语言结构和函数;
    7、转换程序会正确转换SQL Server字段的 IS NULL 属性;
    8、Access也支持多字段的索引,只是设置方法有点特别(参见帮助);
    9、SQL Server中bit型的1、0值,在Access中为True和False;
    10、在Access中使用多个LEFT JOIN这样的语句时,必须用括号做相关的界定;
    11、Access的SQL没有注释语句,SQL Server的/**/无法通用;
    12、一条Insert语句在Access查询中正常运行,但在程序中出现“Insert Into 语句的语法错误”,后来发现原来是语句中的一个列名是Access的关键字(用[]界定可解决问题),但奇怪的是将该语句放置到Access的查询中执行却不会出错。

    需要对转换后的Access数据库进行以下项目的检查,以确保与SQL Server一致:

    1、主键。转换后的Access数据库都没有主键,需自己设置;
    2、自增字段。转换程序会将SQL Server的自增字段转换为数字型,需手动修改为Access的“自动编号”类型;
    3、默认值。转换程序不会转换SQL Server中设置的默认值,需手动设置;
    4、bigint型字段。转换程序会将SQL Server的bigint转换为小数,须手动调整为Access的整型或长整型;
    5、索引。转换程序不会转换索引,需手动在Access中建立索引。

    在Delphi下,想让程序同时支持Access及SQL Server,需注意以下方面:

    1、 在Access中使用 SELECT * FROM Books WHERE RegDate = ‘2007-5-1′ 是会出现“标准表达式中数据类型不匹配”这样的错误的(RegDate是日期型),必须使用SELECT * FROM Books WHERE RegDate = #2007-5-1# 或 SELECT * FROM Books WHERE RegDate = CDate(’2007-5-1′);
    但在Access中,Insert、delete和update中使用单引号界定日期却是可以正常执行的。
    2、尽量不要使用SQL Server的bigint类型,尤其该字段是自增的情况下;
    3、Access的varchar(文本)型最大只有255,所以如果一个文本型字段大于255时,最好定义成备注型(Access中)或text型(SQL Server中);
    4、在Access中一般会出现如下错误:不正常地定义参数对象,提供了不一致或不完整的信息。将相应Query的ParamCheck设为False即可;
    5、Access中的逻辑值在库中为-1和0,而SQL Server中为1和0,所以写BoolField = 1这样的语句有兼容性问题,应该改为BoolField <> 0;
    6、在Access中有主键的Query才可更新,而SQL Server无此要求。

    EhLib 4.1 在 Delphi 2007 下无法过滤和排序的问题

    今天将一个程序升级到了 Delphi 2007,该程序是用Delphi7开发的,程序中用到了一个第三方组件EhLib

    原先的 EhLib 是v3.6,无法在Delphi2007下安装,所以安装了最新的 v4.1。

    原先正常的程序,在升级后,发现 DBGridEh 无法进行排序和过滤,执行操作时无反应。后来发现,如果选择本地过滤和排序的话,一切都会正常;如果是服务器端排序和过滤,则无法正常执行,错误信息为类型转换错误。

    跟踪EhLib代码发现,是DBUtilsEh.pas文件中的SetDataSetSQLLikeProp 和IsDataSetHaveSQLLikeProp 函数中的以下相关代码报错:

    ……
    if (TObject(GetOrdProp(DataSet, FPropInfo)) as TStrings) <> nil then
    SQLPropValue := (TObject(GetOrdProp(DataSet, FPropInfo)) as TStrings).Text
    ……

    具体的类型转换错误是指TObject与TStrings转换错误,所以报错。
    我用的是ADOQuery,其SQL属性在Delphi7下是TStrings类型,在Delphi2007下是TWideStrings,由TObject转换为TStrings按理说不应该转换不成功啊。

    继续查看代码才发现:
    TWideStrings没有继承自TStrings,而是继承自TPersistent,理论上跟TStrings没有关系,将他转换为TStrings,当然会报错了。

    找到原因后,将EhLib相关出错函数的代码改为以下:

    ……
    if TObject(GetOrdProp(DataSet, FPropInfo)) is TStrings then
    SQLPropValue := (TObject(GetOrdProp(DataSet, FPropInfo)) as TStrings).Text
    else if TObject(GetOrdProp(DataSet, FPropInfo)) is TWideStrings then
    SQLPropValue := (TObject(GetOrdProp(DataSet, FPropInfo)) as TWideStrings).Text
    else
    Exit;
    ……

    修改后,重新编译,一切正常。

    附1:修改后的DBUtilsEh.pas文件
    附2:在Delphi2007中安装EhLib4.1时会报错,注释掉EhLibVCL.pas文件中的“TBytes = array of Byte”行即可正常安装(Delphi2007自己定义了TBytes)。

  • 1 评论
  • 分类: EhLib

  • 链接


    存档


    管理


    广告