我们正在将代码库从带有FireDAC 8.0.5的Delphi XE3迁移到带有FireDAC 15.0.1(内部版本86746)的Delphi Berlin 10.1 Upd 2。使用MS Sql Server一切都可以顺利进行,但是使用ORACLE已有一段历史了。
在整个应用程序源代码中,我们使用许多带有SQL指令的TAdQuery,例如
AdQuery1.Sql.Text := 'SELECT FIELD1, FIELD2 FROM TABLE1';
为了插入记录,我们使用Append或Insert方法,就像这样
AdQuery1.Insert;
//要么AdQuery1.Append;
仅在调用其Post方法之后,该组件内部创建了一个INSERT sql语句,如下所示:
INSERT INTO TABLE1 (FIELD1, FIELD2) VALUES(:FIELD1, :FIELD2)
所以记录被成功插入。
现在,在Delphi Berlin中使用TFdQuery,该组件在内部创建INSERT sql语句,如下所示
INSERT INTO USERNAME.TABLE1 (FIELD1, FIELD2) VALUES(:FIELD1, :FIELD2)
使用[FireDAC] [Phys] [Ora] ORA-00942:表或视图不存在失败
之所以这样,是因为在我们的Oracle数据库中,TABLE1是在名为MAIN_SCHEMA的模式中创建的,我们使用公共同义词来访问它。
[试图找到一种解决方法,我们比较了FireDAC源代码,发现了
在Delphi XE3中,单元uADDAptManager.pas在其函数TADDAptTableAdapter.GetUpdateRowCommand上,调用oConn.CreateCommandGenerator(oCmdGen, nil);
在Delphi Berlin中,其功能TFDDAptTableAdapter.GetUpdateRowCommand上的单元FireDAC.DApt.pas呼叫oConn.CreateCommandGenerator(oCmdGen, GetSelectCommand);
[只要第二个参数(称为ACommand:IFDPhysCommand)为not nil,则返回表名并连接用户名(在名为TFDPhysCommandGenerator.GetFrom的函数中)。
如果将'MetaCurSchema=MAIN_SCHEMA'
添加到TFdConnection参数中,它将与不使用池化连接的应用程序一起使用,但是我们有几个进程使用具有相同参数的池化连接,甚至是MetaCurSchema参数,但它不起作用
我们该怎么办?
感谢您的帮助
我了解的是,您最好使连接avoid使用任何架构名称,而不是指定它。另外,请记住,您已经在使用公共同义词。
因此,根据文档:
完整的对象名称
FireDAC支持完整的对象名称,其中包括目录和/或架构名称。
当为StoredProcName,TableName等指定了简短的对象名称时,它们将使用当前目录和/或模式名称扩展为完整的对象名称。要覆盖或避免使用当前目录和/或架构名称,请使用MetaCurCatalog和MetaCurSchema连接定义参数。例如:
[Oracle_Demo] DriverID=Ora ... MetaCurCatalog=* MetaCurSchema=*
〜来源:Object Names (FireDAC) - docWiki
MetaCurSchema
指定应用程序的当前架构。如果未指定,则将从DBMS接收其值。当应用程序要求元数据且未指定架构名称时,FireDAC将隐式使用当前架构。如果MetaCurSchema为'*',则从元数据参数中省略模式名称。
〜来源:Common Connection Parameters (FireDAC) - docWiki
该星号(*)应该可以解决问题,让我们知道是否是这种情况。