杂记
 


在Delphi XE2中通过DBExpress连接MySQL

作者:Cable Fan  2012-01-01 00:00:00     分类:Delphi     标签:测试,test

默认情况下,系统(Windows)中并没有默认提供DBX连接MySQL(包括其它多种数据库)的厂商驱动程序。放一个TSQLConnection控件到窗体上,它的Driver属性提供了一个下拉列表,从其中选择MySQL,IDE会自动填充其它驱动属性,点开Params属性的“…”按钮可以查看详细信息。其中VendorLib=LIBMYSQL.dll,这个LIBMYSQL.dll就是我们需要提供的厂商驱动程序。实际上这应该是MySQL提供的,如果安装了WAMP,在[WAMP安装目录]binmysqlmysql5.5.16lib目录下就有一个,不过版本并不一定匹配。

需要成功连接MySQL,首先就要解决这个厂商驱动程序问题。我测试的环境是,Delphi XE2 + WampServer2.2(MySQL5.5.16),直接使用Wamp目录下的libmysql.dll,出现这样的提示:

搜索了一下,找到一个5.1.59版本的libmysql.dll,下载地址:http://wiltonsoftware.com/download/libmysql-5.1.59-win32.zip。将其复制到Delphi XE2安装目录(如:X:Program FilesEmbarcaderoRAD Studio9.0bin)。需要注意的是,复制到这里,仅仅是保证了在IDE里设计和运行时可以成功连接MySQL,而编译出来的程序单独运行时,仍然会有上面的提示,因为程序未能找到厂商驱动程序,最好是将其复制到%systemroot%system32目录下。

成功连接MySQL之后,需要显示数据库中的数据,可能还会发现,表中的中文字符串显示成乱码(或问号)了。必须正确设置MySQL的字符集,但使用utf8以外的字符集时,程序会出现内存错误,不知道什么原因(-_-!)。所以要从源头开始使用utf8,包括数据库、表和字段,都指定utf8字符集,然后在TSQLConnection参数里将指定ServerCharSet指定为utf8才行。

我测试了来自phpMyAdmin、Delphi写的应用程序、MySQL CommandLine及PHP页面,4种方式插入的中文字符串,均能正确显示。具体请看后面的代码。

创建数据库及表(SQL):

DE

CREATE DATABASE `test` DEFAULT CHARSET utf8;

CREATE TABLE IF NOT EXISTS `dbx` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) COLLATE utf8_unicode_ci NOT NULL,
  `description` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;

INSERT INTO `dbx` (`id`, `name`, `description`) VALUES
(1, '来自phpMyAdmin', '从phpMyAdmin添加的记录。');

在Delphi程序中插入记录(Delphi):

procedure TfrmMySQL.Button2Click(Sender: TObject);
begin
  with SQLQuery1 do
  begin
    Close;
    SQL.Text:= 'INSERT INTO dbx (name, description) VALUES ('''
      + '来自Delphi App' + ''', ''' + '来自Delphi应用程序的记录'
      + ''')';
    ExecSQL;
  end;
end;
在PHP页面插入记录(PHP):
mysql_connect($mysql_hostname, $mysql_user, $mysql_password)
    or die("数据库连接失败!");
mysql_select_db($mysql_database, $bd) or die("指定的数据库损坏或不存在!");
mysql_query('set character set utf8'); // 这里设置字符集

mysql_query('insert into dbx (name, description)
    values ('来自PHP', '来自PHP Web的记录')');

$result = mysql_query('select * from dbx');
if ($result)
{
    while($rows = mysql_fetch_assoc($result))
    {
        print_r($rows);
        echo '
--------------------------------------------
';
    }
}
?>

 

更多
阅读(1227)     评论(0)