delphi11中使用FireDAC中的TFDConnection连接mysql数据库
注:网上说UniDAC连接mysql数据库,是不需要dll的,未测试。其安装方法https://blog.csdn.net/hougelou/article/details/70649563
来自:https://blog.csdn.net/qq_44111597/article/details/108256831?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-108256831-blog-113382018.235^v43^pc_blog_bottom_relevance_base8&spm=1001.2101.3001.4242.1&utm_relevant_index=3
1. 需要用到的控件:
FDConnection1,FDPhysMySQLDriverLink1,FDQuery1,DataSource1,DBGrid1 前三个控件是与Ado方式不同,后两个控件同ADO方式连接
1) FDConnection控件设置:功能类似ADOConnection,要将Params下的CharacterSet设为csUtf8,Database为ctcms,password为root,Server为192.168.13.77,Username为root,其它LoginPrompt为False,Connect为true这两个同Ado方式
2) FDPhysMySQLDriverLink1控件设置:用来设置mysql驱动库,要先将libmysql.dll(去网上下载)复制到软件目录,在控件属性窗口的VendorLib中选择libmysql.dll的路径
注:这个控件比较特殊,根据连接数据库不同而不同,比较连接SQLlite,就不用这个,而是选择TFDPhySSQLiteDriverLink
注2:libmysql.dll也可以到WAMP下的mysql目录去复制,"C:\wamp\bin\mysql\mysql5.6.17\lib\libmysql.dll" , delphi使用的是C的库,详见:https://docwiki.embarcadero.com/RADStudio/Athens/en/Connect_to_MySQL_Server_(FireDAC)
3)FDQuery1用法同ADOQuery,只需要在SQL中设置语句,如select * from ct_link,在Connection中选择FDConnection,将Active设为True
4)DataSource1,DBGrid1,用法同ADO方式
2. Libmysql.dll的下载
经测试,当前目录下三个dll都可以用,也可网上搜索新版本
3. 常见错误,将Active置为True提示的错误基本跟实际无法,比如实际是密码输错,但提示不是有效的dll文件
一般有Root@@192.168.13.43表密码错,提示很怪,因为mysql服务器实际是13.77
3.1 错误:数据上传第一遍运行正常,第二次再次执行出错,
原因1:第一遍执行后把FDQuery,与FDconnection用.free释放了,下次再次执行出错
原因2:给FDconnection,FDquery,FDPhysMySQLDriverLink1等第一次赋过值,再次赋值时也有可能出错!
4. 使用半代码连接的示例代码,测试通过,使用的libmysql.dll为当前目录下xt86下的,修改时间为2012年3月7号的dll,其它dll代码测试提示%1,不是有效的Win32应用程序不通过
procedure TForm1.Button1Click(Sender: TObject);
begin
FDConnection1.Params.DriverID := 'MySQL';
FDConnection1.Params.Add('Server=192.168.13.77');
FDConnection1.Params.Add('Port=3306');//默认端口可省略这行
FDConnection1.Params.Database := 'ctcms';
FDConnection1.Params.UserName := 'root';
FDConnection1.Params.Password := 'root';
FDConnection1.Params.Add('CharacterSet=utf8');
// FDPhysMySQLDriverLink1.VendorLib := './libmysql.dll';
FDPhysMySQLDriverLink1.VendorLib := 'C:\Users\tieguo\Desktop\SqlExpressTest\libmysql.dll';
FDQuery1.Connection := FDConnection1;
FDQuery1.SQL.Add('select * from ct_link');
DataSource1.DataSet := FDQuery1;
DBGrid1.DataSource := DataSource1;
try
FDConnection1.Open();//和下面一句是同样的效果
// FDConnection1.Connected := True;
FDQuery1.Active := True;
except on E: Exception do
ShowMessage(e.Message);
// ShowMessage 编译报错的话看看有没有声明 【uses Vcl.Dialogs;】
end;
end;
5. 全代码连接的示例代码,测试通过
procedure fcfd(var fc:TFDConnection; var fdd:TFDPhysMySQLDriverLink);
begin
fc := TFDConnection.Create(nil);
fdd := TFDPhysMySQLDriverLink.Create(nil);
fc.Params.Clear; // 清除之前的参数设置,确保没有重复或冲突的参数
fc.Params.DriverID := 'MySQL';
fc.Params.Add('Server='+trim(Mainfr.ComboBox1.Text)); // fcon1.Params.Add('Server=localhost');
fc.Params.Add('Port='+trim(Mainfr.edit2.Text)); //默认端口可省略这行
fc.Params.Database := trim(Mainfr.edit3.Text);
fc.Params.UserName := trim(Mainfr.edit4.Text);
fc.Params.Password := trim(Mainfr.edit5.Text);
fc.Params.Add('CharacterSet=gbk');
fc.Params.Add('ConnectTimeout=5'); // 设置连接超时时间为10秒
fdd.VendorLib := 'libmysql.dll'; // '.\..\..\libmysql.dll';
fc.DriverName :='MySQL';
end;
procedure TMainfr.Button13Click(Sender: TObject);
var
fc:TFDConnection;
fdd: TFDPhysMySQLDriverLink;
begin
fcfd(fc,fdd);
try
try
fc.Open();
//。。。这里加入要执行的代码
Label6.Caption:='连接数据库'+ComboBox1.Text+'成功';
except on E: Exception do
ShowMessage('连接数据库失败'+e.Message);
end;
finally
if fc.Connected then fc.Connected := false; //关闭连接
fc.Free; //释放连接对像
fdd.free; //释放驱动链接对象
end;
end;