视图创建在 Firebird 3.0 中有效,但在 4.0 版中无效

View creation works in Firebird 3.0 but not in version 4.0

几年前,我用 C++ (Code::Blocks + wxWidgets + SQLAPI++) 创建了一个音乐数据库应用程序,并将 Firebird 作为数据库服务器(运行 作为经典模式下的服务) 在 Windows 平台 (v10) 上。它创建了一个包含表、视图、触发器、生成器的 SQL 数据库。

到目前为止,它已 运行 完美升级到 Firebird 3(最新版本)。现在Firebird 4.0出来了,我想我试试看。

为了缩小问题范围,我创建了一个新应用程序,它只创建数据库、表、触发器、生成器,并且只创建 2 个视图,这些视图集中在问题区域。

我在测试应用中使用的 vew_AlbumDetails 代码是:

CREATE VIEW vew_AlbumDetails (Album_Name, Album_NrSeconds)
AS
SELECT b.Album_Name, SUM(a.NumberOfSamples/NULLIF(b.SampleRate,-1))
FROM tbl_Tracks a
INNER JOIN tbl_AlbumNames b ON a.AlbumName_ID = b.ID
GROUP BY b.Album_Name
ORDER BY b.Album_Name;

我在测试应用中使用的 vew_ReportDetails 代码是:

CREATE VIEW vew_ReportDetails (Album_Name, Album_NrSeconds)
AS
SELECT b.Album_Name, a.NumberOfSamples/NULLIF(b.SampleRate,-1)
FROM tbl_Tracks a
INNER JOIN tbl_AlbumNames b ON a.AlbumName_ID = b.ID
ORDER BY b.Album_Name;

当我使用 Firebird 3 运行 创建数据库作为服务,并在 FlameRobin 中打开它时,一切正常。在 VIEW vew_AlbumDetails 中,Album_NrSeconds 类型是 BIGINT。 (见下图)

当我使用 Firebird 4 运行 创建数据库作为服务,并在 FlameRobin 中打开它时,一切都不正常。在 VIEW vew_AlbumDetails 中,Album_NrSeconds 类型是 (16)。 (见下图)

在 VIEW vew_ReportDetails 中,Album_NrSeconds 类型是 BIGINT。没关系(见下图)

在 FlameRobin 中,我还手动添加了一个新视图 (vew_Manual_Added_View),其代码与 vew_AlbumDetails 相同(名称除外)。代码如上图所示。

奇怪的是 Album_NrSeconds 的类型现在是 DOUBLE PRECISION 而不是 Firebird 4 服务下的 (16) 或 Firebird 3 服务下的 BIGINT。

当 运行 Firebird 4 作为服务时,我的问题如下:

我的音乐应用创建数据库时没有错误,但 vew_AlbumDetails、Album_NrSeconds 类型为 (16)。当 vew_AlbumDetails 用于显示已存储相册的概览时,它会在没有任何错误消息的情况下崩溃。 Album_NrSeconds类型 (16) 导致此问题。

将 Firebird 4 作为服务使用时,有两件事我不明白。

  1. 为什么在使用我的应用程序创建 vew_AlbumDetails 时 Album_NrSecondse 类型为 (16)?
  2. 为什么使用完全相同的代码手动添加视图时 Album_NrSecondse 类型为(双精度)?

Firebird 4.0 中是否存在导致这种奇怪行为的错误?或者我是否需要以某种方式调整我的代码?

我希望有人能帮助我理解是什么导致了 Firebird 3.0 和 4.0 之间的不同行为,并让我找到解决方案。

我已将 'DataTypeCompatibility = 3.0' 添加到 databases.conf 和 firebird.conf。

Album_NrSeconds 的数据类型现在是 NUMERIC。

经过这 2 次编辑后,我的应用程序作为服务在 Firebird 4.0 下完美运行。

感谢 Mark Rotteveel 的建议。非常感谢。