一个简单的关于TQuery的参数的问题.大家帮忙看看(30分)

  • 主题发起人 主题发起人 DelphiBB
  • 开始时间 开始时间
D

DelphiBB

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个query里有:
SELECT Liverecord.RecordIdx, Roomgrade.GradeName, Liverecord.RoomNo, Liverecord.UserIdx, Userinfo.Name AS UserName, Userinfo.SexMale, Userinfo.Partners, Liverecord.LoginDate, Liverecord.WaiterID, Waiterinfo.Name AS WaiterName, Roominfo.RoomTel
FROM LiveRecord Liverecord, RoomInfo Roominfo, UserInfo Userinfo, WaiterInfo Waiterinfo, RoomGrade Roomgrade
WHERE (Roominfo.RoomNo = Liverecord.RoomNo)
AND (Roominfo.GradeNo = Roomgrade.GradeNo)
AND (Liverecord.UserIdx = Userinfo.UserIdx)
AND (Liverecord.WaiterID = Waiterinfo.WaiterID)
AND (Liverecord.InUse = TRUE)
Order By :Order;


在程序用有一菜单,动态替换Order 参数
比如:
procedure TMainForm.ActionByLogInDateExecute(Sender: TObject);
begin
with DATA.QueryMain do
begin
close;
ParamByName('Order').Value :='LiveRecord.LoginDate';
Open;
OrderLabel.Caption:='按日期排序';
end;

end;

procedure TMainForm.ActionByRoomNoExecute(Sender: TObject);
begin
with DATA.QueryMain do
begin
Close;
ParamByName('Order').AsString :='Liverecord.RoomNo';
Open;
OrderLabel.Caption:='按房间排序';
end;

end;

procedure TMainForm.ActionByDefaultExecute(Sender: TObject);
begin
with DATA.QueryMain do
begin
Close;
ParamByName'Order').AsString :='Liverecord.RecordIdx';
Open;
OrderLabel.Caption:='按默认排序';
end;

end;



为什么我在改变Order后数据没有照我希望的去派学?

还有一个问题就是如何用InsertRecord中的自增字段?
 
重新构造SQL语句试试
procedure TMainForm.ActionByLogInDateExecute(Sender: TObject);
begin
with DATA.QueryMain do
begin
close;
sql.clear;
sql.add('SELECT Liverecord.RecordIdx, Roomgrade.GradeName, Liverecord.RoomNo, Liverecord.UserIdx, Userinfo.Name AS UserName, Userinfo.SexMale, Userinfo.Partners, Liverecord.LoginDate, Liverecord.WaiterID, Waiterinfo.Name AS WaiterName, Roominfo.RoomTel ');
sql.add('FROM LiveRecord Liverecord, RoomInfo Roominfo, UserInfo Userinfo, WaiterInfo Waiterinfo, RoomGrade Roomgrade ');
sql.add('WHERE (Roominfo.RoomNo = Liverecord.RoomNo)');
sql.add(' AND (Roominfo.GradeNo = Roomgrade.GradeNo)');
sql.add(' AND (Liverecord.UserIdx = Userinfo.UserIdx)');
sql.add(' AND (Liverecord.WaiterID = Waiterinfo.WaiterID)');
sql.add(' AND (Liverecord.InUse = TRUE)');
sql.add(' Order By LiveRecord.LoginDate');
open;
OrderLabel.Caption:='按日期排序';
end;
 
同意DJ
你的错误在于ORDER BY 后应该跟字段名称,你提供的是字段的数值
可以用SQL MONITOR看看
 
不是吧,看仔细点,我给参数赋的是字段名呀!LiveRecord.RecordIdx是LiveRecord的Recordidx字段!!!
还有,如果怎样重新构造,我还不如保存到文件或者Format它呢!
 
1、DJ的方法是正确的,原因是 TQuery的Param必须是一种类型。ParamByName('Order').AsString
是一个字符串,SQL解释为 order by "XXXX",因此SQL并不认为 "XXXX"是一个字段。所以我一直都
是用 SQL.add('____')语句来解决此问题。
2、query.open;
query.Requestlive:=true;
query.insertRecord([FieldName1,FieldName2,......]);
 
更正2:
2、query.open;
query.Requestlive:=true;
query.insertRecord([value For FieldName1,value For FieldName2,......]);
 
To Jonseen:
关于第一个问题的答案可以接受了,那么第二个问题中
我是想知道表中的自增字段在InsertRecord中是怎么填的,你说的真是
InsertRecord怎么用.嘻嘻,而且我也没有说一定是TQurey中.
 
没明白你说的自增字段是什么意思。如果是象sql中的indentity的列,象paradox中
的自增字段一样的话,则insertrecord的时候不需要把这个字段加入。比如。一表,id和
name两个字段,id是自增字段,insert语句只需要写:
insert into tablename (name ) values (' ')
回答你的第一个问题:
var
str,stradd: string;
begin
if ......then
stradd:='LiveRecord.LoginDate'
else....
stradd:='Liverecord.RecordIdx'
else....
stradd:='Liverecord.RoomNo';

str:='SELECT Liverecord.RecordIdx, Roomgrade.GradeName, Liverecord.RoomNo, '+
'Liverecord.UserIdx, Userinfo.Name AS UserName, Userinfo.SexMale, '+
'Userinfo.Partners, Liverecord.LoginDate, Liverecord.WaiterID, '+
'Waiterinfo.Name AS WaiterName, Roominfo.RoomTel '+
'FROM LiveRecord Liverecord, RoomInfo Roominfo, UserInfo Userinfo, '+
'WaiterInfo Waiterinfo, RoomGrade Roomgrade '+
'WHERE (Roominfo.RoomNo = Liverecord.RoomNo) '+
'AND (Roominfo.GradeNo = Roomgrade.GradeNo) '+
'AND (Liverecord.UserIdx = Userinfo.UserIdx) '+
'AND (Liverecord.WaiterID = Waiterinfo.WaiterID) '+
'AND (Liverecord.InUse = TRUE) '+
'Order By '+stradd;

with query1 do
begin
close;
sql.clear;
sql.add(str);
open;
end;

end;
 
自增是指比如Access中AutoInc类型的字段
我是说用TTable的InsertRecord时如何处理这种类型的字段,不是要SQL。

另外,DJ说的恐怕也不对吧,我看到很多书上一样照样
是对ParamByName(‘xxx’)。AsString:=S;//s是String类型变量;

 
DelphiBB:
1。 本地库:table1.insertrecord([nil,value1,value2,.....]);Autoinc的字段赋nil;
Oracle: 请建立table的Sequences后赋Sequences的值给相应的字段。
2。 ParamByName(‘xxx’).AsString:=S 用在 fieldName=:value是正确的.你有没有看到过
如 group by :fieldName和order by :fieldName的例子? 如果出现以上情况应该是错误的。如果有
的话请告诉我书名.



 
虽然其他人都说出了答案,但是Jonseen的答案才说明白了。分数不多,就全给Jonseen吧
 
后退
顶部