导航:首页 > 编程大全 > delphi线程连接数据库

delphi线程连接数据库

发布时间:2025-07-18 05:21:00

① 请教delphi使用ADO连接数据库失败原因

这个问题可以考虑两方面的情况:
第一,你的sql2000没有打sp3或以上的补丁;
第二,你的sql没有设置账号登陆,可以在(local)(windows
nt)上右键-属性-安全性-选上(sql
server和windows)-确定
问题应该就可以解决了……

② delphi连接mysql出现MySql server has gone away怎么解决

MySQL server has gone away 问题的解决方法

mysql出现ERROR : (2006, 'MySQL server has gone away') 的问题意思就是指client和MySQL server之间的链接断开了。

造成这样的原因一般是sql操作的时间过长,或者是传送的数据太大(例如使用insert ... values的语句过长, 这种情况可以通过修改max_allowed_packed的配置参数来避免,也可以在程序中将数据分批插入)。

产生这个问题的原因有很多,总结下网上的分析:

原因一. MySQL 服务宕了

判断是否属于这个原因的方法很简单,进入mysql控制台,查看mysql的运行时长

mysql> show global status like 'uptime';
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| Uptime | 3414707 |
+---------------+---------+

1 row in set或者查看MySQL的报错日志,看看有没有重启的信息

如果uptime数值很大,表明mysql服务运行了很久了。说明最近服务没有重启过。
如果日志没有相关信息,也表名mysql服务最近没有重启过,可以继续检查下面几项内容。

原因二. mysql连接超时

即某个mysql长连接很久没有新的请求发起,达到了server端的timeout,被server强行关闭。
此后再通过这个connection发起查询的时候,就会报错server has gone away
(大部分PHP脚本就是属于此类)

mysql> show global variables like '%timeout';
+----------------------------+----------+
| Variable_name | Value |
+----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+----------------------------+----------+
10 rows in set

wait_timeout 是28800秒,即mysql链接在无操作28800秒后被自动关闭

原因三. mysql请求链接进程被主动kill

这种情况和原因二相似,只是一个是人为一个是MYSQL自己的动作

mysql> show global status like 'com_kill';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_kill | 21 |
+---------------+-------+
1 row in set原因四. Your SQL statement was too large.

当查询的结果集超过 max_allowed_packet 也会出现这样的报错。定位方法是打出相关报错的语句。

用select * into outfile 的方式导出到文件,查看文件大小是否超过 max_allowed_packet ,如果超过则需要调整参数,或者优化语句。

mysql> show global variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
1 row in set (0.00 sec)

修改参数:

mysql> set global max_allowed_packet=1024*1024*16;
mysql> show global variables like 'max_allowed_packet';
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.00 sec)

以下是补充:

应用程序长时间的执行批量的MYSQL语句。执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理。都容易引起MySQL server has gone away。

今天遇到类似的情景,MySQL只是冷冷的说:MySQL server has gone away。

大概浏览了一下,主要可能是因为以下几种原因:
一种可能是发送的SQL语句太长,以致超过了max_allowed_packet的大小,如果是这种原因,你只要修改my.cnf,加大max_allowed_packet的值即可。

还有一种可能是因为某些原因导致超时,比如说程序中获取数据库连接时采用了Singleton的做法,虽然多次连接数据库,但其实使用的都是同一个连接,而且程序中某两次操作数据库的间隔时间超过了wait_timeout(SHOW STATUS能看到此设置),那么就可能出现问题。最简单的处理方式就是把wait_timeout改大,当然你也可以在程序里时不时顺手mysql_ping()一下,这样MySQL就知道它不是一个人在战斗。

解决MySQL server has gone away

1、应用程序长时间的执行批量的MYSQL语句。最常见的就是采集或者新旧数据转化。或者长时间闲置数据库连接(我的项目就是这样)
解决方案:
在my.cnf文件中添加或者修改以下两个变量:

1 wait_timeout=2880000 2 interactive_timeout = 2880000

关于两个变量的具体说明可以google或者看官方手册。如果不能修改my.cnf,则可以在连接数据库的时候设置CLIENT_INTERACTIVE,比如:

