我发现了一个很奇怪的问题,可以在线讨论一下。 (0分)

J

jcjy

Unregistered / Unconfirmed
GUEST, unregistred user!
我用odbc 连接了一个加密的access的数据库。
然后用adoconnection控件连接了这个数据源。
但在使用 adoquery 控件,sql语句中有delete ,insert 等需要用ExecSQL 方法执行的
就出错,弹出消息对话框。主要提示如下:
Access violation at address 1F487CAB in module 'msado15.dll'.Write of address
0A9CF000.
部分源码如下:
adoquery2.close;
adoquery2.sql.Clear ;
adoquery2.sql.Add('insert into 小学学生成绩表(学籍号,姓名,年级,班级) ');
adoquery2.sql.Add('select 学籍号,姓名,年级,班级 from 学籍基本信息表');
adoquery2.sql.Add('where 学籍号 not in (select 学籍号 from 小学学生成绩表)' );
//showmessage(adoquery2.SQL.GetText );
adoquery2.ExecSQL ;

我原来做同时以前调试通过的程序,现在也运行不了。还是提示这个错误。
是什么原因呢?

但,我在delphi中新建一个工程,用同样的控件和方法,却可以实现。
现在在程序中用adocommand控件也可实现。这是什么原因呢?
 
既然用ado,为什么还用odbc?

是不是delphi没有打补丁?

如果数据库是加密的,生成connectionString的时候要加入数据库密码的,你加了没有?
 
因为这个程序是改的。所能只好将就用odbc了。
delphi没有打补丁,重要吗?
数据库是加密的,密码在odbc中就配置了。
现在发现,用adocommand控件可以实现。但,adoquery为何不行呢?
 
至于ADOQUERY不能用。。而ADOCOMMAND能用的现象我也遇到过。。
那是用ADO+ODBC连接ORACLE的时候,当时没有细看,好象跟选择数据库驱动版本有关。
至于用到微软数据库,我的建议是把中间的ODBC尽可能拿掉。
用ADO直接连接数据库多半不会有这问题。
 
另外,至于ADQUERY同ADOCommand关系看看源码很清楚。。
-------------------------------------------
function TADOQuery.ExecSQL: Integer;
begin
InitializeMasterFields(Self);
Command.Execute(FRowsAffected, EmptyParam);//这儿调用ADOCommand
Result := FRowsAffected;
end;
---------------------------------------
你可以在程序里面跟踪到这儿,或者更深一层,
跟踪进InitializeMasterFields 那一句,看能不能找出些线索。

 
to 哈欠
你好,好久没见了,你说的没错,实际上就是用的adocommand.execute来实现的。
我现在还没有跟踪,断点调试,出现寄存器寻址上的错误。
 
是不是要用ado.commandtext='你的查询语句'
 
to icelily7631
可以实现,但adoquery还是不行。
 
顶部