- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,最近我们(我和我的同事)一直在讨论迁移到 FireDac,我们目前正在使用 IBO 和 DBX,但主要是 IBO。然后我们决定采用从 IBO 到 FireDac 的所有内容,但是输入每个表单、更改每个 IBOQuery、添加所有字段、设置所有显示格式等等会花费太多时间,因此我们决定制作一个组件来做这件事,似乎是一项简单的任务,但我才刚刚开始,我就已经陷入了一些看似简单但我以前从未遇到过的事情中。首先我们看一下组件代码:
unit UMyComponent;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IB_Components, IB_Access,
IBODataset, Vcl.StdCtrls, Vcl.Buttons, Vcl.Grids, Vcl.DBGrids, Data.DB,
uADStanIntf, uADStanOption, uADStanParam, uADStanError,
uADDatSManager, uADPhysIntf, uADDAptIntf, uADStanAsync, uADDAptManager,
uADCompDataSet, uADCompClient;
type
TMyComponent = class(TComponent)
private
FADConnection: TADConnection;
FConverter: String;
procedure Iniciar;
procedure SetADConnection(const Value: TADConnection);
procedure SetConverter(const Value: String);
published
property Converter: String read FConverter write SetConverter;
property ADConnection: TADConnection read FADConnection write SetADConnection;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MyComponents', [TMyComponent]);
end;
{ TMyComponent }
procedure TMyComponent.Iniciar;
var
Form: TForm;
IBOQuery: TIBOQuery;
i: Integer;
procedure _ConverterIBOQuery;
var
ADQuery: TADQuery;
qName: String;
begin
qName := IBOQuery.Name;
if qName.Contains('OLD_') then
Exit;
IBOQuery.Name := 'OLD_'+ qName;
if (FindComponent(qName) = nil) then
begin
ADQuery := TADQuery.Create(Form);
ADQuery.Name := qName;
ADQuery.Connection := FADConnection;
ADQuery.SQL := IBOQuery.SQL;
{
I need to add the fields here, but I need them having a reference,
like the ones you Right Click > Fields Editor > Add All Fields (CTRL + F)
because in the final form of this component, it won't rename the old query
with an 'OLD_' prefix, it will destroy it, and the fields will be gone too,
so I need to add them (having the reference) in order to not rewrite any of my code
}
end;
end;
begin
if Owner is TForm then
Form := TForm(Owner);
if Assigned(Form) then
begin
for i := 0 to (Form.ComponentCount -1) do
{
I know it will stop in the first query it come across,
but I'm trying to full convert only one to know if it's actually possible
}
if (Form.Components[i] is TIBOQuery) then
begin
IBOQuery := TIBOQuery(Form.Components[i]);
Break;
end;
if Assigned(IBOQuery) then
_ConverterIBOQuery;
end;
end;
procedure TMyComponent.SetConverter(const Value: String);
begin
FConverter := UpperCase(Value[1]);
if (FConverter = 'S') then
Iniciar;
FConverter := '';
end;
procedure TMyComponent.SetADConnection(const Value: TADConnection);
begin
FADConnection := Value;
end;
end.
我已经尝试了一些在互联网上找到的方法,例如:
他们都没有达到我的预期,所以我很怀疑
Can I create the field references via code? And, if it's possible, how?
对于引用,我的意思是,例如,您有 IBOQuery1,SQL 是
SELECT NAME
FROM COUNTRY
之后,转到“字段编辑器”>“添加所有字段”(CTRL + F),然后您将获得引用 IBOQuery1NAME,它是一个 TStringField,您只需调用 IBOQuery1NAME.AsString 而不是 IBOQuery1.FieldByName('NAME ').AsString
TL;DR
尝试创建一个将 IBOQuery 迁移到 ADQuery 的组件,但无法创建引用
最佳答案
经过多次尝试和研究,我发现了一个与我的问题类似的老问题,很高兴有一个正是我想要的答案
How to add a field programatically to a TAdoTable in Delphi
答案由用户提供:Мסž
procedure AddAllFields(DataSet: TDataset);
var
FieldsList: TStringList;
FieldName: WideString;
Field: TField;
WasActive: boolean;
FieldDef: TFieldDef;
i: Integer;
begin
WasActive := DataSet.Active;
if WasActive then
DataSet.Active := False;
try
FieldsList := TStringList.Create;
try
DataSet.FieldDefs.Update;
// make a list of all the field names that aren't already on the DataSet
for i := 0 to DataSet.FieldDefList.Count - 1 do
with DataSet.FieldDefList[i] do
if (FieldClass <> nil) and not(faHiddenCol in Attributes) then
begin
FieldName := DataSet.FieldDefList.Strings[i];
Field := DataSet.FindField(FieldName);
if (Field = nil) or (Field.Owner <> DataSet.Owner) then
FieldsList.Add(FieldName);
end;
// add those fields to the dataset
for i := 0 to FieldsList.Count - 1 do
begin
FieldDef := DataSet.FieldDefList.FieldByName(FieldName);
Field := FieldDef.CreateField(DataSet.Owner, nil, FieldName, False);
try
Field.name := FieldName + IntToStr(random(MaxInt)); // make the name unique
except
Field.Free;
raise ;
end;
end;
finally
FieldsList.Free;
end;
finally
if WasActive then
DataSet.Active := true;
end;
end;
关于Delphi:从 IBO 迁移到 FireDac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637758/
在 Delphi Firedac 中,我有一个很长的查询。我想重用它只是通过这样的参数更改列的名称 select f1, f2 from t1 where id = :par1 and :colimn
我正在使用FireDAC的Array DML功能将大量数据插入到我的远程MS SQL数据库中。 它可以正常工作,但需要一些时间来完成执行方法。当执行方法运行时,我想知道FireDAC的内部进度,以便可
您好,我正在使用Firebird(2.5)作为数据库使用Firedac(Delphi Seattle),当我使用TFDQuery运行此查询时,未返回任何记录: SELECT ID FROM USERS
我创建了一个非常简单的控制台应用程序并尝试使用 Firedac 访问 Firebird 数据库。我正在尝试使用私有(private)定义设置来实现连接池,如下所述:http://docwiki.emb
我使用 Delphi XE7 和 FireDAC 来访问 SQLite。 当我将数据放入 TEXT 字段时,任何尾随空格或 #0 字符都会被截断。 我可以在 SQLite 或 FireDAC 中更改一
我正在开发一个在启动时带有登录表单的应用程序。 在用户写入登录数据之前,我想谨慎地连接到 SQL 服务器。 问题是,当我的服务器连接速度慢或路径错误时,应用程序正在寻找服务器或尝试连接,但此时应用程序
我目前正在开发一个多线程服务器应用程序,我计划使用 Firedac 进行数据访问。从此处提供的文档:http://docwiki.embarcadero.com/RADStudio/Tokyo/en/
我主要在后台线程中使用FireDAC,偶尔在主GUI线程中使用。 根据文档,有4种可能的执行模式,在我看来,只有2种是合适的: amBlocking The calling thread and GU
我正在尝试使用 FireDac 查询数据库。这是我的代码; procedure TfSMSViewer.LoadSMSFromDatabase(path: AnsiString); var con
我在 MS SQL Server 上创建了以下存储过程 CREATE PROCEDURE sppl_ParamTest @ID int = 666 AS BEGIN SELECT @ID;
我将 FireDac 与 Oracle 12c 数据库和 Delphi Seattle 结合使用。 我有一张员工表 EmployeeID - NUMBER GENERATED ALWAYS AS ID
我使用的是这里的示例: establishing connection 这样做: procedure TDataModule2.DataModuleCreate(Sender: TObject); b
我正在尝试用 Firedac MemoryTables 替换 Delphi ClientDatasets,它运行良好,但在处理大数据时速度非常慢我在数据模块中创建 FireDac 内存表并从表单填充它
我无法使用以下指令更新数据库中的行: fdquery1.Edit; fdquery1.fieldByName('prova').AsString := 'asdasd'; fdquery1.Open
我正在将 XE6 与 FireDac 一起使用。我有一个 FDMemTable,其中 ItemVals 作为 ftfloat 字段。我想使用 SUM(ItemVals) 的聚合函数,但我只想添加值 >
如何使用 FireDac 组件检查 DBMS 是否支持事务? 通常,我使用类似以下代码的内容,使用 dbExpress 在我的 DAO 类中执行事务。 ... connection: TSQLConn
我正在 Delphi 10.1 Berlin 下使用 FireDac。 为了向用户显示数据,我使用 TDBEdit 等数据感知控件。 我使用 TFDQuery 和 TDataSource 将它们与控件
我正在尝试使用 FireDAC 中的宏来预处理我的 SQL 查询。我在数据模块上有一个 TADQuery 对象,其 SQL 设置如下: Select * from MyTable join Oth
我想将一个非空非自动递增整数作为我的主键,但我无法在设计时使用 Firedac 来做到这一点。 TIntegerfield 没有任何参数可以让我将其设为主要参数。 TFDTable 也没有参数,我可以
我在 Firebird 数据库中定义了这个存储过程: create or alter procedure GET_MSG ( IDLNG smallint, IDMSG integer
我是一名优秀的程序员,十分优秀!