小妹的毕业设计眼看就要交了,可是一个问题始终解决不了。问了好几个师兄都没没辙。情急之下,只好来这里求教高人。问题简述如下:delphi和oracle之间采用BDE连接。对于oracle下的表ziliao进行删除操作。控件是
datasoure,table,一个edit1,用于输入想删除的记录的名字,一个button按钮。
单击button,加入代码procedure TForm1.Button1Click(Sender: TObject);
begin
with table1 do
begin
indexfieldnames:='article_name';
if findkey([edit1.text])then
begin
if messagedlg('你确定要删除这条记录么',mtconfirmation,[mbyes,mbno],0)=mryes then delete;
end
else
messagedlg('没有找到该纪录',mterror,[mbcancel],0);
end;
end;程序运行后,在edit1中输入想删除的文章的名字,点击按钮弹出“你确定要删除这条记录么”的box,至此都正确,可是当点击确定按钮后,即报错:prject delproject1.exe raised exception class EAccessViolation with message'Access violation at address 4DAO64AD in module 'IDODBC32.DLL'.Read of address 00000014'.若后台数据库不用oracle,譬如以delphi自带的DBDEMOS,同样的程序,运行起来就没有问题。初步怀疑是BDE的问题,要不就是我的电脑太烂了?求教,求教,再解决不了,真要郁闷死了!
datasoure,table,一个edit1,用于输入想删除的记录的名字,一个button按钮。
单击button,加入代码procedure TForm1.Button1Click(Sender: TObject);
begin
with table1 do
begin
indexfieldnames:='article_name';
if findkey([edit1.text])then
begin
if messagedlg('你确定要删除这条记录么',mtconfirmation,[mbyes,mbno],0)=mryes then delete;
end
else
messagedlg('没有找到该纪录',mterror,[mbcancel],0);
end;
end;程序运行后,在edit1中输入想删除的文章的名字,点击按钮弹出“你确定要删除这条记录么”的box,至此都正确,可是当点击确定按钮后,即报错:prject delproject1.exe raised exception class EAccessViolation with message'Access violation at address 4DAO64AD in module 'IDODBC32.DLL'.Read of address 00000014'.若后台数据库不用oracle,譬如以delphi自带的DBDEMOS,同样的程序,运行起来就没有问题。初步怀疑是BDE的问题,要不就是我的电脑太烂了?求教,求教,再解决不了,真要郁闷死了!
解决方案 »
- 怎样实现软件安装功能
- DBGrid设置
- [DBNETLIB][ConnectionOpen(connect()).]SQL Server不存在或访问被拒绝
- DELPHI中删除临时表?
- 如何取得目录下的所有文件夹名称
- 为什么 我自己发表的帖子不能删除
- 如何解决Data Field not permitted to open Dataset!
- 时间查找的问题。
- 想在大连找一份工作,大家给点建议。。。来者有分!
- 在DELPHI程序中怎样联接SQLSERVER7的数据库(在未登录到NT域的机子上)?
- 请指教,当SocketConnection的Connected设为True时,为何出错?
- 高分求救:我想动态加载BPL包,并想使用其中的类的方法和属性。
换种定位方式试试:
with table1 do
begin
if locate('article_name',trim(edit1.text),[locaseinsensitive])then
begin
if messagedlg('你确定要删除这条记录么',mtconfirmation,[mbyes,mbno],0)=mryes then delete;
end
else
messagedlg('没有找到该纪录',mterror,[mbcancel],0);
end;
在oracle中;
create or replace procedure delete_record(,tablename in varchar2,fieldname in varchar2)
as
v_sql :varchar2;
begin
v_sql:='delete from '||tablename||' where 'article_name= '|| fieldname;
execute immediate v_sql;
commit;
end delete_record;
/
在delphi中用adostoredproc 调用!
你说的那些语句是在sql&plus里输入还是…………
var
exists: Boolean;
begin
query1.sql.text := 'select article_name from '+table1.tablename+' where article_name=:article_name';
query1.parambyname('article_name').asstring := edit1.text;
query1.open;
exits := not query1.eof;
query1.close;
if exists then
begin
if messagedlg('你确定要删除这条记录么',mtconfirmation,[mbyes,mbno],0)=mryes then
begin
query1.sql.text := 'delete from '+table1.tablename+' where article_name=:article_name';
query1.parambyname('article_name').asstring := edit1.text;
query1.execsql;
table1.refresh;
end;
end
else
messagedlg('没有找到该纪录',mterror,[mbcancel],0);end;另外,好象你是用ODBC连接的,其实用BDE可以直接连接,没有必要通过ODBC的。祝:好运!
可是findkey和locate只能定位一条记录。我现在想把程序改进一下,用TQuery+SQL,看了这个帖子《BDE+ORACLE,TQuery的RequestLive不能设为True?》(http://expert.csdn.net/Expert/topic/1815/1815503.xml?temp=.6293909),我发现,想让其完成查找后再修改的功能几乎实现不了,语句如下:procedure TForm1.button1Click(Sender: TObject);
begin
strsql:='select * from ZILIAO where author like '''+'%'+trim(edit1.Text)+'%'+'''';
query1.Close;
query1.sql.Clear;
query1.SQL.Add(strsql);
try
query1.Open;
except
query1.ExecSQL;
end;
end;是不是这样写无论如何也无法对返回的数据进行操作?
如果我想对返回的查找条目进行操作,怎样才可以呢?
把它当成D了,
try
query1.open;//此时不管是否返回结果,query1都已经执行了。就是说如果是update语句,
//也已经执行完了
except
end;
另外我认为requestalive设置true后应该可以修改结果集,如果不行可以改用两个query实现,一个query查询一个进行update
except
query1.execsql
语句就是必须的了。但是按照你说的,我删掉了该语句。即便没有查到相对的记录,程序依旧可以运行。那么execsql语句到底有什么用呢?我希望修改Query部件返回的只读的查询结果集。在一本书上看到一个方法:"在应用程序中另外增加一个Query部件Query2;在Query2中设置修改语句upDATe对query1中的数据进行操作".和你说的一样。我还没有用过两个query,挺抽象的,理解不了。能给个小demo么?谢谢了
query1.open所要干的事情是:首先执行查询语句(类似query1.execsql),然后获取结果集(类似fetch recordset),所以你except里面不需要在写一遍query1.execsql。
那个demo的问题:
query1.sql.text:='select key from table1 where case1';其中key是你的primary key的fieldname,case是你的定位条件。
query1.open;
query2.sql.text:='update table1 set ..... where key='+query1.fields[0].asstring;
query2.execsql;
这样就可以了;
或者用clone可能也可以,不过建议你还是用上面的办法,另外需要注意的是,在query2的更新操作过程中不能改变primary key的值。