几年前,我用 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 作为服务时,有两件事我不明白。
- 使用我的应用创建 vew_AlbumDetails 时,为什么 Album_NrSecondse 的类型为 (16)?
- 当使用完全相同的代码手动添加视图时,为什么 Album_NrSecondse 类型为(双精度)?
Firebird 4.0 中是否存在导致这种奇怪行为的错误?或者我是否需要以某种方式调整我的代码?
我希望有人可以帮助我了解导致 Firebird 3.0 和 4.0 之间行为不同的原因,并让我找到解决方案。