1 sql = "set interactive_timeout=24*3600";
2 mysql_real_query(...)

2、执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理
解决方案:
在my.cnf文件中添加或者修改以下变量:

1 max_allowed_packet = 10M(也可以设置自己需要的大小)

max_allowed_packet 参数的作用是,用来控制其通信缓冲区的最大长度。


最近在做一个项目,需要程序24小时开着,而中间会有很多闲置时间,于是每天早上过来第一次操作数据库时,就出现了“MySQL server has gone away”这样的错误提示,而这个问题的原因是由于数据库连接由于长时间没有操作而会被自动关闭。解决这个问题,我的经验有以下两点,或许对大家有用处:
第 一种方法:
当然是增加你的 wait-timeout值,这个参数是在my.cnf(在Windows下台下面是my.ini)中设置,我的数据库负荷稍微大一点,所以,我设置的值 为10,(这个值的单位是秒,意思是当一个数据库连接在10秒钟内没有任何操作的话,就会强行关闭,我使用的不是永久链接 (mysql_pconnect),用的是mysql_connect,关于这个wait-timeout的效果你可以在MySQL的进程列表中看到 (show processlist) ),你可以把这个wait-timeout设置成更大,比如300秒,呵呵,一般来讲300秒足够用了,其实你也可以不用设置,MySQL默认是8个小 时。情况由你的服务器和站点来定。
第二种方法:
这也是我个人认为最好的方法,即检查 MySQL的链接状态,使其重新链接。 (用mysql_ping())
可能大家都知道有mysql_ping这么一个函数,在很多资料中都说这个mysql_ping的 API会检查数据库是否链接,如果是断开的话会尝试重新连接,但在我的测试过程中发现事实并不是这样子的,是有条件的,必须要通过 mysql_options这个C API传递相关参数,让MYSQL有断开自动链接的选项(MySQL默认为不自动连接),但我测试中发现PHP的MySQL的API中并不带这个函数,你重新编辑MySQL吧,呵呵。但mysql_ping这个函数还是终于能用得上的,只是要在其中有一个小小的操作技巧:

附录:

mysqli_options()

定义和语法

mysqli_options() 函数设置额外的连接选项,用于影响连接行为。

mysqli_options() 函数可以被调用若干次来设置若干个选项。

注释:mysqli_options() 函数可以在mysqli_init()之后和mysqli_real_connect()之前被调用。

语法:

1 mysqli_options(connection,option,value);

connection:必需。规定要使用的 MySQL 连接。

option:必需。规定要设置的选项。可以是下列值中的一个:

③ Delphi的kbmMemTable控件与AdoQuery有什么区别

关于内存表的使用(kbmMemTable)

