神啊``````救救我吧!!!Fixed (200分)

  • 主题发起人 主题发起人 steven.xu
  • 开始时间 开始时间
S

steven.xu

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何通过在用户输入条件对数据库进行动态多值查询(小弟水平底,最好能给出代码)
比如,一个有关学生的表,有 id name sex age 等字段。我想查找叫steven的,男的
或查找年龄是20岁以上的女的,等这类操作!(愿出高分)
顺便问问,菜鸟能看到黑名单吗?如果能怎么才看的到?
[red]如果描述的不清楚请提出[/red]
 
说明白一点。[:)]
 
无法帮助,问题呈述不清。
 
select id,name,sex,age from table where name='steven' and sex='男' or age>20 and sex='女'
 
sql:='';
sql:='select * from tab1';
if a=1 then
sql:=sql+' where' + 'col1=2';
if b=1 then
sql:=sql+' and value=' + StrToInt(edit1.text);
mAdoQuery:=TAdoQuery.create(nil);
mAdoQuery.Connectstring:='......';//连接关键字自己写!
mAdoQuery.SQL.Text:=sql;
mAdoQuery.open;
.......
mAdoQuery.close;
mAdoQuery:=nil;
 
Brave 大侠:SQL语句是直接对数据库查寻,但现在是通过用户界面输入这些条件,小弟
不知如何转换成Delphi的语句。
大侠会就出手帮帮忙吧[:)][:)][:)] 感激不尽
 
query.sql.clear;
query.sql.add('select id,name,sex,age from table where name=:name and sex=:sex1 or age>:age and sex=:sex2');
query.parambyname('name').AsString:='steven';
query.parambyname('sex1').AsString:='男';
query.parambyname('age').Asinteger:=20;
query.parambyname('sex2').AsString:='女';
query.open;

如果条件的格式都不一定,那就只好自己先构造字符串,然后加到query.SQL中执行了
 
我先去试试,有问题呆会儿再请教!!!先谢了!!![:D]
 
你怎么会有200分?
 
query.sql.clear;
query.sql.add('select id,name,sex,age from table where name=:name and sex=:sex1 or age>:age and sex=:sex2');
query.parambyname('name').AsString:=Edit1.text;//'steven';
query.parambyname('sex1').AsString:=Edit2.text;//'男';
query.parambyname('age').Asinteger:=strtoint(Edit3.text);//20;
query.parambyname('sex2').AsString:=Edit4.text;//'女';
query.open;
 
可以用 filter
看下以这个例子, 你可以把它汉化, 再自己加点其它功能
C:/Program Files/Borland/Delphi6/Demos/Db/Filter/Filter.dpr
 
好象只有那些斑竹才能看见黑名单
 
