TurboDelphi学习笔记(一):使用DBExpress连接Mysql数据库

安装好了TurboDelphi,又从网上邮购了李维的《Delphi2006高效数据库程序设计》,书写的和台湾作者的风格一样,循序渐进,步步展开,容易理解。但感觉困惑的是李维似乎和大陆一些书籍作者一样,喜欢使用data control控件,也许这样更便于演示吧。

今天在单位装好delphi后,试着连接后台的mysql服务器,但出现和delphi7一样的错误,显然,免费的turbo delphi还没有使用DBExpress4.0,而使用了和delphi7.0一样的3.0的版本。好在DBExpress可以自己定制,于是修改了相关配置,使用了Openmysql41,连接顺利。但随后的问题接踵而来。

我连接的数据库是后台的一个会计用数据库,Mysql默认的字符集编码是GBK,由于为了更好的存储、显示好开户单位的名称,会计数据库用的是UTF8的字符集,我原先显示的时候是用php网页显示,调用数据前先声明字符集:set names utf8,这样显示数据是没有问题的,但使用delphi连接显示,汉字总是乱码。

上网查询,解决的方案大多是说使用set names utf8,也有的说是修改连接配置,但大多数都是不起作用,在署名李维的一篇帖子里面宣称使用4.0版本没有问题,但我到哪里去下载DBExpress4.0去啊。

官方的指望不上,那就继续找开源的,在http://www.justsoftwaresolutions.co.uk/delphi/dbexpress_and_mysql_5.html上面找到了源代码,编译配置之后,并没有使用mysql5.0的libmysql.dll 文件,依旧延续4.1的libmysql.dll ,连接没有问题,但显示的时候依然是乱码。

本来有些失望,但注意到这些乱码不同于之前的乱码,于是试着用gbk替换utf8,结果显示完全正确!忙又换了一个gbk字符集的数据库,连接显示也是正常!看来这个开源版本的字符集是在指定mysql数据库的默认编码的情况下可以自行判定并显示数据记录的编码,真是不错。

dbexpress的确不错,速度快,依赖少,但问题如网上所说,更新慢,而且新的更新版本找不到下载的地方,也许只能使用更高的版本的delphi,这也不现实。幸亏网上有开源版本的。

开始使用免费正版的TurboDelphi了

我学习编程,最初用的是VB,后来接触到delphi之后就放弃了VB,主要是因为delphi更为高效,还有一个原因是vb需要不小的运行库,在那个还没有U盘的时候,发布程序的体积是一个问题。

经过5.5,6.0,到了7,delphi对我这样的爱好者已经足够了。但使用的都是盗版软件,每次想到盗版,就想起当你看到评论delphi的一篇文章,文中写到,一个破解高手在破解了delphi3.0之后洗手不干了,因为他感慨,如果都用盗版,就没有人再开发这么好的软件了。所以用着delphi,总是很惭愧。TurboDelphi发行后,我是第一时间下载并安装,但里面不允许使用第三方控件,而我编程主要目的是操作Mysql数据库,原先的DBexpress控件在操作Mysql4.0以上版本数据库的问题不少,我一般都是用的DAC的一个共享软件控件,虽然每次运行之前提示一下版权,但别的不影响,所以有些依赖性,再加上当时各种原因,编程已经很少,所以把TurboDelphi卸载了,继续使用delphi7.

去年开始使用Firebird数据库,感觉非常好,特别是他的内嵌服务器版本,所以数据库主要用Mysql和FB两个,一个用作远程一个用作本机。FB使用的连接控件是一个开源控件UIB,但他的语法很是别扭,恰好看到有开源的DBexpress版本,安装的时候发现,只要修改DBexpress的配置文件,就可以使用DBexpress连接多个数据库,恰好前几天发现DAC改变了版权使用协议,不再允许无期限使用,所以我便又将学习的重点转向Dbexpress,这样就又想到了免费正版的TurboDelphi.

安装TurboDelphi比较麻烦,需要安装一套相关的.net等软件,但运行速度要快于delphi7,而且代码编辑也更为方便,由于之前连接mysql问题不大,所以就把测试重点放在连接firebird上。默认的DBexpress里面只有一个IB选项,但和firebird同出一门,感觉问题不大,于是建立了一个fb1.5的数据库,在打开fb服务器的情况下,连接正常,读取显示数据也没有问题。关闭数据库服务器,把内嵌服务器版需要软件拷贝到目录下,再次连接,同样成功。

