一个Query问题---急,请高手们帮我see在什么地方出错!!!------在线等候your help!

jkx01whg 2005-05-02 04:59:37
implementation
procedure TForm2.search();//把最终查询结果显示到memeo中
var
sFile:string; //图片存取路径和名称
begin
num:=0;
ZhName:='';
JieName:='';
try
ZhName:=Query2.FieldByName('zh_name').AsString;
JieName:=Query1.FieldByName('j_num').AsString;
//Query1.First;
count:= Query2.fieldbyname('JiLu_num').AsInteger;
Query1.MoveBy(count);

while not Query2.Eof do
if OK='0' then
if Query2.FieldByName('flag').AsString='0' then
begin
DBMemo1.Lines.Add(Query2.FieldByName('document').AsString);

Next;
num:=num+1;
count:=count+1;
continue;
end //end flag 0
else if Query1.fieldbyname('flag').AsString='1' then
begin
OK:='1'; //修改显示暂停标志为1——暂停
sFile:=Query2.fieldbyname('document').AsString;//取要加载的图片的路径和名称
Image1.Picture.LoadFromFile(sFile); //动态加载.bmp图片
showmessage('如右图所示');
num:=num+1;
count:=count+1;
end //end flag 1
else if Query2.fieldbyname('flag').AsString='3' then
begin
OK:='1'; //修改显示暂停标志为1——暂停
PlayDocument.Enabled:=true;
filename:='';
filename:= Query2.fieldbyname('document').AsString;
showmessage('要查看多媒体演示,请单击"多媒体演示"!');
count:=count+1;
num:=num+1;
end //end flag 3
else
showmessage('数据库中的标识符falg出错')
else
break; //break while

except
showmessage('数据库出错!!');
end //end 例外处理
end;

{$R *.dfm}

procedure TForm2.PlayDocumentClick(Sender: TObject);
begin
ShellExecute(handle,'open',PChar(filename),'-s','',SW_SHOWNORMAL); //执行外部可执行文件(*.exe)
OK:='0'; //修改可继续执行标记OK
PlayDocument.Enabled:=false;
end;

procedure TForm2.PriZHClick(Sender: TObject); //上一章
var
zhang,jie:string;
begin
try
table2.Open;
table2.First;
jie:=table2.fieldbyname('j_num').AsString ;
table2.Close;
except
showmessage('访问时Table2出错!');
end;
zhang:=inttostr(strtoint(DBEdit_zhnum.Text)+1);

if strtoint(zhang)>0 then
begin
DBEdit_zhnum.Text:=zhang;
DBEdit_jnum.Text:=jie;
OK:='0';

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select zhang_table.zh_name,jie_table.j_name,docu_table.JiLu_num,docu_table.flag,docu_table.document');
Query1.SQL.Add('from zhang_table,jie_table,docu_table');
Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num and docu_table.j_num=jie_table.j_num');
Query1.SQL.Add('order by docu_table.j_num');
Query1.ExecSQL;
Query2.ExecSQL;

search();
DBEdit_zhangN.Text:=ZhName ;
DBEdit_jieN.Text:=JieName;
end
else showmessage('目前为第一章');
end;

procedure TForm2.PriJieClick(Sender: TObject); //上一节
var
zhang,jie:string;
begin
try
table2.Open;
table2.Prior ;
jie :=table2.fieldbyname('j_num').AsString;
zhang:=table2.fieldbyname('zh_num').AsString;
table2.Close;
except
showmessage('访问时Table2出错!');
end;

DBEdit_zhnum.Text:=zhang;
DBEdit_jnum.Text:=jie;
if zhang=DBEdit_zhnum.Text then
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select zhang_table.zh_name,jie_table.j_name,docu_table.JiLu_num,docu_table.flag,docu_table.document');
Query1.SQL.Add('from zhang_table,jie_table,docu_table');
Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num and docu_table.j_num=jie_table.j_num');
Query1.SQL.Add('order by docu_table.j_num');
Query1.ExecSQL;
Query2.ExecSQL;

OK:='0'; //修改暂停标志

search();
DBEdit_zhangN.Text:=ZhName ;
DBEdit_jieN.Text:=JieName;
end
else showmessage('目前为本章第一节');
end;
//以下还有类似的“下一节”按钮操作

