怪事(有关动态变量)(100分)

  • 主题发起人 主题发起人 2000888
  • 开始时间 开始时间
2

2000888

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ado+delphi+access:
adoquery1.close;
adoquery1.sql.Clear;
adoquery1.sql.Add('select * from ');
adoquery1.sql.Add('(select 学号,姓名,sum(迟到) as 迟到 ,sum(早退) as 早退,sum(旷操) as 旷操,sum(旷课) as 旷课,sum(迟到)*1/2+sum(早退)*1/2+sum(旷操)+sum(旷课) as 折算旷课 from b1');
adoquery1.sql.Add(' group by 学号,姓名)');
adoquery1.sql.Add(' where 折算旷课>=:cc1');
adoquery1.Parameters.ParamByName('cc1').Value :=21; //strtoint(edit1.Text);
open;
竟然查出“折算旷课”有大于21和[red]小于21的[/red]。(错误)

改成这样后:
adoquery1.close;
adoquery1.sql.Clear;
adoquery1.sql.Add('select * from ');
adoquery1.sql.Add('(select 学号,姓名,sum(迟到) as 迟到 ,sum(早退) as 早退,sum(旷操) as 旷操,sum(旷课) as 旷课,sum(迟到)*1/2+sum(早退)*1/2+sum(旷操)+sum(旷课) as 折算旷课 from b1');
adoquery1.sql.Add(' group by 学号,姓名)');
adoquery1.sql.Add(' where 折算旷课>=21');
//adoquery1.Parameters.ParamByName('cc1').Value :=21; //strtoint(edit1.Text);
open;
就只查出“折算旷课”大于21的(正确)
为什么用了动态变量就不对了呢?错在哪
 
没看出什么问题;

//你把SQL语句用一个字符串来试试看.
 
怪了,怎么会有这种现象?
不知道adoquery是否会进行参数检测?你在将21作为参数代入之前,先生成一下参数列表。
有时候这种问题是很怪,尤其是ado。
createparam
 
是不是参数问题:
strtoint(trim(edit1.Text));
 
我试过了,把库换成sqlserver就没这问题,怪了!!!
 
没人知道答案?!
 
是不是因为浮点数的原因
 
to ugvanxk:能不能说详细些
 
先简后繁。
 
可能是access的一个bug,sum(i)还是i的类型,但sum(i)+sum(u)就不是原来类型了,我试过
把“21”换成“aaa”后程序还能运行,只是查不到什么数据。不知有无办法解决这个问题
 
你的 1/2 ,是不是写成 0.5 更合适。
我不太明白你上面的意思,
如果你认为上面的bug存在,那么要改变类型,应该可以这样做:
sum(i+0.0)
 
察看cc1的数据类型,明确指定下来
 
adoquery1.Parameters.ParamByName('cc1').。。。只有value而没有asfloat或别的类型
 
ADO通过Microsoft.Jet.OLEDB.4.0直接连接Access时,使用Parameter形式表现异常
(如果参数是数字和日期型),不知是delphi的Bug还是Jet的Bug.

修改来使用 SQL ODBC Brige 通过ODBC访问问题可能就解决了,和程序无关。
 
哪还有人用odbc,现在都用ado了
 
后退
顶部