DBexpress是borland重点推出的一个技术,李维也是很是推荐,但在应用中反应平平,甚至很多人评价不高。我感觉除了版本改进不及时外,还有就是很多使用者还是习惯了BDE,对DBexpress的单向数据传输不习惯,尤其是一些习惯直接操作数据表的使用者。但DBexpress是一个开放的控件,可以根据自己需要添加相应的选项,所以还是很方便很灵活的。

解决了数据库连接问题,虽然还不能使用报表功能,但对我来说也就足够了,以后就使用正版的开发软件了。

咱也有专业入门级显卡了

原先只是在网上看到别人炫耀自己的专业显卡,平时只有羡慕的份,前几天在淘宝网上查询服务器主板的时候,发现一个收藏的商铺里面有二手的专业显卡NVS 280显卡出售,据说是dell拆机货,丽台生产。虽然是二手,而且是几年前的过时产品,但价格只要130元,同时附赠转换线,的确让我心动。

原先为了能够不购买用途不大的显卡而使用独立显卡的板子,(毕竟非集成板子有他的优势,比如做工、扩充性还有散热性)曾经购买过一块PCI接口的G200,但那个主要还是用在组装服务器和简单应用的用途上,如果日常使用那个8M的显卡还是紧张一些。而这个NVS 280显卡接口毕竟是PCI-e的,而且使用的是散热片,所以还是有些心动,到网上查询一下,这个卡子应该是丽台生成,看样子成色不错,加上这几天在股市里面赌涨跌,转了几个大洋,便一狠心订了一块。

19日上午下的单,本以为要下周才能到货,谁知20日下午货就到了,打开一看,做工的确不错,散热片的质量也非常好,当下找了一台945GC的机器插上实验一下,没有问题,开机一晚上早晨来一看依然正常运转,便用支付宝确认收货。这样一来我的显卡接口算是全了,pci的是g200,agp的是9850,ati7200,ati8500LE,再加上这个,足以应付不及只需了。

虽然只是二手的过时产品,但怎么也是专业卡了,穷人自有穷人的乐趣啊。

谈谈我对龙芯盒子销售的一些看法

龙芯盒子销售在即,虽然有些失望,但毕竟又进了一步,暂且结合我之前网上购物的经验,谈谈我对龙芯盒子销售的一些看法,希望能够对一个月后盒子的发售有用。

1、建立一个销售平台。平台的硬件就是使用龙芯,不一定用销售的龙芯盒子,但一定要用龙芯为核心的服务器平台,操作系统使用linux,(不要再闹出大力发展龙芯+linux的龙梦集团使用asp页面的笑话,这就像建行员工出去营销贷记卡,结帐的时候掏出招商银行的信用卡一样给人不靠谱的感觉)。

2、参考dell的网上销售形式。除了主要部件,硬盘、内存等可以采用自选的形式,形成订单后,相关的客户经理负责将订单交由生产部门生产,尽可能避免人工处理,节省人力和时间。

3、为了节省配货成本,减少发货时间,龙梦可以在中国几个大的城市设立合作机构或者分支部门作为分中心。批量发货给分中心,货物中有已组装好的龙芯盒子,也有半成品,由分中心根据分配给自己的订单组装设备,或者将成品发给本区域内的订购者。

4、网上销售使用网店的形式,现在ecshop和shopex已经很成熟,并提供多种支付接口,如果嫌淘宝这类不能马上获得货款的支付方式不适合企业,也可以使用网银网关的形式直接入帐。这样即便于订购者支付货款,也便于龙梦公司的进行帐务管理。

5、建立好每个客户的档案资料。一旦发生类似苹果那种降价道歉的情况,便于联系沟通。

龙芯盒子正式发布,我很失望

期待已久的龙芯盒子今天终于正式发布了,发布内容很简单,或者说很低调:4月15日上市,市场指导价格1800元。

我很失望。

