sql的动态查询?(50分)

  • 主题发起人 主题发起人 joinrry
  • 开始时间 开始时间
J

joinrry

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:
我想用动态实现查询功能,
其中用到了两个控件,一个
combobox1录入要查询的字段,
一个录入edit1录入要查询的
内容,语句如下:
query1.close;
query1.sql.clear;
query1.sql.add('select * from where');
query1.sql.add('+'''combobox1.text'''+'='+'''edit1.text'''');
query1.open;
可是不行,向大家请教!
我知道第四句代码有错,但我不知道怎样改正!
 

sqlstr:=' select * from table1 where '+combobox1.text+'='+''''+edit1.text+''''
query1.close;
query1.sql.clear;
query1.sql.text:=sqlstr;
query1.open;
 
from后面缺少表名,
第四行加号和引号语法混乱。

query1.close;
query1.sql.clear;
query1.sql.add('select * from mytable where');
query1.sql.add(combobox1.text + ' = ''' + edit1.text + '''');
//如果字段是整形或者浮点型不需要加引号,则第四行应为
//query1.sql.add(combobox1.text + ' = ' + edit1.text);
query1.open;
 
第四句改为query1.sql.add(combobox1.text+'='+edit1.text);
(另from后面没有表名)
 
sqlstr:=' select * from table1 where '+combobox1.text+'='''+edit1.text+'''';
 
'''''''一多,眼睛都花了
你为何不用params代替两个text呢?

这样只用写:param1=:param2不就成了
 
可以用 ParamByName('unit_code').asstring:=Dbedit1.text符值
 
SQL 语句中可以用 " "(双引号)的吧
 
用#39代替单引号 #39 代表的是单引号的ascii的值
 
fu_xiang_yu:

你为何不用params代替两个text呢?

这样只用写:param1=:param2不就成了

怎么用params代替text,写个代码给我好吗,谢谢!

 
应该使用参数化查询,而不能直接把变量名写在sql语句中
delphi的帮助文件中有详细讲述
在这里,可以写成
...
query1.sql.add(' :p_1=:p_2');
query1.parambyname('p_1').asstring:=combobox1.text;
query1.parambyname('p_2').asstring:=edit1.text;
...
 
应该使用参数化查询,而不能直接把变量名写在sql语句中
delphi的帮助文件中有详细讲述
在这里,可以写成
...
query1.sql.add(' :p_1=:p_2');
query1.parambyname('p_1').asstring:=combobox1.text;
query1.parambyname('p_2').asstring:=edit1.text;
...
 
不想用Param时,可以使用QuotedStr函数,它专门用来产生带单引号的字符串,
如'Select * from abc where fildname='+QuotedStr(ComboBox1.Text)
与'Select * from abc where filednae='''+ComboBox1.Text+''''
是一样的。
 
如下:
With DtM.Qry1 do
begin
Close;
SQL.Clear;
SQL.Add('Select * from "table1.db" table1');
SQL.Add('Where Name=:P_Name and Addr=:P_Addr');
ParamByName('P_Name').AsString:=CbxName.Text;
ParamByName('P_Addr').AsString:=EdtAddr.Text;
Prepare;
Open;
end;
……
 
多人接受答案了。
 
后退
顶部