关于内存表的使用说明 一、 Delphi使用内存表 1.1Delphi创建内存表步骤: 1. 创建一个Ttable实例。 2. 设置一个DataBaseName为一个目录或是已有的数据库别名。 3. 指定TableName的值。 4.设置TableType属性指明要创建的数据库表类型。(如果此属性为ttDefault表示数据库类型与TableName指定值的扩展名对应)。 5. 调用TTable.FidldDefs对象的Add方法向数据库表中添加字段。Add有4个参数: 字段名:string。 字段类型:TfieldType。 字段大小:Word。一般只对String和Memo类型使用。 字段是否NotNull: Boolean。 6. 使用TTable.IndexDefs.Add()方法定义索引。Add有三个参数: 索引名:string; 索引字段名:string; 索引类型:TIndexOptions; 7. 调用TTable的CreateTable。这种方法适用于本地表。SQL表要用TQuery来创建。 代码如下: var MemTable: TTable; begin with MemTable.Create(Self) do begin DatabaseName := 'c:Temp'; TableName := 'Test'; TableType := ttParadox; with FieldDefs do begin Add('Age', ftInteger, 0, True); Add('Name', ftString, 25, False); Add('Weight', ftFloat, 0, False); end; IndexDefs.Add('', 'Age', [ixPrimary, ixUnique]); CreateTable; end; end; 二、 kbmMemTable使用简述 2.1 kbmMemTable创建步骤: 1. 创建一个kbmMemTable对象实例。 2. 调用kbmMemTable.FidldDefs对象的Add方法向数据库表中添加字段。Add的方法和Delphi相同。 3. 使用kbmMemTable.IndexDefs.Add()方法定义索引。Add的方法和Delphi相同。 4. 调用kbmMemTable的CreateTable。 重要的区别:因为kbmMemTable不需要BDE的支持。所以不要指明DatabaseName, TableName和TableType三个属性。 代码如下: with kbmMemTable1 do begin with kbmMemTable1.FieldDefs do begin Clear; Add('Period', ftInteger, 0, false); Add('VALUE', ftLargeInt, 0, false); Add('BytesField', ftBytes, 20, false); Add('Color', ftInteger, 0, false); Add('Date', ftDate, 0, false); Add('Memo', ftMemo, 0, false); Add('AutoInc', ftAutoInc, 0, false); end; with kbmMemTable1.IndexDefs do begin Clear; Add('Index1', 'VALUE', []); end; CreateTable; end; 三、与Delphi创建内存表的对比 3.1主从表功能 kbmMemTable可以象其它TDataSet一样,通过设置MasterSource和MasterField来简单的完成主从表的操作。 3.2 SQL功能 没有发现kbmMemTable可以支持SQL语句的操作。它提供按字段排序和对排序字段的查找功能。 三、 kbmMemTable特点 从其它TDataSet得到数据。 代码如下: LoadFromDataSet(Table1, [mtcpoStructure, mtcpoProperties]); 这样kbmMemTable就完全得到来自一个DataSet对象中的全部数据. 保存和载入内存表中数据的功能 Delphi的TTable不提供SaveToFile功能。 kbmMemTable提供保存到文件的功能,保存的文件有两种格式: Options: TkbmMemTable.SaveFlags; 1. 二进制格式。kbmMemTable.SaveToBinaryFile('c: est.bin', Options). kbmMemTable1.LoadFromBinaryFile('c: est.bin') 2. .csv格式。kbmMemTable.SaveToFile('c: est.csv', Options); kbmMemTable1.LoadFromFile('c: est.csv') (一种Excel支持的文档格式)打开后的内容如下: @@FILE VERSION@@ 200 @@TABLEDEF START@@ Period=Integer,0,"Period","",10 VALUE=LargeInt,0,"VALUE","",15 BytesField=Bytes,20,"BytesField","",10 Color=Integer,0,"Color","",10 Date=Date,0,"Date","",10 Memo=Memo,0,"Memo","",10 AutoInc=AutoInc,0,"AutoInc","",10 CALC=String,20,"CALC","",20 @@TABLEDEF END@@ Period VALUE BytesField Color Date Memo AutoInc CALC 1 198 0 02/11/2001 This is a memo%n2001-11-2 10:19:52 1 0 1-二月 2 196 3 03/11/2001 This is a memo%n2001-11-2 10:19:52 2 1 2-三月 在文档的头部份描述了表的字段结构,在下面则是数据区域. 以下代码用ClientDataSet建立内存表,包含Field1和Field2两个字段,在Field1上建索引: with ClientDataSet1 do begin //添加Integer类型的字段Field1 with FieldDefs.AddFieldDef do begin DataType := ftInteger; Name := 'Field1'; end; //添加string类型的字段Field2 with FieldDefs.AddFieldDef do begin DataType := ftString; Size := 10; Name := 'Field2'; end; //在Field1上建索引 with IndexDefs.AddIndexDef do begin Fields := 'Field1'; Name := 'IntIndex'; end; //创建内存表 CreateDataSet; end

》》》》》》》》》》》》》》》》》

KbmMemTable是一款高效且强大的内存表控件,内存表顾名思义其最大的优势就是速度,KbmMemTable不仅完美地实现了高效的特征,同时,最新版本还支持索引、SQL语句等高级用法。其用法超简单,基本用法和ClientDataSet一致,以下是我简单的应用示例,实现了增删改查等基本功能:

