此种sql错误该如何解决?(200分)

  • 主题发起人 主题发起人 小刀王
  • 开始时间 开始时间

小刀王

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一程序中的有如下的sql查询语句:
Close;
SQL.Clear;
SQL.Add('select * from repair');
SQL.Add('where selfno=:selfno1 and no<>dbedit1.text and dbedit8.text>=infodate and dbedit8.text<=filldate');
open;
结果程序首先提示invalid use of keyword token:no<>dbedit1.text信息,去掉
no(repair中的关键字段,selfno、infodate、filldate是repair中的普通字段,
infodate、filldate是date字段)<>dbedit1.text的条件,又显示invalid field name text信息,
我想是针对dbedit8.text的,后来根据一位大侠的指正,将第二个add改为如下:
SQL.Add('where selfno='+selfno1+' and'+' no<>'+dbedit1.text+' and'+' infodate <'+dbedit8.text+' and'+ ' filldate>'+dbedit8.text+'');
结果又显示invalid use of keyword token:no<>维001(维001正确)信息;去掉' no<>'+dbedit1.text+' and'+这一部分,
又显示type mismatch in expression的信息,到底该如何解决。望各位大侠不吝赐教!!!

[:(]
 
这样写:
SQL.Add('select * from repair');
SQL.Add('where selfno=''' + selfno1 + ''' and no<>''' + dbedit1.text
+ ''' and ''' + dbedit8.text + '''>=infodate and ''' + dbedit8.text + '''<=filldate');
 
为什么不用参数呢?你们不觉得引号晃的你们眼花么!
 
no是sql的关键字!

你大概需要把no用引号扩起来
 
有一个好办法,,你先把SQL语写用showmessage(sql)显示出来,然后再把这个SQL语句拷贝到
SQL的查询分析器里运行,就知道在那里出错的,,用这个办法能解决很多不是技术问题的问题
 
同意 枫 的意见,
显示关键变量有助于调试!
 
westboy2000已经回答了问题了,参数并不如动态创建参数查询来得好,因为查询中可能出
现有些条件取舍的问题,比如如果上述的dbedit1.text为空的话,就不加为参数可以这么
做:(先定义WHERE部分的变量strWHERE)
if dbedit1.text<>'' then
begin
if strWHERE='' then
strWHERE:=' WHERE NO<>'''+dbedit1.Text+''''
else
strWHERE:=' AND NO<>'''+dbedit1.text+'''';
end;
多个查询条件来源控件可以套用到以上过程。这样做的好处是:
1、可以避免有些空条件值计入查询条件产生的查询结果错误
2、因为SELECT与WHERE子句分立,各WHERE部分,都可以分段注释掉,这样很容易找出问题
所在。
 
楼上的,用参数也可以这样写呀,你知道么,不用参数总是会被那么多引号搞糊涂的。
with Query1 do
begin
close;
with SQL do
begin
clear;
add('select * from repair');
if dbtext1.text <> '' then
add('where no =:sNo');
add('order by no');
end;
if dbtext1.text <> '' then
params.parambyname('sNo').AsString:=dbText1.text;
open;
end;
不管多复杂的条件都可以构造出来,而且程序容易读懂。
 
第一,用参数查询不是不好,我记得有资料说过,在查询之间生成SQL语句比参数查询的效
率来得高。
第二,你还要写一个给参数赋值的语句,不是代码更长了吗?
第三,引号并不会搞糊涂人的,因为WHERE中条件一分隔开来,有问题,很容易找出出错的
地方。
因为我大部分时间在进行快速开发进销存定制规则的软件,各企业的业务规则不尽相同,
甚至很多时候,业务很复杂。在这些情况下,代码的可重用性,易读性就非常重要。先前
我也是用参数查询,但如果查询写得有问题,找起来就麻烦了。而且在多条件值不应存在
的时候固定参数就不好用了,况且参数在一些情况下一定要指定它的值属性。复杂的条件
不是能不能构造出来的问题,而是够不够灵活的问题。我上面说过我刚做的一个程序,要
对有63个字段,37个查询条件的查询来说,程序的可读性就非常重要。而且37个查询条件
并不是可以并存的。因为用了这样方法,花在调试上的时间就少了很多,开发的进程就得
到了保障。你说呢?
 

Similar threads

后退
顶部