失望有两点:1、对上市时间很失望。本来龙芯上市是一拖再拖,在年初终于定下来是一季度上市销售,但三月上旬已过,发布的只是一个上市日期。而4月份显然是2季度的事情了。2季度会发生什么事情?intel的atom系列cpu就要上市,本来是针对via那个引火上身的倒霉鬼的,但神仙打仗,小鬼遭殃,龙芯自然受到牵连。intel估计不会跳票的,要不然他的CEO会下跪道歉的,而龙芯不好说,反正已经跳票习惯了。

2、对价格很失望。我预计价格会在1500元以下,倒不是贪心,而是根据龙梦的宣传中推测的:2E的盒子现在有售,价格是1599元,而张福新在前段时间接受采访时说到,随着龙芯产业的发展,成本将会降低30%左右。正是根据以上资料,加上2E的盒子当时因为采购不足,成本较高,所以我估计售价在1500-1300元。但现在市场指导价就是1800元,显然价格偏高,也和之前的宣传有矛盾。

我期待龙芯,虽然有爱国成分在里面,但看中的是他的低耗和轻便。但时间实在耗不起,在期待的过程中,FreeNSD7.0已经正式release,intel也大举进攻低功耗市场,而龙芯也在一拖再拖中将自己的优势慢慢耗尽,至少我现在已经开始重新考虑下一步的购买计划。

别了,百灵网

     今天在生活日报头版看到了百灵网与电信的合并通告。说是合并,其实就是电信收购了百灵网。去年7月就有传说网通就要收购百灵网,只是在最后关头因为某些环节未能谈妥,才使得收购计划流产。而此次电信收购百灵网,相比去年的收购,应该对双方都更为有利一些:电信通过收购,接受了原先百灵网的用户,避免了线路的再次铺设的成本付出;百灵网并入电信,解决了原先受到限制而越来越紧张的带宽资源,也算是双赢。

    被收购,对百灵网来说也许是必然的,由于国际出口是租用网通和电信的,一旦上游供应商也是竞争者卡脖子,百灵网在竞争中只能是坐以待毙的。但百灵网有过自己的辉煌,也为济南的互联网事业做出了极大的贡献,可以说没有百灵网,济南的网民们不会享受到即使在全国也数低廉的宽带服务的。     在99年7月之前安装百灵宽带,我在网通降价初装费后(1000元开户)申请了固定电话,和大多数济南网民使用的是56K的猫上网,而价格据说当时也算公道:2元/小时.。上网的时候那个叫小心,能在网下完成的都做完之后才拨号上网,唯恐超支。当时也听说济南有一个宽带网络,叫三联网,每月只收100元,而且是随便上网,当时羡慕的要命。
