怪事!怪事!怪事!(48分)

  • 主题发起人 主题发起人 txyx
  • 开始时间 开始时间
T

txyx

Unregistered / Unconfirmed
GUEST, unregistred user!
var s:string;
begin
s:=combobox2.Items.Strings[combobox2.itemindex]
+combobox3.Items.Strings[combobox3.itemindex]
+edit5.Text;
try
Adotable1.Filtered:=false;
Adotable1.Filter:=s;
Adotable1.Filtered:=true;
except
showmessage('条件错误!');
Adotable1.Filtered:=false;
end;
end;
其中,combobox2是字段选择,combobox3是条件选择(>=<)
有一个表:Adotable1, 字段:姓名(文本类型),日期(短日期),
金额(货币).大家都知道上面这段简单程序是干什么的了吧!!

怪事来了,字段选择如果是“日期","金额",程序显示没有问题;
但是是"姓名"的话,就总是一句'条件错误!'

我的程序编译时有一句:Invalid variant type conversion
是不是和它有关??
 
在前面增加''''+edit5.Text+'''';
因为姓名字段是字符型的。
 
《姓名字段是字符型的。
字符类型有什么问题吗?和文本类型有什么区别?
《我的程序编译时有一句:Invalid variant type conversion
我还是不明白哪里错了??
 
filter是什么? filter就是sql语句中where后面的查询条件,如果你想查找名字叫abc的人,
sql语句是不是应该写成
select * from table1 where Name='abc'
~~~~~~~~~~~
而下面的sql语句
select * from table1 where Name=abc 就是错误的.
所以正确的filter就是应该象yzhshi所说的那样,加'''',这样你的filter就是
Name='abc',而不是Name=abc.
而货币,整数等类型因为在sql中本来就是不需要'号的,例如
select * from table1 where age=30 -- 查询年龄为30岁的人

关于字符串作为where后面的条件,有一个例外,例如有个人叫'700',
然后你的sql语句(filter一样)为
select * from table1 where name=700
如果你用的是sql server可以成功,但是这是因为sql server中数值形的字符串和数值
是混用的,所以这是一个例外.作为规范的使用,还是应该写sql为
select * from table1 where name = '700'
 
你可以试试这样:
begin
try
with ADODataSet1 do begin
Filtered := False;
Filter := trim(combobox2.Items.Strings[combobox2.itemindex])
+ trim(combobox3.Items.Strings[combobox3.itemindex])
+ QuotedStr(trim(edit5.Text));
Filtered := True;
end;
except
showmessage('条件错误!');
Adotable1.Filtered:=false;
end;
end;

另外:Filter我好象还没碰到过能对日期比较,金额的话最好先转换成数字,以免以外。
其实这些都可以在TDataSet.OnFilterRecord里完成,就是比较罗嗦点。
trim是我的个人习惯,也是为了防止以外。
如果可以,请告诉我,上述代码我没试过,因为一直这么用。
 
to lar mer
你的方法trim没有错;
日期也是能比较的;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
551
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部