大家好,请帮助我吧,谢谢!!(100分)

  • 主题发起人 主题发起人 sjw16
  • 开始时间 开始时间
S

sjw16

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Access下做了一个十分简单的数据库(product),有两个字段一个是Snumber,
一个是Sname.里面有两条记录(1001,tom;1002 rose)。现在在Delphi中有一工程,
界面上有控件如下:Datasource,Adoquery,dbgrid各一个,还有一个按钮和一个编辑框),
要完成的任务是:当我在编辑框中输入一个信息(查询条件)后,按下按钮,在dbgrid中
就会出现数据库中的记录(要查询数据库中每一条和查询条件相关的信息),如果没有就
会显示一个出错信息。例如当我在编辑框输入‘1001’,在dbgrid中就会出现Snumber:1001;
Sname:tom。看明白了吗?不明白告诉我吧,我等着你的解答,十分感谢!!
 
查询代码看一下!拿出来,以及这两个字段的类型
 
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.text:='select * from product where Snumber='+QuotedStr(edit1.Text);
adoquery1.active:=true;
adoquery1.execsql;
这两个字段都是文本类型的。多谢回答,谢谢!!!
 
这个你哪里出错了呢?应该很简单,用query去写入sql语句,查询救行了啊

 
你还没有具体搞清楚QUERY的用法,凡是'SELECT ...'的就不要EXECSQL,而只需用ACTIVE:=TRUE
或QUERY.OPEN就行了.照这样来.
adoquery1.active:=False;
adoquery1.sql.clear;
adoquery1.sql.text:='select * from product where Snumber='+QuotedStr(edit1.Text);
adoquery1.active:=true;
adoquery1.execsql;//不要这一行!
就行了,另外,还有一种LOCATE的用法,我认为更好一些,因为你用SQL的话,只会返回查询到的
记录,而用LOCATE,就只是定位到查询到的那笔资料,因为资料你也还看得见.例:
if query.locate('ID',Edit1.text,[loCaseInsensitive]) then showmessage('FIND '+Edit1.Text);
具体的看一下帮助,
 
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.text:='select * from product where Snumber='+QuotedStr(edit1.Text);
adoquery1.active:=true;
adoquery1.execsql;
if ADOQuery1.bof and ADOQuery1.Eof
then ShowMessage('Error!')
else
begin
DataSource1.DataSet := ADOQuery1;
DBGrid.DataSource := DataSource1;
end;
应该是这样吧,好久没有用ADOQuery了,现在我都用ADODataSet,不错的控件啊!
 
现在的情况是dbgrid和datasource没有连接上(也要求他们不连接)。
你们说的是连接是的情况,那我知道。
输入查询条件后,先检查数据库别名,在检查表名,在检查输入的信息,然后在
数据库中逐条的检查符合条件的信息,在dbgrid中显示出来,当然也可以不用dbgrid控件,
而用其他的控件显示。
谢谢帮助!!
大家新年快乐!!!
 
>>现在的情况是dbgrid和datasource没有连接上(也要求他们不连接)。
要是这种情况的话,用一个StringGrid自己填吧。
 
能说得具体一点吗?我是个新手呀。
谢谢!!!
 
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.text:='select * from product where Snumber='+QuotedStr(edit1.Text);
adoquery1.open;
//adoquery1.execsql;
这样就行了!不用adoquery1.execsql;
 
er que 也不用quotedstr的
zhi jie 用 select * from product where snumber="'+edit1.text+'"'
就行了
 
大家好!
我现在用了两个窗体,第一个窗体上有控件:datasource,adoquery,button,edit各一个,其中
edit用于输入查询条件,button用于打开第二个窗体。第二个窗体上有控件:dbgridge各一个
(注意:dbgrid是专门用来显示查询结果的)。当按下第一个窗体的按钮后就显示出第二个窗体,
并且在Dbgrid中显示查询结果。代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
with form2 do
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Text:='select * from product where Snumber='+Quotedstr(edit1.Text);
adoquery1.Active:=true;
adoquery1.Open;
if ADOQuery1.bof and ADOQuery1.Eof
then ShowMessage('Error!')
else
begin
DataSource1.DataSet := ADOQuery1;
DBGrid1.DataSource := DataSource1;
end;
end;
end;
为什么不行呢?求教各位朋友,谢谢!!
 
adoquery1.Active:=true; 可以不要,open有这个功能;
在适当地方加上 DataSource.Active:=true;
 
datasource哪里有Aactive这个属性呀?写上去报错。
请你们继续关注这个问题吧。
 
哪儿不行?form2没显示出来?还是dbgrid中没记录啊?dbgrid中没记录是你没查到记录
吧(调用ADOQuery1.isempty来判断);调用form2.show或form2.showmodal显示form2。
 
1.dbgrid在设计时就应该与adoquery关联。
2.open之后加一句:
adoquery1.refresh;
 
我认为问题在于sjw16的设计思想不对,应当在一个DataModule中用DataSource或者是其他
的不可视的数据库控件,而不是直接把他们放在Form上,代码重用性不好极了.
with form2 do
begin
//adoquery1.Close;
AdoQuery1.Active:=false;//Close过程调用了左边的语句.
adoquery1.SQL.Clear;
//adoquery1.SQL.Text:='select * from product where Snumber='+Quotedstr(edit1.Text);
//我比较讨厌在一个语句中就用Quotedstr(),在这里没必要用它。
AdoQuery1.SQL.Add('select * from product where Snumber="'+Edit1.Text+'"');
adoquery1.Active:=true;
//adoquery1.Open; {在这里是重复,AdoQuery1.Active是Open调用后的结果,隐含的!}
//if ADOQuery1.Bof and ADOQuery1.Eof then {不可能是Bof和Eof同时为真!}
if ADOQuery1.Bof or ADOQuery1.Eof then //只有两条记录时,程序没法工作了!
ShowMessage('Error!')   //我看Sjw16要改写程序的逻辑了
else
begin
DataSource1.DataSet := ADOQuery1;
DBGrid1.DataSource := DataSource1;
end;
end;

 
接受答案了.
 
后退
顶部