直到一天下午下班,发现百灵网在单位宿舍门口搞宣传,当时真是感觉天上掉下馅饼,亟不可待地递交申请,苦苦等待了一周之后,终于在单身宿舍内部安装上了这个不需要再使用猫而用网卡的宽带网。当打开百灵网的主页时,那个速度真是令我等目瞪口呆(后来才知道那个相当于局域网,速度当然飞快)。更令我们兴奋的是,百灵网表示在试用期内网络免费使用。
     那是个兴奋的99年,那一年里我们第一次享受到了宽带服务,虽然还有诸多限制,比如无法使用ftp,icq等,但是免费的宽带已经足以让我们满足;那一年里泰山队获得双冠王,我们可以在网易社区里和南北藐视齐鲁人士的球迷灌水开仗,忙的不亦乐乎。 那也是一个繁忙的99年,经历过结婚期的同事们为了使用百灵网开始找我帮助装机期。一般的流程是同事和我上午到科技市场买配件,而同事的太太们则负责联络百灵网人员安装网络,回到宿舍装完机器再配置上网,那一年应该装了有近20台机器。而网卡也从8029升级到了8139,从50到了29元。这些应该都是百灵网的功劳,每个从使用百灵网开始进入网络世界的朋友应该有一份感激之情。
     其实在各类宽带服务中,我使用百灵网时间是最短。2000年五月收费之后,我付费只是使用了2个月,不是嫌那每月100元的网费昂贵,只是因为搬家到了历山路东头。在那里,没有百灵网,我也只好玩玩单机游戏,偶尔使用尘封已久的小猫上上网而已,每次听到那吱吱的拨号声,心里都在期盼百灵网早日铺设到家门。
     显然,其他供应商不会坐视百灵网一家做大,当时网通费用限制很严,不允许随意降价,但网通最后还是利用搞活动的形式,在年底推出了拨号包月,期限虽然只有半年,但足以使我等远离百灵网的网虫们感恩戴德。
     百灵网也许还沉寂在领先的喜悦中,在开始收费后,网络铺设速度开始减慢。就在等待中,另一个竞争对手出现了,2001年4月份,就在我正为网通拨号包月到期发愁时,一个宽带宣传到了我们小区,但不是百灵网,是广电网。而广电网竞争的手段很简单:低价。当时的CM预付费600可以使用一年,而低价的基础是百灵网没有的,那就是利用原有的有线电视设备,从而避免了百灵网那样过路架线的费用支出。而此时网通也在蓄势待发,在每个小区开始铺设线路,在每个单元安装接入设备,网线就垂在每个住户的门口。
     广电网使用了3年,虽然网络状况一般,需要不时骚扰318000,但面对态度极好的服务小姐,也只能忍着,直到2004年底终于又迎来了百灵网的铺设人员,当时真有一种重见亲人的亲切。当时百灵网的费用是打折之后每月60,要高于广电网的40元每月,但我还是申请了百灵网。     安装完毕的当夜,正在上网之际,突然系统提示IP地址已经被占用,我被踢了出来。真是岂有此理,联系客服人员,推来推去,最后让我换一个IP地址。我不免愤怒!这还是百灵网吗?!因为学习的需要,我希望得到一个实IP地址,哪怕每个月多交部分钱,但百灵网表示无能为力,而同时我的很多同事还在用实IP使用着免费的百灵网。
     此时网通终于布局完毕,据说当时的电信要在济南开展业务,被网通得知后抢先动手,他们通过客户经理的形式发展客户,只要能够提供百灵网的发票,可以预付480元使用1年另赠3个月的宽带。面对此诱惑,我只能投奔网通,也就向百灵网最终说再见了,因为我感觉到在诸多竞争对手已经开始正视济南市场的时候,百灵网没落是不可避免的。
     依托三联,百灵网的服务质量不能说差,但管理跟不上。记得第一次接触CIH病毒,是裹挟在百灵网的VOD程序包里面的,当我们发现告诉维护人员的时候,他们是幸灾乐祸的,因为开发VOD的人员是高薪请来的,据说牛的很。
     而三联公司既有百灵网,又有三联商厦,这本是合作经营电子商务的最好平台,因为百灵网的用户就是一个稳定的定向的消费用户群,但也没有人过问,shop365网站与百灵网似乎还是各自为战,三联商社并未从百灵网得到什么支持。
     百灵网走过10年,就像三联商社被国美控股一样,最终被电信收购,也许这是宿命,但本来可以避免如此凄凉落幕的。这里面既有面对垄断势力的无奈,但也有对自身管理落后的叹息。希望百灵网这块牌子不要倒下去,但这也只是我们一个美好的愿望而已。

从龙芯盒子想到intel的蓝盒子

从订购了龙芯盒子之后就一直很是期盼,希望能够早日拿到盒子,但不知不觉快三个月了,还是没有什么动静,大老板在北京开会,看来即使发布也要会议结束了,那就是13号之后的事情了。
期盼之余,不禁联想到当年intel的蓝盒子(或者叫蓝箱子),在虞有澄的《我看英特尔》中曾经提到,在intel发展cpu初期,曾经出过一款蓝盒子,主要是供大客户用作开发只用,而很多客户拿到蓝盒子之后是作为一台计算机来使用的,而且销路不错,利润不少。所以虞有澄自豪而又惋惜的认为那才是第一台微型计算机。但惋惜只是惋惜,或者是自豪的惋惜,intel错过了发展成为“计算机厂商”的机会,但如果intel全力以赴四面出击投身到cpu到主机的一条龙中,也许就没有今日的intel了。
龙芯也是一样,在竞争已经残酷百倍与当年intel的情况下,如何定位,是决定生死存亡的关键。如果有了一点成就就开始好高骛远,又想当计算机厂商,又想做笔记本,到头来只会是竹篮打水一场空。
当务之急,还是大声对自己说一声:我就是一个做CPU!卖出一块就有一块的利润,早卖出一天就比竞争对手多挣一块cpu的利润!