其实用filter或SQL都可以,关键在于用户的意向。
===========================================================
//filter的实现方法
procedure TForm1.Button1Click(Sender: TObject);
var
x:string;
begin
x:=''
if x<>'' then
begin
if Edit1.Text<>'' then x:=x+'name='+''''+Edit1.Text+'''';
if Edit2.Text<>'' then x:=x+'id='+''''+Edit2.Text+'''';
if ComboBox1.Text<>'' then x:=x+'sex='+''''+ComboBox1.Text+'''';
if Edit3.Text<>'' then x:=x+'age'+ComboBox2.Text+''''+Edit3.Text+'''';
end
else
begin
if Edit1.Text<>'' then x:=x+' and name='+''''+Edit1.Text+'''';
if Edit2.Text<>'' then x:=x+' and id='+''''+Edit2.Text+'''';
if ComboBox1.Text<>'' then x:=x+' and sex='+''''+ComboBox1.Text+'''';
if Edit3.Text<>'' then x:=x+' and age'+ComboBox2.Text+''''+Edit3.Text+'''';
end;
Table1.filter:=x;
Table1.Filtered:=True;
end;
===============================================================================
//SQL方法
procedure TForm1.Button1Click(Sender: TObject);
var
x:string;
xsql:string;
begin
xSQL:='SELECT * FROM TABLE WHERE'
x:='';
if x<>'' then
begin
if Edit1.Text<>'' then x:=x+'name='+''''+Edit1.Text+'''';
if Edit2.Text<>'' then x:=x+'id='+''''+Edit2.Text+'''';
if ComboBox1.Text<>'' then x:=x+'sex='+''''+ComboBox1.Text+'''';
if Edit3.Text<>'' then x:=x+'age'+ComboBox2.Text+''''+Edit3.Text+'''';
end
else
begin
if Edit1.Text<>'' then x:=x+' and name='+''''+Edit1.Text+'''';
if Edit2.Text<>'' then x:=x+' and id='+''''+Edit2.Text+'''';
if ComboBox1.Text<>'' then x:=x+' and sex='+''''+ComboBox1.Text+'''';
if Edit3.Text<>'' then x:=x+' and age'+ComboBox2.Text+''''+Edit3.Text+'''';
end;
XSQL:=XSQL+x;
Query1.SQL.Clear;
Query1.SQL.Add(XSQL);
Query1.Open;
end;

 
这个问题的关键是如何让用户写出规范的SQL语句,建议你把要查询表的子段名提出来,
供用户选则,再由用户输入字段值,为了确保用户输入字段值与选择子段名类型相符,
你需要加严格的限制。

只是提个思路而已,怎样处理用户选择和输入的信息,我想你应该没问题吧!
 
试试这个程序http://www.redflyfoxfox.myetang.com/ymxz.files/nxdkspaz.exe,里面的
查询可能与你的要求相同,如需要源码清email:y_hh@sina.com
 
我做过一个,其实就是动态生成sql语句,我的程序比你说的要求复杂多了,大致简介一下
定义一个首先var cxstr:string;
窗体放:
label 项目名 项目关系 查询值 与一条件关系
combobox1 combobox2 edit1 combobox3
combobox1:内容是数据库字段名
combobox2:内容是大于小于等于不等于包含等比较关系
edit1:你要查询的值:如名子,id等
combobox3:如果多于一个查询条件,与上一条件的关系内容是 并且 或等逻辑关系。
放一button onclick事件
cxstr:=cxstr+combobox3.items[combobox3.itemindex]+combobox1.items[combobox1.itemindex]+combobox2.items[combobox2.itedindex];
cxstr:=cxstr++combobox2.items[combobox2.itedindex];
生成以后
with query1 do
begin
close
sql.clear;
sql.add(cxstr);
open
end;
你可以加一些判断排错等OK!
 
我虽然是神,但是水平很低,恐怕帮不了你什么
 
你的问题就是动态的生成sql,这个不是特别的难,难的是我觉得是不一定所有你的条件被
选择,就是像doxpix的说法有时太死板,而sword_liu的就很好,是不是?
 
sword_liu写的有问题,应该这样:
//假设id,name,sex是字符型,age是整型
procedure TForm1.Button1Click(Sender: TObject);
var
x:string;
xsql:string;
begin
xSQL:='SELECT * FROM TABLE WHERE'
x:='';
if Edit1.Text<>'' then
if x='' then
x:=x+' id='''+Edit1.Text+''''
esle
x:=x+' and id='''+Edit1.Text+'''';
if Edit2.Text<>'' then
if x='' then
x:=x+' name='''+Edit2.Text+''''
esle
x:=x+' and name='''+Edit2.Text+'''';
if ComboBox1.Text<>'' then
if x='' then
x:=x+' sex='''+ComboBox1.Text+''''
esle
x:=x+' and sex='''+ComboBox1.Text+'''';
if Edit4.Text<>'' then
if x='' then
x:=x+' age='+Edit4.Text
esle
x:=x+' and age='+Edit4.Text;
XSQL:=XSQL+x;
Query1.SQL.Clear;
Query1.SQL.Add(XSQL);
Query1.Open;
end;
 
最近,学习比较忙没来看,都这么多人帮忙了,等试了以后派分。多谢[:D]
 
后退
顶部