用TQuery在数据库中查找Edit的值(50分)

  • 主题发起人 主题发起人 lclin
  • 开始时间 开始时间
L

lclin

Unregistered / Unconfirmed
GUEST, unregistred user!
我现有一个存放学生信息的表,字段有:sno(A)、sname(A)、sex(A)、photo(G),我想利用TQuery控件的SQL对Edit中输入的学号查找该学生的信息。我的查找按钮的Click
if box_sno.checked or box_sname.Checked or box_sex.checked
or box_photo.Checked or box_cno.checked or box_cname.checked
or box_teacher.checked or box_score.checked
then
begin
tag_field:=false;
with query1 do begin close;
with SQL do begin
clear;
add('select');
if box_sno.checked then
begin
add('student.sno');
tag_field:=true;
end;
if box_sname.checked then
begin
if tag_field then add(',');
add('student.sname');
tag_field:=true;
end;
if box_sex.checked then
begin
if tag_field then add(',');
add('student.sex');
tag_field:=true;
end;
if box_photo.checked then
begin
if tag_field then add(',');
add('student.photo');
tag_field:=true;
end;
if box_cno.checked then
begin
if tag_field then add(',');
add('class.cno');
tag_field:=true;
end;
if box_cname.checked then
begin
if tag_field then add(',');
add('class.cname');
tag_field:=true;
end;
if box_teacher.checked then
begin
if tag_field then add(',');
add('class.teacher');
tag_field:=true;
end;
if box_score.checked then
begin
if tag_field then add(',');
add('score.score');
end;
add('from student,class,score');
add('where student.sno=score.sno and class.cno=score.cno and student.sno=edit_sno.text');

end;
open;
end;
end
else showmessage('你还没选择字段,请选择。。。');
可是,当程序运行到student.sno=edit_sno.text后,就出了“Invalid
field name.text”错误。
诸位,谁有办法,在下将重金感谢!
 
调试时把SQL语句打出来
首先侃侃是不是语法上有问题
有时候就是缺个空格什么的,就是不对
 
我觉得这种Sql语法不应该拿出来讨论
 
应该带参数查询。
add('where student.sno=score.sno and class.cno=score.cno and student.sno=edit_sno.text');改为:
add('where student.sno=score.sno and class.cno=score.cno and student.sno=<font color=#FF0000>:student_sno</font>');

再加一句:ParamByName('student_sno').asString:=edit_sno.text';

 
再加一句,多一个引号,应为:
ParamByName('student_sno').asString:=edit_sno.text;
 
同意liuge。
其实这种问题应该先检查SQL的语法,
在Open之前把SQL语句存在ListBox或memo中,
拿到SQL Explorer中运行一遍,直到通过。
 

if box_sno.checked then
begin
add('student.sno');
tag_field:=true;
end;
中add('student.sno');应为
astring:=''''+student.sno+'''';
add(astring);
其中astring为string类型变量,以此类推

 
在 Sql 语句中不能引用 某个 Edit.text 的,这种查询我做过,应当用 带参数的查询来实现,非常方便的,同意liuge
 

add('where student.sno=score.sno and class.cno=score.cno and student.sno=edit_sno.text');
改为:
add('where (student.sno=score.sno) and (class.cno=score.cno) and (student.sno='+edit_sno.text+'')'');



 
add语句应改为:
add('where (student.sno=score.sno) and (class.cno=score.cno) and (student.sno=" ' +edit_sno.text + '")');



 
Please Trace & DEBUG

遇到这种问题,你应该先找出出错的原因
首先, 将你的SQL语句显示出来(如 显示在Caption上)
检查SQL语句是否正确,如你不能确定,请用 SQL explor 测试。

if SQL语句正确 then
begin

...
检查赋值等语句...;
...

end
else
begin

检查SQL语句的生成过程...;

end;

希望你能从问题中学到解决问题的方法, 而不是简单的答案!!!
我学Delph也不久,只能算是初级水平,希望能和大家一起进步!
 
我认为还是 引用参数的问题 还是用
PARAMBYNAME('sno').asstring:=EDIT.TEXT;
add('where (student.sno=score.sno) and (class.cno=score.cno) and
(student.sno=:sno');


 
'where student.sno=score.sno and class.cno=score.cno and '+
+'student.sno='''+edit_sno.text+''''
 

add('where student.sno=score.sno and class.cno=score.cno and
student.sno=edit_sno.text');
就是这一句有问题。问题所在是引号。edit_sno.text放在引号内不会有值吗?

应该改为:
add("where student.sno=score.sno and class.cno=score.cno and
student.sno=");
add('"'+ edit_sno.text + '"');

 
我修改了一下你的程序,如下:
var
T : String;
if box_sno.checked or box_sname.Checked or box_sex.checked
or box_photo.Checked or box_cno.checked or box_cname.checked
or box_teacher.checked or box_score.checked then
begin
with query1 do
begin
close;
T := '';
if box_sno.checked then T := T+'student.sno,';
if box_sname.checked then T := T+'student.sname,';
if box_sex.checked then T:= T+'student.sex,');
if box_photo.checked then T := T+'student.photo,';
if box_cno.checked then T := T+'class.cno,');
if box_cname.checked then T := T+'class.cname,';
if box_teacher.checked then T := T+'class.teacher,';
if box_score.checked then T := T+'score.score,';
T := Copy(T,1,Length(T)-1);
Sql.Clear;
Sql.add('select '+T+' from student,class,score');
Sql.add('where student.sno=score.sno and class.cno=score.cno and student.sno=:No');
ParamByName('No').asString:=edit_sno.text;
{如果student.sno是字符串类型,如上填写。如果是整数类型,则改为
ParamByName('No').asInteger:=StrToInt(edit_sno.text);}
open;
end;
end
else
showmessage('你还没选择字段,请选择。。。');
 
各位大虾已经说得很清楚了,补充一点:在Open之前加上Prepare有好处。
 
接受答案了.
 
后退
顶部