这两天抽空研究了下Delphi2006如何连接Mysql5.1,过于追求新版本有时就会遇到此类问题,厂商实现不完善,有地方没实现或没考虑到的,直接用它的产品就会出问题。baidu搜了搜国内网站,好像还没此类文章,可能是没多少人在用Delphi2006了,呵呵。用google搜,还是老外nb啊,找到了不少连接的方法,有几种都是商业产品,例如mydac、dbx等,看看价格,还都不便宜,那个价人民币我都嫌贵,何况还是dollars。发财的机会还是很多的,趁厂商自己还没做开发个这样的数据库连接驱动也能赚一笔。大致找到了如下几种免费的办法,总结一下:
测试环境:
WinXP+SP2
Delphi2006+SP2
mysql-5.1.14-beta-win32
1.ODBC+ADO
此种方法应该是最能保证稳定和正常进行数据库操作的,但效率无疑最低,而且ODBC现在用的人已经很少了,用户安装时还要配置个ODBC,这个麻烦事估计现在已经很少人还再做了吧。
在Mysql官网上下了个ODBC驱动,mysql-connector-odbc-5.00.10-beta-gpl-win32版本,还是beta版,但问题应该也不会太大,担心有问题的人还是用mysql-connector-odbc-3.51.12-win32这个版本好了,应该比较稳定。 安装完ODBC驱动,配置数据源。在“系统DSN”中添加一个数据源,选择“MySQL Connector/ODBC v5”驱动程序,然后设置连接参数。“Data Source Name”可自己随意起,Description随便写,Server填写数据库地址,User、Password就不用多说了吧,Database是要连接的数据库,Port可不填使用默认值,默认就是3306端口,如果修改了数据库连接端口自然在此也要做相应改动。如下图。
此时配置就完成了,点击确定后可看见多出了一个刚配置的数据源。
然后进行ADO配置,新建一udl文件。提供程序选择“Microsoft OLE DB Provider for ODBC Driver”,在“连接”选项卡中进行详细配置,使用数据源就是刚才配置的ODBC数据源名称,输入用户名、密码,初始目录空白,因为此时要连接的数据库早在ODBC中就已经被指定了。点击“测试连接”,提示成功就说明配置已经完成。
做一个最简单的Demo,在Form上放上TADOConnection、TADOQuery、TDataSource、TDBGrid四个控件,具体连接和属性设置就不多说了,不会连这些都不会吧,真不会就去查查别的书,设置方法都一样的。一行代码都不用写,连程序都不用运行,就能看到数据记录已经被查询出来了。
2.DBExpress+dbxopenmysql50.dll
可能很多人会奇怪,dbxopenmysql50.dll是什么东东?DBExpress不就是数据库连接组件了吗,为什么还要加上这个东西?这是由于Delphi2006中的DBExpress对Mysql高版本的支持很差,从国外论坛上看到的说法似乎是根本就没实现,所以说虽然TSQLConnection组件中提供了Mysql选项,但直接使用的话是不行的(低版本的mysql可能可以),我遇到的现象是提示“Unable to Load libmysql.dll”,但其实我已经在系统目录System32下、Delphi安装目录的bin中、开发工程项目文件夹中都安放了该文件,还是找不到该dll。
dbxopenmysql50.dll是由老外开发的,而且开源,还是老外好啊,可以到如下网址去下载:
http://www.justsoftwaresolutions.co.uk/delphi/dbexpress_and_mysql_5.html
使用时需要将dbxopenmysql50.dll和libmysql.dll都放到工程文件夹下。顺便提一下,libmysql.dll在mysql安装目录下的\lib\opt目录中。
使用方法有两种,一种是直接修改Borland\BDS\4.0\dbExpress下的dbxdrivers.ini,调整其中关于mysql的各参数。
另一种就是在程序中指定,现在我以这种方式为例说明这种连接方式的开发方法。
在Form上放上TSQLConnection、TSQLQuery、TStringGrid、3个TButton、TLable。界面显示如下图。
在FormCreate事件中:
SQLConnection1 := TSQLConnection.Create(nil);
SQLConnection1.DriverName := 'dbxmysql';
SQLConnection1.GetDriverFunc := 'getSQLDriverMYSQL50';
SQLConnection1.LibraryName := 'dbxopenmysql50.dll';
SQLConnection1.VendorLib := 'libmysql.dll';
SQLConnection1.LoginPrompt := false;
在此设置TSQLConnection的各个具体参数,当然也可以直接在组件属性面板中修改,或者修改dbxdrivers.ini中的对应参数,方法是多种的。
Connect按钮的事件:
SQLConnection1.Params.Append('Database=user');
SQLConnection1.Params.Append('User_Name=mysql');
SQLConnection1.Params.Append('Password=mysql');
SQLConnection1.Params.Append('HostName=localhost');
SQLConnection1.Open;
if SQLConnection1.Connected = true then
Label1.Caption := 'success'
else
Label1.Caption := 'fail';
设置数据库连接的各参数配置后,打开数据库连接,同时显示连接是否成功。
Query按钮的事件:
var
i,j: Integer;
begin
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT * FROM userinfo');
SQLQuery1.Active := true;
i := 0;
SQLQuery1.First;
while not SQLQuery1.eof do
begin
for j:=0 to SQLQuery1.FieldCount-1 do
StringGrid1.cells[j,i]:=SQLQuery1.Fields[j].AsString;
SQLQuery1.next;
inc(i);
end;
SQLQuery1.Active := false;
查询表数据并在StringGrid中输出。
Disconnect按钮的事件:
if SQLConnection1.Connected = true then
SQLConnection1.Close;
FormDestroy事件:
if SQLConnection1.Connected = true then
SQLConnection1.Close;
SQLConnection1.Free;
运行程序,点击connect按钮,如果数据库连接成功可以看到success提示,然后点击query按钮就能查询到表中的数据。
3.TMySQLDatabase
这也是老外开发的pas文件,只有两个文件libmysql.pas、mysqldatabasev10.pas,其它似乎什么都不要了,相当简练。可以去如下网址下载:
http://tech.groups.yahoo.com/group/TMySQLDatabase/ 下载需要申请加入作者的组并等待批准,不过是全免费并且开源的。
使用时也只需将这两个文件放到工程文件夹中,然后就可调用了。下面开发一个简单的Demo。
在Form上放上TStringGrid、3个TButton、TLable。界面显示如下图。
在pas文件头的uses中添加MySQLDatabaseV10,说明引用了该单元。
添加声明:
public
MySQL: TMySQLDatabase;
MySQLQuery: TMySQLQuery;
end;
FormCreate事件:
MySQL:=TMySQLDatabase.Create;
创建TMySQLDatabase。
connectToDB按钮的事件:
MySQL.ServerName:='localhost';
MySQL.UserName:='mysql';
MySQL.Password:='mysql';
MySQL.DatabaseName:='user';
MySQL.Open;
if not MySQL.Active then
MessageDlg(MySQL.ErrorMessage, mtError, [mbOk], 0)
else
begin
MySQLQuery:=TMySQLQuery.Create(MySQL);
end;
if MySQL.Active and MySQL.ServerReady then
Label1.Caption := 'Success'
else
Label1.Caption := 'Fail';
设置数据库连接参数,打开数据库连接,连接成功则创建TMySQLQuery,用以进行数据操作。
queryDB按钮的事件:
var
i, j: Integer;
begin
if MySQL.Active then
begin
MySQLQuery.clear;
MySQLQuery.SQL.add('SELECT * FROM userinfo');
MySQLQuery.Open;
i:=0;
MySQLQuery.first;
while not MySQLQuery.eof do
begin
for j:=0 to MySQLQuery.FieldCount-1 do
StringGrid1.cells[j,i]:=MySQLQuery.FieldByNumber(j).AsString;
inc(i);
MySQLQuery.next;
end;
end;
查询表数据并在StringGrid中显示。
FormDestroy事件:
if not MySQL.Active then
MySQLQuery.free;
MySQL.free;
运行程序,点击connectToDB按钮,如果数据库连接成功可以看到Success提示,然后点击QueryDB按钮就能查询到表中的数据。
总结:
由于没有深入使用这三种连接方式,无法对三者的稳定性、可行性、效率等做出比较。感觉这三者在做基本数据库操作时应该都不会有问题,但在某些深层次应用中难免会存在一些bug,需要在实际应用中去慢慢得见了。这些方面应该还是那些商业化的产品做的比较好吧,条件允许建议还是购买商业化产品,维护、升级等更有保障,开源的东西毕竟和作者的个人兴致关联很大,可能随时就不再更新和维护了。