2011-04-28 14 views
3

用Delphi 7,BDE和OracleORA-01000:最大打开的游标超出

我执行SQL SELECT语句,然后通过各自的返回set的记录步骤,并执行以下更新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; 

它的工作原理为福斯特500分+的记录,但后来我得到一个:ORA-01000:最大打开的游标超出消息

有什么我需要在BDE侧做,Oracle方面,或在我的代码(使用标准TQuery和TDatabase组件的Im)

+1

你看过http://mail.dir.bg/~radoslav.rusinov/Blog/How.to.Cope.with.an.ORA-01000.Error-v.2.1。 pdf? – SimaWB 2011-04-28 12:26:29

+1

你至少应该把Close()和Free()放在try/finally块中。但我不认为这会解决问题。 – 2011-04-28 12:28:15

+0

ParamByName('AMasterId')。AsString:= IntToStr(AId);可以简单地写成ParamByName('AMasterId')。AsInteger:= AId;也许你可以在日期上做同样的事情。为什么获取日期,将其转换为字符串,然后获取该字符串并将其转换为日期?如果您只需要获得日/月/年的部分,则有更好的方法(即Trunc())。 – 2011-04-28 15:00:51

回答

2

您关闭查询的地方不正确,这意味着您对每行都是孤儿游标。试试这个:

var 
AQuery: TQuery; 
begin 
    AQuery:= TQuery.Create(nil); 
    try 
    AQuery.DatabaseName:= ADatabase.DatabaseName; 

    with AQuery do 
    begin 
     SQL.Text:= 'UPDATE AP_Master'#13 + 
       'SET CMCL_FORECAST_CLEARED = :AClearedDate'#13 + 
       'WHERE ID= :AMasterId'; 
     ParamByName('AMasterId').AsInteger := AId; 
     // Note the date->string->date is not necessary; setting the param 
     // AsDateTime with a TDateTime value will format it correctly for you. 
     ParamByName('AClearedDate').AsDateTime:= AForeCastClearedDate; 

     try // Protect open 
     try 
      ExecSql; 
      except 
      on E: Exception do 
      raise Exception.create('Error Updating AP_Master Tables' + 
            ' Forecast Date Cleared' + 
            E.Message); 
      end;//except 
     end; // except try 
     finally 
     AQuery.Close; // finally means it's closed every time always 
     end; //finally try for opening 
    end; //with 
    finally 
    AQuery.Free; // finally here ensures free 
    end; 
end; 
+0

不正确。我上面发布的代码是一个例程。我通过select sql返回集循环,调用每条记录的例程。所以,如果你看看我上面发布的代码,对于select中的每个记录,上面的代码被调用(或者调用该例程)。查询被创建,执行,关闭和释放,循环转到select语句中的下一条记录并执行例程(上面的代码)。 – IElite 2011-04-28 13:05:50

+1

Shane,在发表评论之前,你有没有试过Ken的答案?我相信这是解决您的问题的方法。顺便说一下,Except之后的代码将不会执行。 – RBA 2011-04-28 13:12:37

+1

然后,您未能发布显示它是函数/过程的代码部分。 (你的问题也没有提及这一点。)“遍历返回集合的每条记录并执行下面的更新sql” - 这看起来像是一个循环给我,并且没有任何其他方式知道我的答案是基于。 – 2011-04-28 13:13:24

相关问题