procedure TForm2.studyClick(Sender: TObject); //学习
var
zh_num,j_num:string;
begin
OK:='0';
zh_num:=DBEdit_zhnum.Text;
j_num:=DBEdit_jnum.Text;

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select zhang_table.zh_name,jie_table.j_name,docu_table.JiLu_num,docu_table.flag,docu_table.document');
Query1.SQL.Add('from zhang_table,jie_table,docu_table');
Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num and docu_table.j_num=jie_table.j_num');
Query1.SQL.Add('order by docu_table.j_num');
Query1.ExecSQL;
Query2.ExecSQL;

search();
DBEdit_zhangN.Text:=ZhName ;
DBEdit_jieN.Text:=JieName;
end;

end.
...全文
197 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jkx01whg 2005-05-07
  • 打赏
  • 举报
回复
需要分成几个方法来显示结果吗?
jkx01whg 2005-05-07
  • 打赏
  • 举报
回复
显示查询结果部分还是有些乱....
jkx01whg 2005-05-07
  • 打赏
  • 举报
回复
to all:
目的是对三个表进行查询,并显示查询结果:表中的内容有文本、读取图片的路径和读取动化文件的路径,当读到图片时停一下,提示用户有图片,等用户确定后继续往下显示内容,读到有动化文件时也停一下,提示用户...........
(修改后如下,请各位多提宝贵意见)
unit form3;
interface
uses
.........
type
procedure PlayDocumentClick(Sender: TObject);//播放动化文件
procedure zhqDSSearch();//查询章号和章名
procedure jqDSSearch();//查询节号和节名
procedure DSSearch();//查询上面查到的相应内容
procedure ResultSearchShow();//显示查询结果
.......
implementation
procedure TForm2.zhqDSSearch(); //查找相应的章
begin
try
zhq.Close;
zhq.ParamByName('zhang').Value:=DBEdit1.Text;
zhq.Prepare;
zhq.Open;
except
showmessage('查找章名时出错!');
end;
end;
procedure TForm2.jqDSSearch(); //查找相应的节
begin
try
jq.Close;
jq.ParamByName('zhang').Value:=DBEdit1.Text;
jq.Prepare;
jq.Open;
except
showmessage('查找节名时出错!');
end;
end;

procedure TForm2.DSSearch();
begin
try
Query1.Close;
Query1.ParamByName('zhang').Value:=DBEdit1.Text;

Query1.ParamByName('jie').Value:=DBEdit2.Text;

Query1.Prepare;
Query1.Open;
except

showmessage('查询有误');

end;

end;
procedure TForm2.ResultSearchShow();//把最终查询结果显示到memeo中
var
sFile:string; //图片存取路径和名称
begin
num:=0;

try
while not Query1.Eof do
if OK='0' then
begin
if Query1.FieldByName('flag').AsString='0' then
begin
DBMemo1.Lines.Add(Query1.FieldValues['document']);
//Memo1.Lines.Add(Query1.FieldByName('document').AsString);
Query1.Next;

num:=num+1;
count:=count+1;
continue;
end //end flag 0
else if Query1.FieldByName('flag').AsString='1' then
begin
OK:='1'; //修改显示暂停标志为1——暂停
sFile:=Query1.fieldbyname('document').AsString;//取要加载的图片的路径和名称
Image1.Picture.LoadFromFile(sFile); //动态加载.bmp图片
showmessage('如右图所示');

Query1.Next;
num:=num+1;
count:=count+1;
end //end flag 1
else if Query1.fieldbyname('flag').AsString='3' then
begin
OK:='1'; //修改显示暂停标志为1——暂停
PlayDocument.Enabled:=true;
filename:='';
filename:= Query1.fieldbyname('document').AsString;
showmessage('要查看多媒体演示,请单击"多媒体演示"!');

Query1.Next;
count:=count+1;
num:=num+1;
end //end flag 3
else

showmessage('数据库中的标识符falg出错')
end
else
break; //break while

except
showmessage('数据库出错!!');
end; //end 例外处理
end;

{$R *.dfm}
..........(但感觉代码并不是最优,显得罗嗦,原来的使用表关联查询.....)

fengzhengren 2005-05-05
  • 打赏
  • 举报
回复
哦,刚才试了一下, {$R *.dfm}的位置好像在哪无所谓。
fengzhengren 2005-05-05
  • 打赏
  • 举报
回复
你{$R *.dfm}的位置不对呀。

应该在implementation的下面一行。
smiler007 2005-05-05
  • 打赏
  • 举报
回复
代码显得乱的说....
jkx01whg 2005-05-05
  • 打赏
  • 举报
回复
该成Query1.open后,却出现XXX.exe raised exception class EDBEngineError with message 'Insufficient memory for this operation.
......

