4

几年前,我用 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_NrSecondse 类型 (16) 导致了这种情况。

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

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

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

我希望有人可以帮助我了解导致 Firebird 3.0 和 4.0 之间行为不同的原因,并让我找到解决方案。

4

1 回答 1

2

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

Album_NrSeconds 的数据类型现在是 NUMERIC。

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

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

于 2021-12-23T06:20:06.937 回答