我真的不知道我哪里寫錯了,請各位幫忙看一下!(10分)

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

wchal

Unregistered / Unconfirmed
GUEST, unregistred user!
我有兩段代碼
一、
SQ:='select distinct TM from JGZLK where (JZ= :JZ)and(DATE1>= :D1)and(DATE2<= :D2)';
ADODataSet1.Close;
ADODataSet1.commandText:=SQ;
ADODataSet1.Parameters.ParamByName('JZ').Value:='ABC';
ADODataSet1.Parameters.ParamByName('D1').Value:=strtodate(datetostr(datetimepicker1.Date));
ADODataSet1.Parameters.ParamByName('D2').Value:=strtodate(datetostr(datetimepicker1.Date+1));
ADODataSet1.Open;
ShowMessage('數:'+inttostr(ADODataSet1.RecordCount));

二、
SQ:='select TM from YJJDK where (TM in(select TM from JGZLK where (JZ= :JZ)and(DATE1>= :D1)and(DATE2<= :D2)))';
ADODataSet1.Close;
ADODataSet1.commandText:=SQ;
ADODataSet1.Parameters.ParamValues['JZ']:='ABC';
ADODataSet1.Parameters.ParamValues['D1']:=datetimepicker1.Date;
ADODataSet1.Parameters.ParamValues['D2']:=datetimepicker1.Date+1;
ADODataSet1.Open;
ShowMessage('計:'+inttostr(ADODataSet1.RecordCount));

當程序啟動后,只要先執行過第一段再執行第二段,那麼第二段結果正確.
但如直接執行第二段結果就不對了.

為什麼啊?
 
报什么错呀1/?
 
你试试这个
SQ:='select TM from YJJDK where (TM in(select TM from JGZLK where (JZ= :JZ)and(DATE1>= :D1)and(DATE2<= :D2)))';
ADODataSet1.Close;
ADODataSet1.commandText:=SQ;
ADODataSet1.Parameters.ParamValues('JZ').value:='ABC';
ADODataSet1.Parameters.ParamValues('D1').value:=datetimepicker1.Date;
ADODataSet1.Parameters.ParamValues('D2').value:=datetimepicker1.Date+1;
ADODataSet1.Open;
ShowMessage('計:'+inttostr(ADODataSet1.RecordCount));
 
to:pgjeffrey
沒有報錯,只是統計來的數據不對.
如果執行了第一段之后再執行第二段就結果正確.
to:congcong19
這個我早試過結果一樣!

麻煩再想想辦法.
還有我在Query Analyzer中執行是沒有問題的.
 
二: 该为试试
SQ:='select TM from YJJDK where (TM in(select TM from JGZLK where (JZ= :JZ)and(DATE1>= :D1)and(DATE2<= :D2)))';
ADODataSet1.Close;
ADODataSet1.commandText:=SQ;
ADODataSet1.Parameters.ParamByName('JZ').Value:='ABC';
ADODataSet1.Parameters.ParamByName('D1').Value:=strtodate(datetostr(datetimepicker1.Date));
ADODataSet1.Parameters.ParamByName('D2').Value:=strtodate(datetostr(datetimepicker1.Date+1));
ADODataSet1.Open;
ShowMessage('計:'+inttostr(ADODataSet1.RecordCount));
注:相同的数据类型;第一可以过滤,第二没有过滤
直接执行第二,因没有过滤所以结果不对。

IN
确定给定的值是否与子查询或列表中的值相匹配。

语法
test_expression [ NOT ] IN
(
subquery
| expression [ ,...n ]
)

参数
test_expression

是任何有效的 Microsoft&amp;reg; SQL Server&amp;#8482; 表达式。

subquery

是包含某列结果集的子查询。该列必须与 test_expression 有相同的数据类型。

expression [,...n]

一个表达式列表,用来测试是否匹配。所有的表达式必须和 test_expression 具有相同的类型。




 
to:lt166
我最早就是第一段和第二段代碼都用了datetostr和strtodate結果和我現在用的是一樣
結果是0
至於相同的数据类型:
我的字段tm兩個表是一樣的.
(IN
确定给定的值是否与子查询或列表中的值相匹配。)一定匹配

麻煩大家再看看!


 
不加参数试试
 
to:lt66
只要在in 中不帶參數就可以.
其它地方用參數都沒問題.
真是好奇怪.我都不知道怎麼做?
 
[?][?][?]
真的是奇怪啊!
 
SQ:='select TM from YJJDK where (TM in(select TM from JGZLK where (JZ= :JZ)and(DATE1>= :D1)and(DATE2<= :D2)))';
ADODataSet1.Close;
ADODataSet1.commandText:=SQ;
ADODataSet1.Parameters.ParseSQL(SQ, True);

ADODataSet1.Parameters.ParamValues['JZ']:='ABC';
ADODataSet1.Parameters.ParamValues['D1']:=datetimepicker1.Date;
ADODataSet1.Parameters.ParamValues['D2']:=datetimepicker1.Date+1;
ADODataSet1.Open;
ShowMessage('計:'+inttostr(ADODataSet1.RecordCount));
 
to:amil
運行出錯,
提示:提供不一致或不完整的訊息導致出錯.

怎麼辦?
 
我的天啦!
说出来你们可能不会相信!
我加一个括号就结果正确了,真是不懂啊。
SQ:='select TM from YJJDK where (TM in([blue]([/blue]select TM from JGZLK where (JZ= :JZ)and(DATE1>= :D1)and(DATE2<= :D2))[red])[/red])';
ADODataSet1.Close;
ADODataSet1.commandText:=SQ;
ADODataSet1.Parameters.ParamValues['JZ']:='ABC';
ADODataSet1.Parameters.ParamValues['D1']:=datetimepicker1.Date;
ADODataSet1.Parameters.ParamValues['D2']:=datetimepicker1.Date+1;
ADODataSet1.Open;
ShowMessage('計:'+inttostr(ADODataSet1.RecordCount));

*********在第一句的in 后面加上(,然后在 ’; 前加个),
就可以了,真是不明白!

 
多人接受答案了。
 
后退
顶部