前些天就遇到这种情况,????????
Yasker 2005-05-05
  • 打赏
  • 举报
回复
用Query1.open, ExecSQL是针对没有返回值的.Delphi帮助里说得很清楚:
Note: For SELECT statements, call Open instead of ExecSQL.
duanhai 2005-05-05
  • 打赏
  • 举报
回复
我整理了一下

不过不太明白楼主要做的目的,所以没有改动程序
在代码中,加入我的疑问

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Mask, DBCtrls, DBTables, ExtCtrls, StdCtrls, DB;

type
TForm2 = class(TForm)
Query1: TQuery;
Query2: TQuery;
PlayDocument: TButton;
PriZH: TButton;
DBMemo1: TDBMemo;
Image1: TImage;
Table1: TTable;
Table2: TTable;
DBEdit_zhnum: TDBEdit;
PriJie: TButton;
study: TButton;
DBEdit_jnum: TDBEdit;
DBEdit_zhangN: TDBEdit;
DBEdit_jieN: TDBEdit;
procedure PlayDocumentClick(Sender: TObject);
procedure PriZHClick(Sender: TObject); //上一章
procedure PriJieClick(Sender: TObject); //上一节
procedure studyClick(Sender: TObject); //学习
private
{ Private declarations }
public
{ Public declarations }
procedure search();
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

var
num, count: Integer;
ZhName,JieName:string;
OK, filename: string;

procedure TForm2.search();//把最终查询结果显示到memeo中
var
sFile:string; //图片存取路径和名称
begin
num:=0;
ZhName:='';
JieName:='';
try
ZhName:=Query2.FieldByName('zh_name').AsString;
JieName:=Query1.FieldByName('j_num').AsString;
//Query1.First;
count:= Query2.fieldbyname('JiLu_num').AsInteger;
Query1.MoveBy(count);
//在while循环体中,当执行到Flag标识为'1'时,此循环将进入死循环
//因为Query2没有Next语句
while not Query2.Eof do
if OK='0' then
if Query2.FieldByName('flag').AsString='0' then
begin
DBMemo1.Lines.Add(Query2.FieldByName('document').AsString);

Next;
num:=num+1;
count:=count+1;
continue;
end //end flag 0
else if Query1.fieldbyname('flag').AsString='1' then
begin
OK:='1'; //修改显示暂停标志为1——暂停
sFile:=Query2.fieldbyname('document').AsString;//取要加载的图片的路径和名称
Image1.Picture.LoadFromFile(sFile); //动态加载.bmp图片
showmessage('如右图所示');
num:=num+1;
count:=count+1;
end //end flag 1
else if Query2.fieldbyname('flag').AsString='3' then
begin
OK:='1'; //修改显示暂停标志为1——暂停
PlayDocument.Enabled:=true;
filename:='';
filename:= Query2.fieldbyname('document').AsString;
showmessage('要查看多媒体演示,请单击"多媒体演示"!');
count:=count+1;
num:=num+1;
end //end flag 3
else
showmessage('数据库中的标识符falg出错')
else
break; //break while

except
showmessage('数据库出错!!');
end //end 例外处理
end;


procedure TForm2.PlayDocumentClick(Sender: TObject);
begin
ShellExecute(handle,'open',PChar(filename),'-s',
'',SW_SHOWNORMAL); //执行外部可执行文件(*.exe)
OK:='0'; //修改可继续执行标记OK
PlayDocument.Enabled:=false;
end;

procedure TForm2.PriZHClick(Sender: TObject); //上一章
var
zhang,jie:string;
begin
try
table2.Open;
table2.First;
jie:=table2.fieldbyname('j_num').AsString ;
table2.Close;
except
showmessage('访问时Table2出错!');
end;
zhang:=inttostr(strtoint(DBEdit_zhnum.Text)+1);

if strtoint(zhang)>0 then
begin
DBEdit_zhnum.Text:=zhang;
DBEdit_jnum.Text:=jie;
OK:='0';

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select zhang_table.zh_name,' +
'jie_table.j_name,docu_table.JiLu_num,' +
'docu_table.flag,docu_table.document');
Query1.SQL.Add('from zhang_table,jie_table,docu_table');
Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num' +
' and docu_table.j_num=jie_table.j_num');
Query1.SQL.Add('order by docu_table.j_num');
Query1.Open;
Query2.Open; //Query2是否已经设置正确?

