如果您对FireDAC指定mssql驱动感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于FireDAC指定mssql驱动的详细内容,并且为您提供关于(FireDAC)连接定义
如果您对FireDAC 指定 mssql 驱动感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于FireDAC 指定 mssql 驱动的详细内容,并且为您提供关于(FireDAC) 连接定义、DataSnap 与 FireDAC 三层、Delphi 10 Seattle FireDAC 连接池配置过程、Delphi Firedac - FieldName 问题的有价值信息。
本文目录一览:- FireDAC 指定 mssql 驱动
- (FireDAC) 连接定义
- DataSnap 与 FireDAC 三层
- Delphi 10 Seattle FireDAC 连接池配置过程
- Delphi Firedac - FieldName 问题
FireDAC 指定 mssql 驱动
bool __fastcall IsWow64()
{
// 为 True 时,则是 32 位的程序运行在 64 位的系统上,为 False 时,则是 32 位程序运行在 32 位系统上或 64 位程序运行在 64 位系统上!
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE,PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL bIsWow64=FALSE;
fnIsWow64Process=(LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(L"kernel32"),"IsWow64Process");
if(fnIsWow64Process!=NULL)
{
if(!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
bIsWow64=FALSE;
}
}
if(bIsWow64==FALSE)
return false;
else
return true;
}
//---------------------------------------------------------------------------
UnicodeString __fastcall GetSQLServerNativeClientDll()
{
UnicodeString Key,Value,DllName=L"sqlsrv32.dll";
TStringList *List=new TStringList();
TRegistry *Registry = new TRegistry();
Registry->Access=KEY_QUERY_VALUE|KEY_READ;
Registry->RootKey=HKEY_LOCAL_MACHINE;
if(IsWow64())
Key="SOFTWARE\\Wow6432Node\\ODBC\\ODBCINST.INI";
else
Key="SOFTWARE\\ODBC\\ODBCINST.INI";
if(Registry->KeyExists(Key))
{
//ShowMessage(Key);
Registry->OpenKey(Key,false);
Registry->GetKeyNames(List);
for(int i=List->Count;i>0;i--)
{
Value=List->Strings[i-1];
//ShowMessage(Value); //
if(Value.Pos(L"SQL Server Native Client")>0||Value.Pos(L"SQL Native Client")>0)
{
Registry->OpenKey(Value,false);
DllName=Registry->ReadString(L"Driver");
break;
}
}
}
Registry->CloseKey();
delete Registry;
delete List;
//ShowMessage(DllName);
return DllName;
}
(FireDAC) 连接定义
连接定义就是应用程序使用特定的FireDAC驱动连接数据库的参数集合。相当于BDE的别名,ADO的UDL,或者ODBC的DSN。
For the list of supported database management systems and corresponding parameters, see FireDAC Database Connectivity.
FireDAC支持三种连接定义:
Type |
Description |
Pros |
Cons |
Persistent 固定连接 |
1.有个唯一名称, 2.由FDManager负责管理, 3.保存在一个连接定义文件中。 |
可能定义一次并在多个应用程序中交叉重复使用。可以被用于连接池 |
(server address, DB name, 等)参数公共可见并且可能随时改变。FDManager必须重新激活或者重启IDE以使新加的连接定义在设计时可见. |
Private 私有连接 |
1.有个唯一名称, 2.由FDManager负责管理, 3.不保存在连接定义文件中。 |
定义连接的参数在应用程序之外不可见。可用于连接池。 |
当每个程序重启后,应用程序需要建立个私有连接,其它程序不能共享。不能在设计时建立. |
Temporary 临时连接 |
1.没有唯一名称, 2.不由FDManager管理 3.不保存在连接定义文件中。 |
最简易建立连接定义的方法,通过填写 TFDConnection.Params 属性来完成. 可以在设计时通过TFDConnection component editor 输入参数来完成连接定义. |
私有连接简单,不能用名称引用,不能用于连接池。 |
Connection Definition File
固定连接保存在一个外部文件 - 连接定义文件中。
此文件是标准的INI文本文件,可首先选择用 FDExplorer 或 FDAdministrator 实用程序来编辑, 也可手动或用代码来编辑。. 系统默认文件是C:\Users\Public\Documents\Embarcadero\Studio\14.0\FireDAC\FDConnectionDefs.ini.
注意:当你使用 FDExplorer or FDAdministrator 建立一个固定连接,且当RAD Studio IDE 运行中, 会看不到 FireDAC 设计时代码. 要刷新连接定义列表,你需要重启 FDManager 或 RAD Studio IDE.
Sample content of this file:
[Oracle_Demo]
DriverID=Ora
Database=ORA_920_APP
User_Name=ADDemo
Password=a
MetaDefSchema=ADDemo
;MonitorBy=Remote
[MSSQL_Demo]
DriverID=MSSQL
Server=127.0.0.1
Database=Northwind
User_Name=sa
Password=
MetaDefSchema=dbo
MetaDefCatalog=Northwind
MonitorBy=Remote
应用程序可在 FDManager.ConnectionDefFileName 属性中指定连接定义文件名.
FireDAC 在下面位置搜索连接定义文件:
·指定了连接定义文件名:
·文件名不带路径时,在应用程序文件夹下搜索该文件名。
·带路径的文件名则直接搜索它。
·没有指定连接定义文件名:
·在应用程序文件夹中搜索FDConnectionDefs.ini 文件。
·如果文件没有找到,则搜索 HKCU\Software\Embarcadero\FireDAC\ConnectionDefFile. 默认是 C:\Users\Public\Documents\Embarcadero\Studio\14.0\FireDAC\FDConnectionDefs.ini.
注意: 在设计时期 FireDAC 忽略 FDManager.ConnectionDefFileName的值, 只在RAD Studio Bin 文件夹或registry指定位置寻找, 如果找不到文件,抛出异常。
如果FDManager.ConnectionDefFileAutoLoad 为 True, 自动调用连接定义文件,否则,必须在第一个连接定义信息使用之前用FDManager.LoadConnectionDefFile方法来调用文件。例如设定TFDConnection.Connected 为 True之前.
Creating a Persistent Connection Definition
建立固定连接定义
可以使用 FDExplorer or FDAdministrator建立固定连接定义。 这是如何在代码中实现。可以看例子 FireDAC\Samples\Comp Layer\TFDConnection\ConnectionDefs.
下面代码段建立一个名为 "MSSQL_Connection"的连接定义,带所有所需参数连接到 Microsoft SQL Server 本地连接, 使用了 OS authentication (SSPI):
uses
FireDAC.Comp.Client, FireDAC.Stan.Intf;
var
oDef: IFDStanConnectionDef;
begin
oDef := FDManager.ConnectionDefs.AddConnectionDef;
oDef.Name := ''MSSQL_Connection'';
oDef.DriverID := ''MSSQL'';
oDef.Server := ''127.0.0.1'';
oDef.Database := ''Northwind'';
oDef.OSAuthent := True;
oDef.MarkPersistent;
oDef.Apply;
.....................
FDConnection1.ConnectionDefName := ''MSSQL_Connection'';
FDConnection1.Connected := True;
FDManager 在 FireDAC连接管理中是一个全局对象. 其属性 FDManager.ConnectionDefs: IFDStanConnectionDefs 是在固定连接和私有连接中的一个集合。 AddConnectionDef 方法添加一个新连接定义。 MarkPersistent 方法标记连接定义为固定连接定义。 Apply 方法保存连接定义到连接定义文件中。没有调用MarkPersistent ,表示是私有连接定义。.
Creating a Private Connection Definition
私有连接定义只能用代码建立。和上面的代码类似,只是不必调用MarkPersistent 即可。
Also, you can use a technique similar to BDE:
你也可类似BDE的使用方法:
var
oParams: TStrings;
begin
oParams := TStringList.Create;
oParams.Add(''Server=127.0.0.1'');
oParams.Add(''Database=Northwind'');
oParams.Add(''OSAuthent=Yes'');
FDManager.AddConnectionDef(''MSSQL_Connection'', ''MSSQL'', oParams);
.....................
FDConnection1.ConnectionDefName := ''MSSQL_Connection'';
FDConnection1.Connected := True;
Creating a Temporary Connection Definition
临时连接可以在设计期用FireDAC Connection Editor来建立. 双击 TFDConnection 即可打开:
Or at run time in code by filling the TFDConnection.Params property.
或者在运行时填充参数,这是最简单的建立连接定义的方法。
FDConnection1.DriverName := ''MSSQL'';
FDConnection1.Params.Add(''Server=127.0.0.1'');
FDConnection1.Params.Add(''Database=Northwind'');
FDConnection1.Params.Add(''User_name=sa'');
FDConnection1.Connected := True;
另外的选择是在设计期指定一个连接字符串,填到 TFDConnection.ConnectionString 属性。 A connection string may be a convenient way to specify connection definition parameters for certain types of applications. 在应用程序已知类型的连接参数情况下,使用连接字符串定义连接会是一个不错的方法。For example:
FDConnection1.ConnectionString := ''DriverID=MSSQL;Server=127.0.0.1;Database=Northwind;User_name=sa'';
FDConnection1.Connected := True;
Editing a Connection Definition
应用程序可能需要在运行时使用标准FireDAC编辑对话框建立和编辑连接定义的能力,来编辑保存在TFDConnection中的临时连接定义,使用以下代码::
uses
FireDAC.VCLUI.ConnEdit;
...
if TfrmFDGUIxFormsConnEdit.Execute(FDConnection1, '''') then
FDConnection1.Connected := True;
To edit a connection definition represented as a FireDAC connection string, use the code:
uses
FireDAC.VCLUI.ConnEdit;
...
var
sConnStr: String;
...
sConnStr := FDConnection1.ResultConnectionDef.BuildString();
if TfrmFDGUIxFormsConnEdit.Execute(sConnStr, '''') then begin
FDConnection1.ResultConnectionDef.ParseString(sConnStr);
FDConnection1.Connected := True;
end;
- #include <FireDAC.VCLUI.ConnEdit.hpp>
- TfrmFDGUIxFormsConnEdit * f = new TfrmFDGUIxFormsConnEdit(this);
- String sConnStr = DSServerModule1->FDConnection1->ResultConnectionDef->BuildString();
- if(f->Execute(sConnStr, ""))
- {
- DSServerModule1->FDConnection1->ResultConnectionDef->ParseString(sConnStr);
- DSServerModule1->FDConnection1->Connected = True;
- }
DataSnap 与 FireDAC 三层
相交资料:
http://blog.csdn.net/shuaihj/article/details/6129131
http://www.cnblogs.com/hnxxcxg/p/4007876.html
http://www.cnblogs.com/hnxxcxg/p/4008789.html
http://www.dfwlt.com/forum.php?mod=viewthread&tid=729 (生成 Unit2)
PS:
右键点击 TSQLConnection 选择 “Generate DataSnap client classes” 生成,Uuit2。
服务端实例:
unit ServerMethodsUnit1;
interface
uses System.SysUtils, System.Classes, System.Json,
Datasnap.DSServer, Datasnap.DSAuth, DataSnap.DSProviderDataModuleAdapter,
Datasnap.Provider, FireDAC.Stan.ExprFuncs, FireDAC.Phys.SQLiteDef,
FireDAC.UI.Intf, FireDAC.VCLUI.Wait, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Error, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Stan.Param, FireDAC.DatS,
FireDAC.DApt.Intf, FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet,
FireDAC.Comp.Client, FireDAC.Comp.UI, FireDAC.Phys.SQLite,
FireDAC.Stan.Storage,//未知
FireDAC.Stan.StorageBin,//未知
FireDAC.Stan.StorageJSON,//未知
FireDAC.Stan.StorageXML,//未知
Data.FireDACJSONReflect;//TFDJSONDataSets返回表使用
type
TServerMethods1 = class(TDSServerModule)
DataSetProvider1: TDataSetProvider; //要增加的控件
FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink;//要增加的控件
FDGUIxWaitCursor1: TFDGUIxWaitCursor; //要增加的控件
FDConnection1: TFDConnection; //要增加的控件
FDQuery1: TFDQuery;//要增加的控件
DataSource1: TDataSource;//要增加的控件
private
{ Private declarations }
public
{ Public declarations }
function EchoString(Value: string): string;
function ReverseString(Value: string): string;
//用户查询数据
function GetDataTable(Value: string): TFDJSONDataSets;
//用户删除记录
function DeleteData(Value:string):string;
end;
implementation
{$R *.dfm}
uses System.StrUtils;
function TServerMethods1.EchoString(Value: string): string;
begin
Result := Value;
end;
function TServerMethods1.ReverseString(Value: string): string;
begin
Result := System.StrUtils.ReverseString(Value);
end;
//用户查询数据
function TServerMethods1.GetDataTable(Value: string): TFDJSONDataSets;
begin
//指定数据库
FDConnection1.DriverName := ''SQLite'';
FDConnection1.Params.Add(''Database=E:\diarydate.db'');
//控件的联接情况
FDQuery1.Connection := FDConnection1;
DataSource1.DataSet := FDQuery1;
//用户查询
FDQuery1.SQL.Text := Value;//SELECT * FROM tproject
//打开数据集
FDConnection1.Open();
FDQuery1.Open();
//建立多个数据集返回集
Result := TFDJSONDataSets.Create;
//你也可以给自己的数据集起外名字
//TFDJSONDataSetsWriter.ListAdd(Result, ''A123'', FDQuery1);
TFDJSONDataSetsWriter.ListAdd(Result, FDQuery1);
end;
//用户删除记录
function TServerMethods1.DeleteData(Value: string): string;
begin
//代表空
Result := ''0'';
//指定数据库
FDConnection1.DriverName := ''SQLite'';
FDConnection1.Params.Add(''Database=E:\diarydate.db'');
//控件的联接情况
FDQuery1.Connection := FDConnection1;
DataSource1.DataSet := FDQuery1;
//用户查询
FDQuery1.SQL.Text := Value;//delete from tproject where fid=2
//打开数据集
FDConnection1.Open();
FDQuery1.ExecSQL;
//代表完成
Result := ''1'';
end;
end.
客户端实例:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DBXDataSnap, IPPeerClient,
Data.DBXCommon, Data.DB, Data.SqlExpr, Data.FMTBcd, Vcl.StdCtrls,
FireDAC.Stan.Intf, FireDAC.Comp.DataMove,
FireDAC.Stan.Option, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
FireDAC.DApt,
FireDAC.Comp.Client,
FireDAC.Stan.Param, FireDAC.Stan.Error,
FireDAC.Comp.DataSet, Vcl.Grids, Vcl.DBGrids, Datasnap.DBClient,
Datasnap.DSConnect,
Unit2,//DataSnap单元
Data.FireDACJSONReflect,//TFDJSONDataSets使用
FireDAC.Stan.StorageJSON,//未知
FireDAC.Stan.StorageBin, //未知
FireDAC.Stan.StorageXML,//未知
FireDAC.Stan.Storage, //未知
Datasnap.Provider;
type
TForm1 = class(TForm)
SQLConnection1: TSQLConnection; //要增加的控件
SqlServerMethod1: TSqlServerMethod; //要增加的控件
button1: TButton; //要增加的控件
button2: TButton; //要增加的控件
FDStanStorageJSONLink1: TFDStanStorageJSONLink; //要增加的控件
FDStanStorageBinLink1: TFDStanStorageBinLink; //要增加的控件
FDMemTable1: TFDMemTable; //要增加的控件
DBGrid1: TDBGrid; //要增加的控件
DataSource1: TDataSource; //要增加的控件
Button3: TButton; //要增加的控件
procedure button1Click(Sender: TObject);
procedure button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.button1Click(Sender: TObject);
begin
SqlServerMethod1.ParamByName(''Value'').AsString:=''Hello world'';
SqlServerMethod1.ExecuteMethod;
ShowMessage(SqlServerMethod1.ParamByName(''ReturnParameter'').AsString);
end;
procedure TForm1.button2Click(Sender: TObject);
var
oDSList: TFDJSONDataSets;
oDataModel: TServerMethods1Client;
begin
try
//连接指定IP和Port的应用服务器
SQLConnection1.Close;
//这我用的是本机的,所以就没有写
//SQLConnection1.Params.Values[''HostName''] := edtIP.Text;
//SQLConnection1.Params.Values[''Port''] := edtPort.Text;
try
SQLConnection1.Open;
try
//创建应用服务器上的Sample Methods在客户端的实现类
oDataModel := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
//执行服务器上的方法
FDMemTable1.Close;
oDSList := oDataModel.GetDataTable(''SELECT * FROM tproject'');
FDMemTable1.AppendData(TFDJSONDataSetsReader.GetListValue(oDSList, 0));
FDMemTable1.Open;
finally
oDataModel.Free;
end;
except
on E: Exception do
ShowMessage(E.Message);
end;
finally
SQLConnection1.Close;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
oDataModel: TServerMethods1Client;
bIsTrue: string;
begin
try
//连接指定IP和Port的应用服务器
SQLConnection1.Close;
//这我用的是本机的,所以就没有写
//SQLConnection1.Params.Values[''HostName''] := edtIP.Text;
//SQLConnection1.Params.Values[''Port''] := edtPort.Text;
try
SQLConnection1.Open;
try
//创建应用服务器上的Sample Methods在客户端的实现类
oDataModel := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
bIsTrue := oDataModel.DeleteData(''delete from tproject where fid=2'');
ShowMessage(bIsTrue);
finally
oDataModel.Free;
end;
except
on E: Exception do
ShowMessage(E.Message);
end;
finally
SQLConnection1.Close;
end;
end;
end.
Delphi 10 Seattle FireDAC 连接池配置过程
总结
以上是小编为你收集整理的Delphi 10 Seattle FireDAC 连接池配置过程全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Delphi Firedac - FieldName 问题
如何解决Delphi Firedac - FieldName 问题?
我将基于 MS Access 的应用程序 (Delphi 10.3) 从 ADODB 迁移到 Firedac。
当某些 TField FieldName 具有复杂名称时,我遇到了问题:
简单示例:CREATE TABLE TEST ([SE_NAME] CHAR(3))
关于 SELECT * FROM TEST T1 LEFT JOIN TEST T2 ON T1.SE_NAME=T2.SE_NAME
之类的查询
我期望 FieldNames :''T1.SE_NAME'' 和 ''T2.SE_NAME''(就像在 Access 2013 中一样)。
使用 ADODB TADOQuery :
var f: TField;
var s: string := '''';
for f in Query.Fields do
s := s + f.FieldName + '' ;'' ;
s 是 ''T1.SE_NAME ;T2.SE_NAME ;'' OK。
使用 Firedac TFDQuery:
var f: TField;
var s: string := '''';
for f in Query.Fields do
s := s + f.FieldName + '' ;'' ;
s 是 ''SE_NAME ;SE_NAME_1 ;'' :不正常:FireDac 更改了列名称。
如何保持(使用 Firedac 选项?)真实的列名,而不改变 sql 查询(为了兼容需要)?
在 MSAccess (2013) 中,SELECT * FROM TEST T1 LEFT JOIN TEST T2 ON T1.SE_NAME=T2.SE_NAME
的结果是:
注意:
- 我知道如何使用查询、别名...但我需要保留查询的兼容性。
- 查询只是示例(不是真正的查询)。
解决方法
这被称为 technical dept:您过去做出了您认为很好的决定,现在证明与您过去做出不同选择(以更低的成本)相比,它造成的损害更大。
SELECT * FROM test JOIN test
立即提出问题:
- 为什么同一个表与自身连接?这几乎是有道理的。
- 真的需要所有列吗?这是非常有效的。
你应该克服你的设计决定并修复它:
-
仅选择您实际需要的那些列。无论表有多少列。这也有助于在跟踪问题时避免歧义(同时有助于总体性能)。
-
使用别名准确获得您想要的结果:
- 如果您希望
t1.column
作为结果中的列名,则通过SELECT t1.column AS "t1.column"
定义它(Ansi SQL,大多数 DBMS 都支持这一点)。 -
MS Access 需要方括号和does not allow dots in aliases(错误信息说“标点符号”,但逗号和冒号都可以),所以你必须想出你自己的逻辑,即下划线:
SELECT t1.column AS [t1_column]
。或者直接使用一个独特的别名。
如果你不定义它,你不能指望没有任何惊喜(FireDAC肯定想帮助你处理带下划线的后缀,否则它只会覆盖现有的匹配项)。只需在不同的 DBMS 中尝试
SELECT 1+ 1* 2 FROM table
并查看生成的结果列名称 - 我想知道您如何准备在不使用列别名的情况下访问它。 - 如果您希望
-
您甚至可以多次从同一个表中选择同一列:
SELECT column AS c1,column+ 2021 AS c2 FROM test
,但您希望在不使用别名的情况下神奇地解决问题吗?只需使用它们 - 不要让它未定义。有疑问做SELECT name AS name FROM test AS t
(即使这样也不能完全确定结果列名是否变成name
或NAME
- 这就是为什么你应该在你的周围使用引号别名)。 -
如果您想将
SELECT * FROM
与Query.Fields.Fieldname
混合使用以获得一个表可以具有的列名列表,那么每个表而不是抛出多个表进入查询。甚至这种方法也不好 - 而是参考 DBMS 信息模式 - in FireDAC there areGet*Names()
methods for that。
交叉链接FireDAC adding underscore和SQL select join: is it possible to prefix all columns as ''prefix.*''?
关于FireDAC 指定 mssql 驱动的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于(FireDAC) 连接定义、DataSnap 与 FireDAC 三层、Delphi 10 Seattle FireDAC 连接池配置过程、Delphi Firedac - FieldName 问题等相关内容,可以在本站寻找。
本文标签: