首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用ADO的Delphi无效指针操作

使用ADO的Delphi无效指针操作
EN

Stack Overflow用户
提问于 2014-02-04 00:43:36
回答 1查看 611关注 0票数 0

当多次调用此代码时(在组合框的更改时调用),在第二次更改时得到错误“当对象打开时不允许操作”,在第三次更改时得到“无效指针操作”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if loadfile.Database <> nil then  
    loadfile.Database.destroy;  
Loadfile.Database := Tdatabase.create(CardSets.Text, false);  
LoadFile.Database.create(CardSets.Text, false);         
refreshlist;

创建代码只是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DataSource :=   
    'Provider=Microsoft.Jet.OLEDB.4.0' +   
    ';Data Source=' + Path +  
    ';Jet OLEDB:Engine Type=5';   
with MainWindow do  
begin   
    ADOConnection.ConnectionString := Datasource;   
    ADOConnection.LoginPrompt := False;   
end; 

而refreshlist只更新数据库中数据的可视列表。

我看过一些类似的堆栈溢出问题,但我看不出答案对我的问题有什么帮助。

附带的问题是,什么时候使用.Destroy或.Free?在这种情况下,.Free只会给出一个不同的错误。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-02-04 00:48:28

首先,调用Create两次;第二次是不必要的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if loadfile.Database <> nil then  
    loadfile.Database.destroy;  
Loadfile.Database := Tdatabase.create(CardSets.Text, false);  // First call
LoadFile.Database.create(CardSets.Text, false);               // Second call

将您的代码更改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LoadFile.Database.Free;
LoadFile.Database := TDatabase.Create(CardSets.Text, False);

第二,永远不要直接调用Destroy。使用Free代替,因为它首先检查未赋值的指针,然后调用Destroy,如果这样做是安全的。TObject.Free基本上是这样的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21540862