search();
DBEdit_zhangN.Text:=ZhName ;
DBEdit_jieN.Text:=JieName;
end
else showmessage('目前为第一章');
end;

procedure TForm2.PriJieClick(Sender: TObject); //上一节
var
zhang,jie:string;
begin
try
table2.Open; //当执行table2.Oepn后,数据集的指针指向First
table2.Prior ; //所以当执行这条语句的时候会出错
jie :=table2.fieldbyname('j_num').AsString;
zhang:=table2.fieldbyname('zh_num').AsString;
table2.Close;
except
showmessage('访问时Table2出错!');
end;

DBEdit_zhnum.Text:=zhang;
DBEdit_jnum.Text:=jie;
if zhang=DBEdit_zhnum.Text then
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select zhang_table.zh_name,' +
'jie_table.j_name,docu_table.JiLu_num,'+
'docu_table.flag,docu_table.document');
Query1.SQL.Add('from zhang_table,jie_table,docu_table');
Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num' +
' and docu_table.j_num=jie_table.j_num');
Query1.SQL.Add('order by docu_table.j_num');
Query1.Open;
Query2.Open;

OK:='0'; //修改暂停标志

search();
DBEdit_zhangN.Text:=ZhName ;
DBEdit_jieN.Text:=JieName;
end
else showmessage('目前为本章第一节');
end;
//以下还有类似的“下一节”按钮操作

procedure TForm2.studyClick(Sender: TObject); //学习
var
zh_num,j_num:string;
begin
OK:='0';
zh_num:=DBEdit_zhnum.Text;
j_num:=DBEdit_jnum.Text;

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select zhang_table.zh_name,' +
'jie_table.j_name,docu_table.JiLu_num,' +
'docu_table.flag,docu_table.document');
Query1.SQL.Add('from zhang_table,jie_table,docu_table');
Query1.SQL.Add('where docu_table.zh_num=zhang_table.zh_num' +
' and docu_table.j_num=jie_table.j_num');
Query1.SQL.Add('order by docu_table.j_num');
Query1.Open;
Query2.Open;

search();
DBEdit_zhangN.Text:=ZhName ;
DBEdit_jieN.Text:=JieName;
end;

end.
fengzhengren 2005-05-05
  • 打赏
  • 举报
回复
如果是select语句的话,最后要用query.open;或query.active:=true;

如果是insert、update、delete语句才用execsql;

hxj797 2005-05-05
  • 打赏
  • 举报
回复
你的几个变量,你看看有没有!
duanhai 2005-05-05
  • 打赏
  • 举报
回复
提示什么错误来的?
smiler007 2005-05-05
  • 打赏
  • 举报
回复
Query1.ExecSQL;
改为
Query1.Open;
jkx01whg 2005-05-05
  • 打赏
  • 举报
回复
SQL语句为:
select zhang_table.zh_name,jie_table.j_name,docu_table.JiLu_num,docu_table.flag,docu_table.document
from zhang_table,jie_table,docu_table
where docu_table.zh_num=zhang_table.zh_num and docu_table.j_num=jie_table.j_num
and docu_table.zh_num=:zhang and docu_table.j_num=:jie
order by docu_table.j_num

执行部分是:
Query1.Close;
Query1.ParamByName('zhang').Value:=DBEdit_zhnum.Text;
Query1.ParamByName('jie').Value:=DBEdit_jnum.Text;
Query1.Prepare;
Query1.ExecSQL;

if query1.RecordCount>0 then //但是执行到这儿时,数据源自动关闭?????????
ResultSearchShow();
yuwenfeng 2005-05-05
  • 打赏
  • 举报
回复
while not Query2.Eof do
if OK='0' then
if Query2.FieldByName('flag').AsString='0' then
begin
DBMemo1.Lines.Add(Query2.FieldByName('document').AsString);

Next;
num:=num+1;
count:=count+1;
****************continue;***************這處是用來做什麼的?、、
jkx01whg 2005-05-05
  • 打赏
  • 举报
回复
“procedure TForm2.search();//把最终查询结果显示到memeo中”是自己定义的方法,delphi7的一般方法在具体实现时是放在implementation与{$R *.dfm}之间..............................
纯冰糖 2005-05-02
  • 打赏
  • 举报
回复
我求求你再贴一次整齐些的代码!!!
belllab 2005-05-02
  • 打赏
  • 举报
回复
代码太多了,看起来痛苦啊。
耙子 2005-05-02
  • 打赏
  • 举报
回复
看着就晕,不知道谁能帮你看。

2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