- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TADOConnection.Execute
函数返回一个 _Recordset
。
为了简单起见,我目前使用此代码(1):
V := ADOConnection1.Execute(SQL).Fields[0].Value;
我知道记录集永远不会为空,所以不用担心BOF
。
现在我可以使用本地 _Recordset
变量(2)这样编写它。
var
rs: _Recordset;
rs := ADOConnection1.Execute(SQL);
V := rs.Fields[0].Value;
更多代码。
现在我的问题是:由于_Recordset
是Execute函数返回的接口(interface)变量,如果我不使用本地rs
,它会被正确释放吗> 变量 (1)?使用我的简化代码(1)是否安全,这里可能存在引用计数问题吗?
我想了解有关此问题的一些见解。
<小时/>编辑:我的问题是针对具体案例的:
V := ADOConnection1.Execute(SQL).Fields[0].Value
其中我没有对 _Recordset
的局部变量引用。
最佳答案
试试这个:创建一个包含单行的过程
V := AdoConnection1.Execute(Sql).Fields[0].Value;
,在其上放置断点运行应用程序并查看反汇编结果。您会在该行之前看到它
jmp @HandleFinally
有 3 个调用
call @IntfClear
这是编译器释放它必须访问的三个接口(interface)才能执行该语句,即
因此,它在执行源语句后自动生成了释放这些接口(interface)所需的代码。
下面是一个不完美的类比,但它的反汇编更容易理解;它说明了编译器自动生成的用于处理终结接口(interface)的代码。
给定
type
IMyInterface = interface
function GetValue : Integer;
end;
TMyClass = class(TInterfacedObject, IMyInterface)
function GetValue : Integer;
destructor Destroy; override;
end;
TForm1 = class(TForm)
[...]
procedure Button1Click(Sender: TObject);
end;
destructor TMyClass.Destroy;
begin
inherited;
end;
function TMyClass.GetValue: Integer;
begin
Result := 1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I : IMyInterface;
begin
I := TMyClass.Create;
Caption := IntToStr(I.GetValue);
end;
Button1Click的CPU拆解如下
红色箭头线是界面被清除的地方,尽管有源代码没有做任何明确的事情来做到这一点。打断点
inherited
在 TMyClass.Destroy 中,你会发现它也会被调用,尽管源代码没有显式调用它。
正如我所说,以上是一个不完美的类比。有趣的是,对于可怕的(从使用“with”结构的角度来看)替代方案
procedure TForm1.Button1Click(Sender: TObject);
begin
with IMyInterface(TMyClass.Create) do
Caption := IntToStr(GetValue);
end;
不使用(显式)局部变量,编译器生成与反汇编所示的完全相同代码。
当然,q中的情况略有不同,因为分配给记录集对象的内存位于Ado COM接口(interface)的另一侧,因此人们无法控制该内存是否被正确地解除分配。编译器将生成代码以在其接口(interface)上调用 _Release。
关于delphi - 将 _Recordset 结果与 TADOConnection.Execute 函数结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32049222/
我试图了解 Delphi 如何处理作业。我有一个名为 GlobalConn 的全局连接(TADoConnection)... 我有一个使用传入的变量进行数据库调用的函数: function MakeD
使用 D5 中的 TAdoConnection 使用密码 sa 帐户连接到 Windows 7 64 位计算机上的本地 Sql Server,我收到错误“用户 sa 登录失败”,尽管我已经构建了TAd
我已经创建了一个 TCPip 服务器应用程序。该应用程序有一个全局 TADOConnection。此全局 ado 连接既可用于主线程查询,也可用于线程进程内。 这样可以吗? ADOConnection
我正在使用以下连接字符串: ADOConnection1.ConnectionString := 'Driver={MySQL ODBC 3.51 Driver};' +
我需要检测 TAdoConnection 何时出现组件已失去与服务器的连接。我尝试过使用 OnDisconnect事件,但仅当调用 Close 方法或 Connected 属性设置为 false 时才
我有一个带有全局 TADOConnection 的数据模块(默认 KeepConnection 设置为 true)。我现有的应用程序中有大量数据集和查询使用此全局 TADOConnection。 我想
好吧,我的应用程序运行得很好,直到我决定通过创建 DataModule 表单并将所有数据库组件移至其中来稍微清理一下设计时表单。我正在使用 Delphi XE2 Update 1 和这些组件:TADO
我收到了存储在 Variant 中的 native COM ADOConnection。我想将此连接的接口(interface)传递给 VCL 包装器 TADOConnection。问题是我收到无效的
最终答案: 这不是 Delphi 问题,只是配置问题。 我使用Xampp来提供MySql服务器。 C:\xampp\mysql\bin>mysql.exe --version mysql.exe
我正在尝试在 Delphi 7 中编写一个 ADO 数据库分析器。 它是德尔福项目的一部分。 我正在使用 OnExecuteComplete事件,但在某些 PC 上,我收到“MSADO15.DLL”访
使用带有 ADO 对象的 Delphi 7,是否可以从 TADOConnection 对象确定 ODBC 数据库驱动程序?因此检测是否是MS-Access或SQL Server或Oracle等。 程序
TADOConnection.Execute 函数返回一个 _Recordset。 为了简单起见,我目前使用此代码(1): V := ADOConnection1.Execute(SQL).Field
当我在 32 位 delphi 应用程序中运行此代码时,与 MySql 的连接已成功建立。 {$APPTYPE CONSOLE} {$R *.res} uses AdoDb, ActiveX,
我正在尝试使用 TADOConnection 组件与 Oracle 建立数据库连接。我在表单中添加了一个 ADOConnection1。然后我将 Provider 属性设置为“SQLOLEDB”。假设
我是一名优秀的程序员,十分优秀!