【发布时间】:2011-08-14 16:18:47
【问题描述】:
使用 Delphi 7、BDE 和 Oracle
我执行一个 SQL 选择语句,然后单步执行返回集的每条记录,并执行以下更新 sql
var
AQuery: TQuery;
begin
AQuery:= TQuery.Create(nil);
AQuery.DatabaseName:= ADatabase.DatabaseName;
with AQuery do
begin
SQL.Text:= 'UPDATE AP_Master SET CMCL_FORECAST_CLEARED=:AClearedDate WHERE ID=:AMasterId';
ParamByName('AMasterId').AsString:= IntToStr(AId);
ParamByName('AClearedDate').AsDateTime:= StrToDateTime(FormatDateTime('mm/dd/yyyy', AForeCastClearedDate));
try
ExecSql;
except on E: Exception do
begin
raise Exception.create('Error Updating AP_Master Tables Forecast Cleared Date!' + E.Message);
end;//except
end; //try
end; //with
AQuery.Close;
AQuery.Free;
end;
它适用于 forst 500 + 记录,但我得到一个:ORA-01000: maximum open cursors exceeded 消息
我需要在 BDE 端、oracle 端还是在我的代码中做些什么(我使用标准 TQuery 和 TDatabase 组件)
【问题讨论】:
-
您至少应该将 Close() 和 Free() 放在 try/finally 块中。但我不指望这能解决问题。
-
ParamByName('AMasterId').AsString:= IntToStr(AId);可以简单地写成 ParamByName('AMasterId').AsInteger:= AId;也许你可以对日期做同样的事情。为什么要获取日期,将其转换为字符串,然后获取该字符串并将其转换为日期?如果您只需要获取日/月/年部分,则有更好的方法(即 Trunc())。
-
@ldsandon:我得到了日期的东西,但错过了 IntToStr 。我已经在我的答案中更正了我的代码以反映这一点。谢谢。
-
另外,您是通过 BDE 使用 SQL 链接还是通过 ODBC 连接?如果 ODBC 是 Oracle ODBC 还是 Microsoft ODBC for Oracle?版本?