FreeBSD顺利升级到7.0

等待了近半年了,最近FreeBSD终于发行了正式版,今天终于有了充裕的时间,于是准备把6.2stable的版本升级到7.0.

这次参考的是http://bbs.chinaunix.net/thread-1020343-1-1.html。首先安装FreeBSD的系统源代码,但犯了一个错误,那就是在修改/usr/share/examples/cvsup 文件中default release=cvs tag=RELENG_6
的时候想当然的只是把6改为7,结果升级并不成功,改为default release=cvs tag=RELENG_7_0后才正常。

# cvsup -g -L 2 /usr/share/examples/cvsup/standard-supfile
# cvsup -g -L 2 /usr/share/examples/cvsup/ports-supfile
升级完毕后,# cd /usr/src
# make buildworld
编译生成二进制系统文件。然后进入/usr/src/sys/i386/conf  将GENERIC文件cp一个MYCONFIG文件,加入pf选项,把不需要的选项删除后编译安装内核

# make buildkernel KERNCONF=MYCONFIG
# make installkernel KERNCONF=MYCONFIG

编译期间出现一次错误,是关于新的firewall的,由于使用pf,于是就把最后选项屏蔽掉了,结果编译安装正常。重新启动后,按照网上的介绍应该是进入单用户模式进行mergemaster -p进行校验的,由于时间比较紧,再说机器也属于测试,便直接进入正常模式#make installworld。

重新启动后,一切正常,亟不可待地uname -a查看系统信息,哈哈,显示FreeBSD   7.0-RELEASE FreeBSD 7.0-RELEASE #2: Mon Mar  3 13:59:43 UTC 2008     root@**:/usr/obj/usr/src/sys/MYCONFIG  i386升级成功!

再查看了一下系统信息,哈哈,原先6.2不能识别的intel原装945GC主板上面的千兆网卡已经能够识别,并能够正常工作,整个运转正常。最后清理一下,免得再出现上次安装出现的小问题。

cd /usr/obj/
chflags -R noschg *
rm -rf *

此次升级应该算是最顺利的一次了,除了下载源码耽误了一些时间,其他的都是太太平平过来了。此外一个小发现就是验证了此前网上一个流传很广的传言:那就是很多所谓的intel网卡实际使用的是其他厂商的芯片,比如这个主板,宣称使用的是intel的芯片,但在FreeBSD下看到的信息看,实际是RealTek 8139C+/8169/8169S/8110S芯片。但这样也好,毕竟现在最流行的板载千兆网卡大多数是这种,这样表明在其他主板上尤其是780G上面不用担心网卡问题了。

高兴真高兴,不免又Uname了几次

,算是欣赏自己的劳动成果吧。

淘宝淘宝

原先还不是很习惯使用淘宝,因为我想买的东西一般都能在科技市场买到,价格差的也不是很多,所以如果不是实在在市场找不到,才到淘宝网上买。

老爸没有什么大的爱好,就是喜欢玩一玩俄罗斯方块。最初喜欢这个游戏还是91年用外甥的插卡游戏机在电视上玩的。后来是用黑白屏的防GB的俄罗斯方块机玩。自从去年玩坏了二姐带回来的那个大屏幕的俄罗斯方块机后,只能将就着用我从沃尔玛买的一个小屏幕的游戏机玩,最近那个也出了问题,玩的时候还要不时敲打几下。

其实我一直在寻找俄罗斯方块机,但可能需求太少,机器很少,而沃尔玛买的屏幕也是一款小过一款,也从淘宝网上买过一次所谓大屏幕的,买回来一看,屏幕是很大,但方块更大,对我爸这样的高手来说,实在是小儿科,所以买回来后直接扔到仓库里面去了。

本来过年前想买一个翻盖的GBA作为新年礼物的,但济南一是价格贵,再就是济南的卖家说没有俄罗斯方块游戏卖,所以也就放下了。

上周在淘宝网上闲逛,便顺手搜索了一下gba,好家伙,品种不少,价格也是差别很大,经过比较,发现iQue小神游比较合意,便又按价格排序,发现一家行货只买350元,不免狂喜。通过旺旺联系确认为新货后,便下单定了一台。

