在Delphi中用SQL查询碰到问题(100分)

撒旦

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我在SQL Server 2000中建立的三张表,分别是Student,SC,Course

create table Student(
Sno char(7) primary key,
Sname char(10) not null,
Ssex char(2) check(Ssex = '男' or Ssex='女'),
Sage tinyint check(Sage>=15 and Sage<=45),
Sdept char(20) default'计算机系'
)
create table Course(
Cno char(10) not null,
Cname char(20) not null,
Ccredit tinyint check(Ccredit>0),
Semster tinyint check(Semster>0),
primary key(Cno)
)
create table SC(
Sno char(7) not null,
Cno char(10) not null,
Grade tinyint check(Grade>=0 and Grade<=100),
primary key(Sno,Cno),
foreign key (Sno) references Student(Sno),
foreign key (Cno) references Course(Cno)
)
 
你现在想查询什么?
 
这是三张表中的数据:

insert into Student(Sno,Sname,Ssex,Sage) values('9512101','李勇','男',19)
insert into Student(Sno,Sname,Ssex,Sage) values('9512102','刘晨','男',20)
insert into Student(Sno,Sname,Ssex,Sage) values('9512103','王敏','女',20)
insert into Student values('9521101','张力','男',22,'信息系')
insert into Student values('9521102','吴宾','女',21,'信息系')
insert into Student values('9521103','张海','男',20,'信息系')
insert into Student values('9531101','钱小平','女',18,'数学系')
insert into Student values('9531102','王大力','男',19,'数学系')

insert into Course values('c01','计算机文化',3,1)
insert into Course values('c02','VB',2,3)
insert into Course values('c03','计算机网络',4,7)
insert into Course values('c04','数据库基础',6,6)
insert into Course values('c05','高等数学',8,2)
insert into Course values('c06','数据结构',5,4)

insert into SC values('9512101','c01',90)
insert into SC values('9512101','c02',86)
insert into SC values('9512101','c06',null)
insert into SC values('9512102','c02',78)
insert into SC values('9512102','c04',66)
insert into SC values('9521102','c01',82)
insert into SC values('9521102','c02',75)
insert into SC values('9521102','c04',92)
insert into SC values('9521102','c05',50)
insert into SC values('9521103','c02',68)
insert into SC values('9521103','c03',null)
insert into SC values('9531101','c01',80)
insert into SC values('9531101','c05',95)
insert into SC values('9531102','c05',85)
 
我用BDE中的Query和Data Access中的DataSource建立了对数据库的连接,在Query中的SQL这样写的
‘select s.sno 学号,sname 姓名,ssex 性别,sage 年龄,sdept 所在系,sc.cno 课程号,grade 分数,cname 课程名,ccredit 学分,semster 学期 from student s join sc on s.sno=sc.sno join course c on sc.cno=c.cno

在Form中加了Standard中的两个Edit框和一个Button,目的是实现一个类是模糊查询的功能,在两个Edit中输入任意两个条件就能找出符合‘条件一and条件二’的记录来。如果输入任一个条件也照样能查出来。
因为我表里有的是tinyint有的是char型,在查询的时候就会有类型不匹配的问题。如果输入两个数据的都是可以查出来的,当时碰到char不行了,请给位帮我想想办法。谢谢!


 
在此附上整个Form的代码:
unit SeeDfault;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls, ComCtrls;

type
TfmSeeDfault = class(TForm)
DBGrid1: TDBGrid;
Query1: TQuery;
DataSource1: TDataSource;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
StatusBar1: TStatusBar;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
fmSeeDfault: TfmSeeDfault;
StrSQL,StrSQL1,StrSQL2,StrTemp1,StrTemp2:String;
IntTemp1,IntTemp2:integer;
implementation

{$R *.dfm}

