sql语句出错了,帮我看看。(50分)

  • 主题发起人 主题发起人 wdsu
  • 开始时间 开始时间
W

wdsu

Unregistered / Unconfirmed
GUEST, unregistred user!


我的数据表如下:
客户表:
customer: int char char char
customerid customername customeraddr customertel
客户编号 客户姓名 客户地址 客户电话
定单表:
orders: int int date int
ordersno customerid orderdate ordersnum
定单编号 客户编号 定货日期 定单总数量
详细记录表:
ordersdetail int int int int
ordersno itemsno partsno numbers
定单编号 子项目序号 产品代号 数量
procedure Tfm_qrydatecust.btnqryClick(Sender: TObject);
var
wheresql,strcust:string;

begin
if (cbxcust.Items[cbxcust.ItemIndex]='全部') or (cbxcust.Items
[cbxcust.ItemIndex]='')
then wheresql:=''

else wheresql:='and (c.customer_name='''+cbxcust.Items
[cbxcust.itemindex]+')';
with datamodule2,qrydatecust do
begin
close;
SQL.clear;
sql.Add('select o.orderid,o.orderdate,c.customer_name');
sql.Add(',od.diam,od.length,od.num,od.pnum,od.plength');
sql.Add('from orders o,customer c ,orderdetail od where
(c.customerid=o.customerid)'''+wheresql+'''');
sql.Add('and (o.orderdate between'''+datetostr
(DateTimePicker1.datetime)+'''and'''+datetostr(DateTimePicker2.datetime)
+')''');
sql.Add('and (o.orderid=od.orderid)');
if prepared=false then prepare;
open;
end;

end;
说我的sql语句出错,请问高手们错在那里?
谢谢!wdsu@htc.net.cn


 
DateTimePicker1.datetime)+'''and+'''+datetostr(DateTimePicker2.datetime)
这里出错,and后面
 
sql.Add('from orders o,customer c ,orderdetail od where
(c.customerid=o.customerid)'''+wheresql+'''');
这句有问题
加入的sql串
应该


sql.Add('from orders o,customer c ,orderdetail od where
(c.customerid=o.customerid)'+wheresql);
你可以用showmessage(sql.text) 来显示你的sql语句,就会很容易发现错误了
 
不止那一个地方
还有上面的判断else wheresql:='and (c.customer_name='''+cbxcust.Items
[cbxcust.itemindex]+')';
这里面影写成else wheresql:='and (c.customer_name='''+cbxcust.Items
[cbxcust.itemindex]+''')';
 
呵呵,我也觉得不止一个地方
 
谢谢 大家的帮忙,我按大家说的修改了一下,sql语法通过了,但查询结果是空值。
我选'全部':
全部:
---------------------------
p_orders_design
---------------------------
select o.orderid,o.orderdate,c.customer_name
,od.diam,od.length,od.num,od.pnum,od.plength
from orders o,customer c ,orderdetail od where (c.customerid=o.customerid)
and (o.orderdate between 2002-5-30 and 2002-5-30)
and (o.orderid=od.orderid)

---------------------------
OK
---------------------------空值:
---------------------------
p_orders_design
---------------------------
select o.orderid,o.orderdate,c.customer_name
,od.diam,od.length,od.num,od.pnum,od.plength
from orders o,customer c ,orderdetail od where (c.customerid=o.customerid)
and (o.orderdate between 2002-5-30 and 2002-5-30)
and (o.orderid=od.orderid)

---------------------------
OK
---------------------------
p_orders_design
---------------------------
select o.orderid,o.orderdate,c.customer_name
,od.diam,od.length,od.num,od.pnum,od.plength
from orders o,customer c ,orderdetail od where (c.customerid=o.customerid)
and (c.customer_name='朱伟')
and (o.orderdate between 2002-5-30 and 2002-5-30)
and (o.orderid=od.orderid)

---------------------------
OK
------------------------

是不是语句的功能错了,怎么会没有结果呢?

谢谢!

 
静候佳音!
 
这种问题,根本不必去仔细看里面的SQL语句组成,直接将形成的SQL语句的内容显示出来
(雪中漫步 的做法),或者将SQL.Text赋值给一变量,进行Debug调试。
只要在界面上进行各种可能的操作,自然所有的错误情况都会暴露无遗。
 
至于显示结果的问题处理方法就更直接了,sql.text你都显示出来了,你将语句直接放在
sql*plus下运行,看看倒底结果是怎样。

如果本来就是空的,你要是能让程序显示出结果,那是你的能耐![:D]
 
大家好,我的问题在armyjiang, night,雪中漫步的帮助下已经解决了。
错在该行:
sql.Add('and (o.orderdate between '+datetostr(DateTimePicker1.datetime)+'
and '+datetostr(DateTimePicker2.datetime)+')');
解决办法如下:
要在datetimepicker1.datetime的两边加上一个单引号,即:
select o.orderid,o.orderdate,c.customer_name
,od.diam,od.length,od.num,od.pnum,od.plength
from orders o,customer c ,orderdetail od where (c.customerid=o.customerid)
and (c.customer_name='朱伟')

and (o.orderdate between '2002-03-01' and '2002-05-30') *****

and (o.orderid=od.orderid)
但在动态sql上面怎么写呢?
现在我改用另外一种方法:
sql.Add('and (o.orderdate between :BeginDate and :Enddate)');
sql.Add('and (o.orderid=od.orderid)');
sql.Add('order by o.orderdate');
parambyname('BeginDate').AsDate:=DateTimePicker1.datetime;
parambyname('EndDate').AsDate:=DateTimePicker2.datetime;
解决了。但我想知道第一种方法怎么写呢,请高手帮忙,谢谢!
 
唉, 你把问题搞的这莫复杂,想回答也无从下手,下次能够把问题
的核心内容提出来
 
动态SQL语句中要注意以下要点:
除了数据库中的列定义是数值型的以外,其他所有的列最好在SQL语句中都在值的两侧加
上单引号。对于日期型的列,在SQL语句中要进行格式转换(to_date),不能直接将日期型的
值代入SQL语句。

你的动态SQL实现方法如下:(四个单引号形成字符串中的一个单引号,三个单引号形成二个)
sql.Add('and (o.orderdate between '+ '''' + datetostr(DateTimePicker1.datetime)
+ '''' +'and '+ '''' + datetostr(DateTimePicker2.datetime) + '''' +')');
or

sql.Add('and (o.orderdate between ''' + datetostr(DateTimePicker1.datetime)
+ '''and ''' + datetostr(DateTimePicker2.datetime) + ''')');
 
多人接受答案了。
 
后退
顶部