周五定货,周一一到单位,得知周日货就到达了。打开一看,的确不错,居然还是彩屏的(孤陋寡闻啊),但可惜随机赠送的游戏一玩就死机,为了不耽误时间,中午就到舜井街买游戏,转了一圈没买到。

周三顺路到科技市场去了一圈,在老厅的卖盗版软件的地方买到了一款合集,里面有几款俄罗斯方块,插到机器上,熟悉的画面和音乐响起,试了一会,没有死机,大功告成!

我是带着机器去的,老板问我价格后,还是怀疑地拿过去检查了半天,然后恭喜我买到了行货。而济南这个价格是根本买不到的。淘宝网上宝贝真是不少,有一款dell服务器,虽然没有cpu、内存、硬盘,但600多的价格足够诱人,而一款泰安的二手服务器主板更是让我眼红。而这些在没有熟悉淘宝之前,是看不到也想不到的。真如一个网友说的,淘宝改变生活。

但淘宝的搜寻功能还不是很强,比如那个gba,开始搜了几次都没有找到的,后来是通过其他链接才找到那个专卖超人小电器的网店。如果这方面加强,肯定会大大增加交易量。

简单使用delphi+Excel的方法

一直不喜欢使用delphi操作Excel,一是因为Excel本身设置复杂,又是公式又是宏的,再就是因为网上关于delphi操作的文章动辄就长篇大论,可操作性差,而我们使用excel一般不会那么负责,只不过用于存储而已,所以我偷懒只是用文本来存储,大不了用excel打开文本文件罢了。

这周单位需要,又编写了两个程序,本来以为是一次性操作,用完了就算了,谁知前台人员感觉比较方便,希望改进一下能够日常使用,但如果再用文本存储,可能麻烦了了点,所以就想简单改进一下,直接操作excel试试。

网上文章很多,但基本上都是转来转去,大差不差,找了一些文件,又总结了一下,主要参考的是http://news.ccw.com.cn/elife/htm2007/20070611_271052_2.shtmlhttp://www.cnblogs.com/LuckyJan/articles/70559.html这两篇文章。

1、首先加入uses ComObj。

2、读取excel文件的话,先定义var XL: Variant;Sheet: Variant;

XL := CreateOleObject(‘Excel.Application’);
XL.WorkBooks.add(文件名);
Sheet:=xl.workBooks[1].worksheets[1];

定义好了sheet表之后,就可以操作了 s1:=sheet.cells[i,1];读取数据。

取表中文件数是个问题,如果简易的话,可以通过判断单元格是否为空来判断,但不能直接用定义的sheet.cells来判断,我是用笨办法:

m:=1;
i:=1;
while m>0 do
begin
ss:=trim(sheet.cells[i,1]);
if ss=” then
m:=0 else
begin
s1:=sheet.cells[i,1];
s2:=sheet.cells[i,2];
memo1.Lines.Add(s1+’-‘+s2);
i:=i+1;
end;
end;

这样就可以读取excel表中的数据了。

3、将数据写入excel反而要简单一些了,定义xl,sheet同上,下面就是:

if save1.Execute then
begin
TRY
XL := CreateOleObject(‘Excel.Application’);
Sheet:=CreateOleObject(‘Excel.Sheet’);

  EXCEPT
showmessage(‘error’);
END;
S:=save1.FileName;
Sheet:=xl.workBooks.add;
  for i:=1 to memo1.Lines.Count do
begin
ss:=memo1.Lines[i-1];
m:=pos(‘ ‘,ss);
s1:=copy(ss,1,m-1);
delete(ss,1,m-1+length(‘ ‘));
m:=pos(‘ ‘,ss);
s2:=copy(ss,1,m-1);
xl.Cells[i,1]:=s1;
xl.Cells[i,2]:=s2;
end;
sheet.SaveAS(S);
sheet.close;
XL.Quit;

 end;

其中加红的那句很重要,通过这样才能激活当前表。

用了一个下午,程序已经可以运行起来了,速度虽然慢了一点,但用起来操作要简单直观一些,不用再通过文本转换了,但问题在于系统必须安装了excel,这也是我一直不愿意使用这个组合的原因。