procedure TfmSeeDfault.Button1Click(Sender: TObject);
begin
StrTemp1:=Edit1.Text;
StrTemp2:=Edit2.Text;
//IntTemp1:=StrToInt(Edit1.Text);
//IntTemp2:=StrToInt(Edit2.Text);
StrSQL:='select s.sno 学号,sname 姓名,ssex 性别,sage 年龄,sdept 所在系,sc.cno 课程号,grade 分数,cname 课程名,ccredit 学分,semster 学期 from student s join sc on s.sno=sc.sno join course c on sc.cno=c.cno where ';
StrSQL1:='(s.sno='''+StrTemp1+''' or sname='''+StrTemp1+''' or ssex='''+StrTemp1+''' or sage='''+StrTemp1+''' or sdept='''+StrTemp1+''' or sc.cno='''+StrTemp1+''' or grade='''+StrTemp1+''' or cname='''+StrTemp1+''' or ccredit='''+StrTemp1+''' or semster='''+StrTemp1+''')';
StrSQL2:='(s.sno='''+StrTemp2+''' or sname='''+StrTemp2+''' or ssex='''+StrTemp2+''' or sage='''+StrTemp2+''' or sdept='''+StrTemp2+''' or sc.cno='''+StrTemp2+''' or grade='''+StrTemp2+''' or cname='''+StrTemp2+''' or ccredit='''+StrTemp2+''' or semster='''+StrTemp2+''')';
if (StrTemp1='') and (StrTemp2='') then
ShowMessage('请输入您要查询的数据!');
if (StrTemp1<>'') and (StrTemp2='') then
begin
query1.SQL.Clear;
query1.SQL.Add(StrSQL+StrSQL1);
query1.Active:=true;
end;
if (StrTemp1='') and (StrTemp2<>'') then
begin
query1.SQL.Clear;
query1.SQL.Add(StrSQL+StrSQL2);
query1.Active:=true;
end;
if (StrTemp1<>'') and (StrTemp2<>'') then
begin
query1.SQL.Clear;
query1.SQL.Add(StrSQL+StrSQL1+' and '+StrSQL2);
query1.Active:=true;
end;
end;

end.


 
字段名也要在edit中指定吗?
为什么不用ADO
 
StrSQL1:='(s.sno='''+StrTemp1+''' or sname='''+StrTemp1+''' or ssex='''+StrTemp1+''' or sage='''+StrTemp1+''' or sdept='''+StrTemp1+''' or sc.cno='''+StrTemp1+''' or grade='''+StrTemp1+''' or cname='''+StrTemp1+''' or ccredit='''+StrTemp1+''' or semster='''+StrTemp1+''')';
StrSQL2:='(s.sno='''+StrTemp2+''' or sname='''+StrTemp2+''' or ssex='''+StrTemp2+''' or sage='''+StrTemp2+''' or sdept='''+StrTemp2+''' or sc.cno='''+StrTemp2+''' or grade='''+StrTemp2+''' or cname='''+StrTemp2+''' or ccredit='''+StrTemp2+''' or semster='''+StrTemp2+''')';
这样有必要吗?
你为什么要这样做?你可以给两个combobox让用户选择字段,不行吗
 
我是想实现类似于模糊查询的查询方法
所以在语句上比较复杂
而且我是三张表一起查询的
请问ADO应该怎么实现我想要的功能?
 
你的意思是想根据用户输入的用所有的字段去匹配吗?
你只要先获得字段的类型,先试着将edit中的内容转换成float,如果不成功就不要数字类型的字段
 
“根据用户输入的用所有的字段去匹配吗“
我这是这样想的,怎么转换成Float?是StrToFloat吗?
“不要数字类型的字段”是不是意味着只能查询char型的不能是int?
 
如果让我写,我会用两个LISTBOX,一个COMBOBOX, 一个EDIT,两个CHECKBOX和两个RADIOBUTTON,其中一个LISTBOX用来放和字段相对应的中文,一个LISTBOX用来放生成的条件,COMBOBOX用来放条件中的逻辑关系,如:>,<,= 等,两个CHECKBOX的CAPTION分别是“(”和“)”,两个RADIOBUTTON的CAPTION为“AND”和“OR”,再用一个STRINGLIST来放字段名,与第一个LISTBOX对应,一个STRING来放生成的条件语句。
这样,用户可以查询的非常灵活。字段类型的问题也可以在用户输入查询值的时候就发现。
 
难道没有简单点的办法了吗?
 
procedure TfmSeeDfault.Button1Click(Sender: TObject);
var strfieldlist:Tstringlist;
isnum1,isnum2:boolean;
begin
StrTemp1:=Edit1.Text;
StrTemp2:=Edit2.Text;
//IntTemp1:=StrToInt(Edit1.Text);
//IntTemp2:=StrToInt(Edit2.Text);
StrSQL:='select s.sno 学号,sname 姓名,ssex 性别,sage 年龄,sdept 所在系,sc.cno 课程号,grade 分数,cname 课程名,ccredit 学分,semster 学期 from student s join sc on s.sno=sc.sno join course c on sc.cno=c.cno where 1=2';//空集
adoquery.close;
adoquery.sql.clear;
adoquery.sql.text:=strSQL;
adoquery.open;//
fieldList:=tstringlist
for i:=0 to adoquery.FieldCount -1 do
begin
if not(adoquery.Fields.DataType in [ftSmallint,ftInteger,ftWord...]) then
fieldList.Add(aq.Fields.FieldName );
end;
adoquery.Close ;
try
IntTemp1:=StrToInt(Edit1.Text);
StrSQL1:='(s.sno='''+StrTemp1+''' or sname='''+StrTemp1+''' or ssex='''+StrTemp1+''' or sage='''+StrTemp1+''' or sdept='''+StrTemp1+''' or sc.cno='''+StrTemp1+''' or grade='''+StrTemp1+''' or cname='''+StrTemp1+''' or ccredit='''+StrTemp1+''' or semster='''+StrTemp1+''')';
except
for i:=0 to fieldlist.count-1 do
begin
strsql:=' or'+ fieldlist+'='''+StrTemp1+'''';
end;
delete (strsql ,1 ,3);
end;
 
有,用PB做,会变得极简单!
不过,用PB成DLL文件后,能不能在DELPHI中用我没试过![:D]
 
ADO我不会用啊
ADO怎么跟数据库相连接的?
 
用到ADO中的那几个控件啊?
 
ADOCONNECTION和ADOQUERY
和BDE差不多
 
WoDing
我已经发Email给你了,里面有源程序,帮我看看吧。谢谢!
 
楼主您可真累,直接使用sql server的存储过程不就行了,无非就是传入二个参数。
其次,您这么长的sql字符串在网络上传递本身就不好,容易造成网络堵塞。
 
楼上的兄弟,能不能说的详细一点啊!
我是菜鸟,具体应该怎么设置!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
681
import
I
顶部