插入到ORACLE表中时,FireDAC“表或视图不存在” Delphi Belin 10.1 upd 2

问题描述 投票:0回答:1

我们正在将代码库从带有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参数,但它不起作用

我们该怎么办?

感谢您的帮助

oracle delphi sql-insert database-schema firedac
1个回答
0
投票

我了解的是,您最好使连接avoid使用任何架构名称,而不是指定它。另外,请记住,您已经在使用公共同义词。

因此,根据文档:

完整的对象名称

FireDAC支持完整的对象名称,其中包括目录和/或架构名称。

当为StoredProcName,TableName等指定了简短的对象名称时,它们将使用当前目录和/或模式名称扩展为完整的对象名称。要覆盖或避免使用当前目录和/或架构名称,请使用MetaCurCatalogMetaCurSchema连接定义参数。例如:

[Oracle_Demo]
 DriverID=Ora  
 ...
 MetaCurCatalog=*
 MetaCurSchema=*

〜来源:Object Names (FireDAC) - docWiki

MetaCurSchema

指定应用程序的当前架构。如果未指定,则将从DBMS接收其值。当应用程序要求元数据且未指定架构名称时,FireDAC将隐式使用当前架构。如果MetaCurSchema为'*',则从元数据参数中省略模式名称。

〜来源:Common Connection Parameters (FireDAC) - docWiki

该星号(*)应该可以解决问题,让我们知道是否是这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.