Delphi<wbr>:<wbr>kbmMemTable关于内存表的使用

unit Unit1

interface

use

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, DBGrids, DB, StdCtrls, kbmMemTable

type

TForm1 = class(TForm)

Button1: TButto

DataSource1: TDataSource

DBGrid1: TDBGrid

Button2: TButto

Button3: TButto

Button4: TButto

Button5: TButto

Button6: TButto

Button7: TButto

rocere Button1Click(Sender: TObject)

rocere FormCreate(Sender: TObject)

rocere Button2Click(Sender: TObject)

rocere Button4Click(Sender: TObject)

rocere Button3Click(Sender: TObject)

rocere Button5Click(Sender: TObject)

rocere Button6Click(Sender: TObject)

rocere Button7Click(Sender: TObject)

rivate

{ Private declarations }

ublic

{ Public declarations }

end

var

Form1: TForm1

kbmMemTable1 : TkbmMemTable

Id:Integer

implementatio

{$R *.dfm}

rocere TForm1.Button1Click(Sender: TObject)

egi

//建表

kbmMemTable1.FieldDefs.Clear

kbmMemTable1.FieldDefs.Add('Id', ftInteger, 0, False)

kbmMemTable1.FieldDefs.Add('Value', FtString, 20, False)

kbmMemTable1.FieldDefs.Add('Time', ftDateTime, 0, False)

kbmMemTable1.IndexDefs.Add('Index1','Id',[]);//定义索引

kbmMemTable1.CreateTable

kbmMemTable1.Active := True

end

rocere TForm1.Button2Click(Sender: TObject)

var

fld_Id:TIntegerField

fld_Value:TStringField

fld_Time:TDateTimeField

i:Integer

egi

//插入

with kbmMemTable1 do

egi

DisableControls; //切断数据感知控件

try

Open; //打开

//定义Field

fld_Id:=TIntegerField(FieldByName('Id'))

fld_Value:=TStringField(FieldByName('Value'))

fld_Time:=TDateTimeField(FieldByName('Time'))

for i := 0 to 9 do

egi

Inc(Id)

Append; //附加数据

//赋值

fld_Id.AsInteger := Id

fld_Value.AsString := 'Hello PFeng!'+inttostr(Id)

fld_Time.AsDateTime := Now

Post; //确定

end

UpdateIndexes;//更新索引

finally

EnableControls; //连接数据感知控件

end

end

end

rocere TForm1.Button3Click(Sender: TObject)

var

fld_Id:TIntegerField

fld_Value:TStringField

fld_Time:TDateTimeField

egi

//更新

with kbmMemTable1 do

egi

Ope

fld_Id:=TIntegerField(FieldByName('Id'))

fld_Value:=TStringField(FieldByName('Value'))

fld_Time:=TDateTimeField(FieldByName('Time'))

if Locate('Id',5,[]) the

egi

Edit

fld_Value.AsString := '内容被修改'

fld_Time.AsDateTime := Now

Post

end

end

end

rocere TForm1.Button4Click(Sender: TObject)

var

fld_Id:TIntegerField

fld_Value:TStringField

fld_Time:TDateTimeField

egi

//查询

with kbmMemTable1 do

egi

Ope

fld_Id:=TIntegerField(FieldByName('Id'))

fld_Value:=TStringField(FieldByName('Value'))

fld_Time:=TDateTimeField(FieldByName('Time'))

if Locate('Id',5,[]) the

ShowMessage(fld_Value.AsString)

//还可以用FindKey实现,结合索引速度更快

// kbmMemTable1.IndexFieldNames:='Id'

// if kbmMemtable1.FindKey([5]) then ...

end

end

rocere TForm1.Button5Click(Sender: TObject)

var

fld_Id:TIntegerField

fld_Value:TStringField

fld_Time:TDateTimeField

egi

//删除

with kbmMemTable1 do

egi

Ope

fld_Id:=TIntegerField(FieldByName('Id'))

fld_Value:=TStringField(FieldByName('Value'))

fld_Time:=TDateTimeField(FieldByName('Time'))

