在线程中使用ADO,具体做法是:
1、1个ADOCONNECTION连接1个数据
2、在线程中用几个ADOdataset通过一定条件读写ADOCONNECTION连接的数据表。出现问题:
有的时候不出错。但不知道什么时候出现著名的:access violation at adress xxxx错误。
我看了下,这个时候数据仍然是写进数据表的。但是那个异常确始终抛出,即使你用了try ...except照样报错比如最简单的一段: try
ado:=tadodataset.Create(nil);
ado.Connection :=form1.ADO ;
dxskinlistbox5.Items.Clear ;
ado.CommandText :='select * from adress';
ado.Open ;
if not ado.Eof then
labelnetshow.Caption :='zzzzzz'
else
labelnetshow.Caption :='xxxxxx';
for i:=1 to ado.RecordCount do
begin
dxskinlistbox5.Items.Add(trim(ado.fieldbyname('中文名').AsString));
ado.Next ;
end;
ado.Close ;
freeandnil(ado);
except
ado.Close ;
freeandnil(ado);
end;执行以上语句的时候,在不出错之前毫无问题,但是一旦出错那个错误,那么执行以上语句就是一直报:
access violation at adress xxxx但是执行以上语句结果是对的,该显示还显示,该写数据库的还是写数据库,结果没有任何问题。查了一些网友说的:
1、时间长了,adoconnection可能断开了。(我认为,如果断开那么数据就无法操作,现在我不是这种情况,结果正常,所以排除)
2、1个adoconnection最好只连接1个adodataset。(我认为,ADO可以多线程的)现在感觉好像是加了vmprotect壳引起的问题,但不能确定。以上救助大家。
1、1个ADOCONNECTION连接1个数据
2、在线程中用几个ADOdataset通过一定条件读写ADOCONNECTION连接的数据表。出现问题:
有的时候不出错。但不知道什么时候出现著名的:access violation at adress xxxx错误。
我看了下,这个时候数据仍然是写进数据表的。但是那个异常确始终抛出,即使你用了try ...except照样报错比如最简单的一段: try
ado:=tadodataset.Create(nil);
ado.Connection :=form1.ADO ;
dxskinlistbox5.Items.Clear ;
ado.CommandText :='select * from adress';
ado.Open ;
if not ado.Eof then
labelnetshow.Caption :='zzzzzz'
else
labelnetshow.Caption :='xxxxxx';
for i:=1 to ado.RecordCount do
begin
dxskinlistbox5.Items.Add(trim(ado.fieldbyname('中文名').AsString));
ado.Next ;
end;
ado.Close ;
freeandnil(ado);
except
ado.Close ;
freeandnil(ado);
end;执行以上语句的时候,在不出错之前毫无问题,但是一旦出错那个错误,那么执行以上语句就是一直报:
access violation at adress xxxx但是执行以上语句结果是对的,该显示还显示,该写数据库的还是写数据库,结果没有任何问题。查了一些网友说的:
1、时间长了,adoconnection可能断开了。(我认为,如果断开那么数据就无法操作,现在我不是这种情况,结果正常,所以排除)
2、1个adoconnection最好只连接1个adodataset。(我认为,ADO可以多线程的)现在感觉好像是加了vmprotect壳引起的问题,但不能确定。以上救助大家。
解决方案 »
- *******请问如何判断字符串的有效性***********
- 我想新建一个有固定名称和属性的拔号网络连接,所以没办法用RasCreatePhonebookEntry这个API函数,请教有什么办法吗?
- 一个简单问题
- 求救:怎么获得CPU序列号???不止是Intel的
- Delphi调用外部exe文件遇到的问题!请帮忙!
- tmd 又被耍了,郁闷
- 问一个很菜的问题?
- 关于画图的一个问题,请教各位......
- oracle的存储过程如何返回结果集
- WaveInPrepareHeader函数什么情况下报MMSYSERR_NOMEM错误,
- oracle adoquery 错误,看了一晚不知错在哪.
- delphi7中用ado连接数据库的具体步骤是啥呢?就是第一步,第二部什么的。。。?谢谢啦
不这样做,在线程如何访问数据库?
然后创建线程的时候就把form中的控件传递进去,赋值给线程中的变量,线程内就直接使用此变量
而不是去访问form中的控件
现在的问题应该在ADO方面。
比如
for i:=0 to 100000 do
S := Form1.Edit1.Text;
只要运行期间Form1和Edit1都健在,而且没有任何地方改变Edit1.Text(包括用户在Edit1上修改了值都算修改),那这段代码无论开多少线程同时跑都是没问题的,而我们通常无法保证这一点,所以线程中使用才显得格外谨慎。
这是界面上的东西,而对其他对象如StringList,在线程中,读访问完全没问题,而写访问,就要同步了。更正一下,这和传不传对象到线程中,完全没关系,哪里来的理论哦。而写入,决大多数情况是不可靠的。
就你的代码来说,这几句是不可靠的
dxskinlistbox5.Items.Clear
labelnetshow.Caption :='zzzzzz'
labelnetshow.Caption :='xxxxxx';
dxskinlistbox5.Items.Add(trim(ado.fieldbyname('中文名').AsString));
ADO多线程的设计,一般考虑为一个线程,一个ADO连接,同时数据库访问组件,也是一个线程一个。
就象对StringList对象的多线程访问,只要线程运行期间,没有修改过其内容,包括Add,Delete,LoadFrom...等等操作,那么读访问可以不需要同步,读访问包括读访问以下属性Count,Strings[n],Text等等,如果条件不成立,也就是说,部分线程在读,部分在写,那就得都同步了。