复制
相关文章
VB使用ADO操作Access数据库的案例分享
这里只是个简单不能再简单的VB小程序实例,但它包含这几个关键字:VB6.0、ADO、Access
大师级码师
2022/11/06
2.3K0
使用ADO或ADO控件访问数据库
上篇文章,为大家讲解了数据库的接口,大家对ADO也有了较为基础的了解,这篇文章主要解决大家对ADO的用处的疑惑。VB为用户提供了很多访问数据库的方式:
程序猿小亮
2021/01/29
1.7K0
VB语言使用ADO连接、操作SQLServer数据库教程
对于小白来讲,这里的教程最详细,连接ADO数据库第一步,要添加什么部件呢?全称是Microsoft ADO Data Control 6.0 (SP6) (OLEDB) 部件。
大师级码师
2022/11/06
3.4K0
Delphi中使用RTTI
运行期类型信息(RTTI)是一种语言特征,能使应用程序在运行时得到关于对象的信息。
Vaccae
2019/07/24
1.9K0
Delphi语言_DELPHI
总结一下SQL语句中引号(‘)、quotedstr()、(”)、format()在SQL语句中的用法以 及SQL语句中日期格式的表示(#)、(”) 在Delphi中进行字符变量连接相加时单引号用(”’),又引号用(””)表示 首先定义变量 var AnInt:integer=123;//为了方便在此都给它们赋初值。虽然可能在引赋初值在某些情况下不对 AnIntStr:string=’456′; AStr:string=’abc’; AFieldName: string=’字符型编号’; ATableName: string=’YourTable’; ADate:Tdatetime=now; Adoquery1:tadoquery; 1,Delphi语句 adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 字符型编号=’abc’ and 整型编号=123′; 等价于 adoquery1.sql.text:= ‘select ‘+AFieldName+’ from ‘+ATableName+’ where ‘+AFieldName +’=”’+AStr+”’ and 整型编号=’+AnIntStr; 也等价于 adoquery1.sql.text:= ‘select ‘+AFieldName+’ from ‘+ATableName+’ where ‘+AFieldName +’=’+QuotedStr(AStr)+’ and 整型编号=’+Inttostr(AnInt); 传到数据库服务器为: select 字符型编号 from YourTable where 字符型编号=’abc’ and 整型编号=123 2,Delphi语句中日期表示 对于access数据库: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=#2003-12-01#’; 等价于: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=#’+FormatDateTime(‘yyyy-MM-dd’,now)+’#’; 传到服务器为: select 字符型编号 from YourTable where 日期型字段=#2003-12-01# 对于MSSQL数据库: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=’2003-12-01”; 等价于: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=”’+FormatDateTime(‘yyyy-MM-dd’,now)+””; 也等价于: 等价于: adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段=’+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now)); 传到服务器为: select 字符型编号 from YourTable where 日期型字段=’2003-12-01′ 日期字段还可以这样表示 Delphi语句 adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段>=’+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now)) +’ and 日期型字段<=’+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now+1));//明天 等价于 adoquery1.sql.text:= ‘select 字符型编号 from YourTable where 日期型字段 between ‘+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now)) +’ and ‘+QuotedStr(FormatDateTime(‘yyyy-MM-dd’,now+1)); 如果用 adoquery1.sql.add(); 形式又如何操作?请用Insert语句示例 adoquery1.sql.add(‘ insert into ‘+AtableName); adoquery1.sql.add(‘ ( ‘+AFieldName+’)’); a
全栈程序员站长
2022/11/02
1.6K0
Golang指针的操作以及常用的指针函数
在这个示例中,swap()函数使用指针作为参数,从而可以修改main()函数中传递的变量a和b的值。
周小末天天开心
2023/10/16
2210
delphi7中idHTTP的使用
IdHTTP1.HandleRedirects := True;//允许头转向 IdHTTP1.ReadTimeout := 30000;//请求超时设置 IdHTTP1.HTTPOptions:=IdHTTP1.HTTPOptions+[hoKeepOrigProtocol]; IdHTTP1.ProtocolVersion:=pv1_1; IdHTTP1.Request.Connection := ‘keep-alive’; IdHTTP1.Request.CacheControl := ‘no-cache’; IdHTTP1.Request.AcceptLanguage:=’zh-cn’; IdHTTP1.Request.AcceptEncoding:=’gzip, deflate’; IdHTTP1.Request.ContentType := ‘text/xml;application/x-www-form-urlencoded; Charset=UTF-8’; postStream:=TStringStream.Create(ansitoUTF8(gv_mz_cf_xml));
全栈程序员站长
2022/09/14
1.8K0
C# 数据操作系列 - 2. ADO.NET操作
在上一篇中初略的介绍了一下SQL的基本写法,这一篇开始我们正式步入C#操作数据库的范围。通过这一系列的内容,我想大家能对于数据库交互有了一定的认识和基础。闲话不多说,先给大家介绍一个C#操作数据库的方式。
程序员小高
2020/05/14
1.8K0
C# 数据操作系列 - 2. ADO.NET操作
【C 语言】指针数据类型 ( 指针类型变量 | 使用 * 操作内存 )
测试 指针 变量占用的内存空间大小 : 定义一个 int * 指针类型变量 , 使用 sizeof 函数 获取该变量的大小 ;
韩曙亮
2023/03/29
6710
【C 语言】指针数据类型 ( 指针类型变量 | 使用 * 操作内存 )
Linux编程--指针的++操作
在学习ELF文件的过程中,看到Matrix中有类似于如下的代码来遍历ELF文件的e->phdr程序头表的内容。
None_Ling
2019/04/22
8490
指针的理解与操作
将指针的等同于指针变量是不严格的说法,指针并不是存放地址,指针变量才可以存放地址。我们从概念上区分。但是可能会通常会把指针变量也简化称之为指针了,但是我们需要知道,实际上并不等同。 然后我们简单写代码也可以验证这个说法
兰舟千帆
2022/07/16
3910
指针的理解与操作
delphi 使用windowsmediaplayer播放视频
delphi7中原本自带的一个Tmediaplayer控件,但是发现有不少视频是无法播放的,于是就想到了用windowsmediaplayer来进行播放。
Vaccae
2019/07/25
3.1K0
delphi 使用windowsmediaplayer播放视频
指针的使用
指针的语法 声明一个指针变量的语法: <type>  *<ptr_name>; 注:该语法不仅仅指出一个变量为指针,同时表明指针所指向的内存的类型。 指针的指向:变量的地址 指针既可以直接指向新分配的内存,也可以指向一个已经存在的变量。 为了获得变量地址(即变量在内存中的位置),要把符号&放在变量名前。&称为取地址操作符,因为它能返回变量的内存地址: int x; int *p_x = &x; *p_x = 2; cout << x << endl; //输出x的值等于2
Zoctopus
2018/06/04
5740
DELPHI IDE中部分操作快捷方式
DELPHI IDE中部分操作快捷方式 1 代码模板 : CTRL+J 2 代码整块移动 : CTRL+SHIFT+I(右移) CTRL+SHIFT+U(左移) 3 选中窗体 : 先选中任一控件,SHIFT+鼠标左键 4 将鼠标指向变量名、单元名、类名,再用 CTRL+鼠标左键 可找到相应的说明 5 在过程、函数、事件内部, SHIFT+CTRL+向上的方向键 可跳跃到相应的过程、函数、事件的定义 6 相反,在过程、函数、事件的定义处,SHIFT+CTRL+向下的方向键 可跳跃到具体过程、函数、事件内部 7 CTRL + SHIFT + C:编写申明或者补上函数 8 SHIFT + CTRL + E 显示 EXPLORER 9 CTRL + SHIFT + N (n=1,2,3,4......)定义书签 10 CTRL + N (n=1,2,3,4......)跳到书签n 11 ALT + 鼠标左键 可以块选代码,删除对齐的重复代码非常有用 12 CTRL + PageUp 将光标移至本屏的第一行,屏幕不滚动。 13 CTRL + PageDown 将光标移至本屏的最后一行,屏幕不滚动。 14 CTRL + ↓ 向下滚动屏幕,光标跟随滚动不出本屏。 15 CTRL + ↑ 向上滚动屏幕,光标跟随滚动不出本屏。 16 CTRL + Home 将光标移至文件头。 17 CTRL + End 将光标移至文件尾。 18 CTRL + B Buffer List窗口。 19 CTRL + I 同Tab键。 20 CTRL + M 同Enter键。 21 CTRL + N 同Enter键,但光标位置保持不变。 22 CTRL + T 删除光标右边的一个单词。 23 CTRL + Y 删除光标所在行。 24 CTRL + SHIFT + ↑ 光标在函数体内时,将光标快速移至当前函数声明处。 25 CTRL + SHIFT + ↓ 光标在函数声明行时,将光标快速移至函数定义处。 26 CTRL + SHIFT + C 声明一个过程或函数后,直接生成过程或函数的名称、begin、end; 27 CTRL + SHIFT + E 光标在Edit窗口和Explorer窗口间切换。 28 CTRL + SHIFT + G 插入GUID。 29 CTRL + SHIFT + J 弹出Delphi语句提示窗口,选择所需语句将自动完成一条语句。 30 CTRL + SHIFT + T 在光标行加入To-Do注释。 31 CTRL + SHIFT + Y 删除光标之后至本行末尾之间的文本。 32 CTRL + F3 Call Stack窗口。 33 CTRL + F4 等于File菜单中的Close项。 34 CTRL + 鼠标转轮 加速滚屏。 35 SHIFT + F8 调试时弹出CPU窗口。 36 SHIFT + F10 等于鼠标右键(Windows快捷键)。 37 ALT + F4 关闭所有编辑框中打开的源程序文件,但不关闭项目。(如无打开项目时,则关闭DELPHI^_^ )
Vaccae
2019/07/24
8830
ado.net的简单数据库操作(一)
摘要:接下来的几篇博客将要讲到如何使用ado.net实现简单的数据库操作,包括增删改等内容。首先会介绍基础的数据库操作,然后以一个实例来进行讲解,这个实例会把一个数据表读取到winform上,然后在winform上有一些按钮和文本框,通过这些实现对数据库里的内容的增删改的操作。我个人比较菜,因此记录计较详细,说话也啰嗦,因此可能会写几篇才能介绍完。
CherishTheYouth
2019/09/11
7980
ado.net的简单数据库操作(一)
Delphi使用NativeXml处理XML(四)
4.2.1.ComponentCreateFromXmlFile   unit NativeXmlObjectStorage   function ComponentCreateFromXmlFile(const FileName: string; Owner: TComponent; const Name: string): TComponent;   从文件名称为FileName的XML文件读取并创建组件。为了成功地从头开始创建组件,组件的类必须事先调用RegisterClass进行登记。添加到指定Owner组件的子组件列表。这通常是一个形式。指定Name作为创建的组件的新组件的名称。 注:它调用ComponentCreateFromXmlStream实现。 4.2.2.ComponentCreateFromXmlNode   function ComponentCreateFromXmlNode(ANode: TXmlNode; Owner: TComponent; const Name: string): TComponent;   从TXmlNode类型的ANode节点读取并创建组件。为了成功地从头开始创建组件,组件的类必须事先调用RegisterClass进行登记。添加到指定Owner组件的子组件列表。这通常是一个形式。指定Name作为创建的组件的新组件的名称。 注:它使用TsdXmlObjectReader类实现。 4.2.3.ComponentCreateFromXmlStream   function ComponentCreateFromXmlStream(S: TStream; Owner: TComponent; const Name: string): TComponent;   从XML流类型的S中读取并创建组件。为了成功地从头开始创建组件,组件的类必须事先调用RegisterClass进行登记。添加到指定Owner组件的子组件列表。这通常是一个形式。指定Name作为创建的组件的新组件的名称。 注:它调用ComponentCreateFromXmlNode实现。 4.2.4.ComponentCreateFromXmlString   function ComponentCreateFromXmlString(const Value: string; Owner: TComponent; const Name: string): TComponent;   从XML字符串类型的Value中读取并创建组件。为了成功地从头开始创建组件,组件的类必须事先调用RegisterClass进行登记。添加到指定Owner组件的子组件列表。这通常是一个形式。指定Name作为创建的组件的新组件的名称。 注:它调用ComponentCreateFromXmlStream实现。 4.2.5.ComponentSaveToXmlFile   procedure ComponentSaveToXmlFile(AComponent: TComponent; const FileName: string; AParent: TComponent);   存储组件AComponent所有公布的属性到名为FileName 的XML文件。指定AParent为了储存Parent正确的方法和事件参考。 注:它调用ObjectSaveToXmlFile实现。 4.2.6.ComponentSaveToXmlNode   procedure ComponentSaveToXmlNode(AComponent: TComponent; ANode: TXmlNode; AParent: TComponent);   存储组件AComponent所有公布的属性到TXmlNode格式的ANode中。指定AParent为了储存Parent正确的方法和事件参考。 注:它调用ObjectSaveToXmlNode实现。 4.2.7.ComponentSaveToXmlStream   procedure ComponentSaveToXmlStream(AComponent: TComponent; S: TStream; AParent: TComponent);   存储组件AComponent所有公布的属性到XML格式的流S中。指定AParent为了储存Parent正确的方法和事件参考。 注:它调用ObjectSaveToXmlStream实现。 4.2.8.ComponentSaveToXmlString   function ComponentSaveToXmlString(AComponent: TComponent; AParent: TComponent): string;   存储组件AComponent所有公布的属
Vaccae
2019/07/24
1.9K0
Delphi使用NativeXml处理XML(二)
4.1.类(Classes) 4.1.1.TComponentAccess类   TComponentAccess = class(TComponent) 4.1.1.1.ComponentState   property ComponentState; 4.1.1.2.SetComponentState   procedure SetComponentState(const AState: TComponentState); 4.1.2.TNativeXml类   TNativeXml = class(TPersistent)   TNativeXml是XML文件的载体。创建一个TNativeXml,然后使用方法LoadFromFile、LoadFromStream或ReadFromString加载XML文档到内存中。或者从头开始使用Root.NodeNew添加节点,并最终SaveToFile和SaveToStream保存结果为一个XML文档。用属性Xmlformat = xfReadable确保缩进(易读)输出。 4.1.2.1.AbortParsing   property AbortParsing: boolean;   如果您使用一个SAX-like方式的OnNodeNew和OnNodeLoaded事件,并要中止解析过程,设置AbortParsing为True。例如:
Vaccae
2019/07/25
1.4K0
用ADO操作数据库的方法步骤
学习ADO时总结的一些经验 用ADO操作数据库的方法步骤 ADO接口简介 ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。 _ConnectionPtr接口返回一个记录集或一个空指针。 通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。通常同Cdatabase一样,使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。 _Co
_gongluck
2018/03/08
1.9K0
ADO对SQL Server 2008数据库的基础操作
最近在学习ADO与数据库的相关知识,现在我将自己学到的东西整理写出来,也算是对学习的一种复习。
Masimaro
2018/08/31
8550
使用Delphi编写×××类游戏 – 设
通过以上两篇关于对中心服务器和登录服务器设计的阐述,大家应该对设计它们有了一定的了解。但是中心服务器和登录服务器毕竟是游戏外围的部分,也就是说设计好了它们也还是无法实现编写一款游戏的目的啊。今天我们就来探讨一下如何设计游戏服务器。
py3study
2020/01/06
1K0

相似问题

delphi无效指针操作

35

指针操作无效- Delphi XE

42

delphi 7上的错误无效指针操作

12

Delphi中的指针操作无效-因为IFTHEN?

22

使用自定义组件的Delphi 7无效指针操作

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文