if Locate('Id',5,[]) the

egi

Delete

UpdateIndexe

end

end

end

rocere TForm1.Button6Click(Sender: TObject)

var

fld_Id:TIntegerField

fld_Value:TStringField

fld_Time:TDateTimeField

id:Integer

egi

//循环比较最小值

with kbmMemTable1 do

egi

Ope

fld_Id:=TIntegerField(FieldByName('Id'))

fld_Value:=TStringField(FieldByName('Value'))

fld_Time:=TDateTimeField(FieldByName('Time'))

DisableControl

try

First

id := fld_Id.AsInteger

while not Eof do

egi

if id > fld_Id.AsInteger the

id := fld_Id.AsInteger

Next

end

Locate('Id',id,[])

finally

EnableControl

end

end

end

rocere TForm1.Button7Click(Sender: TObject)

egi

//清空

kbmMemTable1.EmptyTable

end

rocere TForm1.FormCreate(Sender: TObject)

egi

kbmMemTable1 := TkbmMemTable.Create(Self)

DataSource1.DataSet := kbmMemTable1

end

end.

http://www.pfeng.org/archives/372

》》》》》》》》》》》》》》》》》》》》》》》》》》

前端时间一直在研究三层通讯框架,计划封装一套稳定性较好的远程数据库服务接口,前期的方案主要有以下几种: 1,改造自己写的indy+压缩xml流三层应用项目 2,基于MMZ asio远程数据库项目进一步完善 3,寻找并测其他相对成熟的三层通讯框架,知道的有:QuickBurro、RemoteAdo、Middle ADO System、dbIOCP、DataSnap、ASTA、Remobject SDK、kbmMW,接下来我将就我对以上三层框架的浅薄认识一一说明。 首先说方案1,在早些时候为了实现远程数据库与本地数据库的同步,我写过一套基于indy+压缩xml流的C/S应用,客户端的请求封装在xml中,发送到服务端,服务端在数据库中执行后,把执行结果(例如结果集)拼装成xml再压缩成流,返回到客户端,虽然当时基本上满足了需求,但项目有着很大的局限:并发性差、效率低、通讯不稳定等,一旦网络条件稍差,服务端就会报异常,想想那段维护服务端软件的日子简直就是噩梦,如果本次项目仍然采用这种思路,我需要去改进很多地方,比如数据库连接池、多线程、数据校验、底层通讯等,在有限的时间里很难去把多个方面都做稳定,权衡后,觉得自己应该站在巨人的肩膀上来实现自己的业务逻辑,于是放弃了这个方案。 方案2,ASIO(http://think-async.com/)是C++的一个强大的通讯库,据说是工业级别的,我的一个Delphi技术群(群号:15637473)的群主把ASIO编译成了一个DLL动态库,然后又结合unidac、连接池等,封装了一个简单的三层通讯框架MMZ ASIO(http://mmz-asio4delphi.googlecode.com),我在早些时候用这个框架做了几个小项目,感觉比较简单,效率也很高,但是有几个bug迟迟得不到解决(客户端不能主动断开、服务端容易报线程异常等),给群主写邮件,群主说他现在很忙,没时间解决这些问题,而以我个人的水平,又很难去从核心代码上做改动。目前有几个忠实的asio爱好者还在深入研究(群号:91684553),相信有朝一日会稳定起来,考虑到时间成本,同样放弃了这个方案。

最后,最佳的选择就是选择一款成熟的三层框架,在此基础上做二次开发,于是从网上搜了好几天时间,了解各个框架的情况,首先基于成本和稳定性的考虑放弃了国产框架: 1,QuickBurro(http://www.quickburro.com/),樵夫的作品,到目前还一直在做升级,具体价格参见2,http://www.quickburro.com/orders.html,授权方式比较宽松,免费版的用户数有限制(好像是16个?不确定)。 3,RemoteAdo(http://www.remoteado.cn/index.html),了解的不多,但是就从网站上来介绍来看,功能比较局限,当然,也是收费的。 4,Middle ADO System(http://www.middle-ado.com/),厦门一家公司的产品,同样了解的不多,价格不详,功能也比较局限。 5,dbIOCP(群号:35916846),楠楠的作品,据说效率很高(IOCP不多说,网上一搜便知道),价格好像是3000/套,带源码,升级不是很频繁,网上的免费1.6版连楠楠自己都说已经很久了,我看群里很多讨论2.4版本的,楠楠同样自己说性能没法和3.x版本的比,新版的架构都变了,效率说的很神,但是个人作品,在没有很好地推广的情况下,3000刀个人感觉有点儿贵。

再来说其他的几个著名框架: 1,DataSnap,这个其实很多人都比较熟悉,它是Delphi的三层框架MIDAS的延续,李维在多次讲座和个人书籍中都强烈推荐,而且国外社区很多人都提到它,估计能力不俗,但是网上褒贬不一,个人深入了解的不够。 2,ASTA(http://www.astatech.com/procts/asta3/),也是一个老牌的三层框架,据说在200x年的时候很火,但是开发者后续升级不给力,单从网站首页上的新闻就让人很惊讶:ASTA 3.1 is here and it’s HOT with support for Delphi 2006…当然,如果你还在用D2007以下版本做开发的话,可以试试,但是我个人觉得缺乏后续的SAU(Service and Update),心理上总是不踏实。价格不详,但是网上Full Source版本的一搜一大把。 3,Remobject SDK(http://www.remobjects.com/default.aspx),其实我对这个框架的印象很好,因为之前计数群里已经基于它做了很多成熟的项目,而且在讨论过程中口碑也相当不错,而且现在for XE2的版本网上也很好找到,建议有兴趣的人可以深入研究以下。 4,KbmMW(http://www.components4programmers.com/procts/kbmmw/index.htm),说到本文的重点了,KbmMW在国内圈子里能够得到认可,很大程度上得益于窑主xalion详细的博文教程(http://www.cnblogs.com/xalion/),作者Kim Madsen对中国国情的充分考虑(对中国程序员价格上优惠25%),KbmMW在国外社区很火,国内可能很多人对kbmMemTable都不陌生,而KbmMW也是基于kbmMemTable做的封装。我对KbmMW最大的认可就是其开放的架构思路:通讯控件支持Indy(9和10)、Synapse、DxSock,数据库控件支持ADO和Unidac等、当然还有其他的加密、压缩等均支持开源的第三方控件,给开发人员了很大自由度。作者的热心也让我很感动,每次遇到问题,白天我在StackOverFlow上提问,夜里Kim就在上面认真回答。 当然还有很多其他的优秀框架(据说Dephi的三次框架解决方案是所有开发语言中最多的),比如德国的RTC(http://www.realthinclient.com/)据说也是很不错的,有兴趣的可以自己去了解下,当我了解了KbmMW之后,我觉得,KbmMW是我最好的选择。

接下来的博文中,我不再累述教程(没法超越窑主xalion的高度),更侧重资源的分享,容易犯错的地方提醒、原有Bug的勘误,自己开发经验的总结,希望能够有兴趣或有需求的人提供一些帮助。

阅读全文

与delphi线程连接数据库相关的资料

热点内容
甘肃网站优化推广多少钱 浏览:578
js实现图片随机摆放 浏览:213
智能开发用什么编程语言 浏览:850
魅蓝metal拨号盘代码 浏览:998
国外看动漫的app 浏览:334
网络下载电视 浏览:9
sq02代码 浏览:988
编程怎么打出上单引号 浏览:581
义乌码猿编程在哪里 浏览:14
如何取消电脑桌面上的文件 浏览:237
电脑qa接收的文件在哪里 浏览:60
centosmysql压缩文件直接恢复 浏览:393
华为网络故障8180什么意思 浏览:902
用友u8备份文件 浏览:18
文件夹转成excel 浏览:171
qq空间手机版本2017版 浏览:801
微信登录检查网络连接失败 浏览:156
微信嘴馋的表情图片 浏览:818
监控录像如何数据恢复 浏览:240
宁波医院通app官网 浏览:836

友情链接