将 Gupta 的 SQLBase 移植到另一个系统

Porting SQLBase by Gupta to another system

提问人:temuco 提问时间:9/19/2023 更新时间:9/20/2023 访问量:105

问:

我们使用 SQLBase 进行各种版本的开发,包括 12.2。我们的主要应用程序是 Team Developer 应用程序(版本 7.5),它利用 SQLBase 作为其数据库。

除了 Team Developer,我们还使用 C# (.NET Core) 进行编程。我们对 SQLBase 仍然不提供实体框架支持这一事实感到非常困扰。这意味着我们必须使用 C# 应用程序中的旧 ADO.NET 访问数据库。

问题在于,我们在 Team Developer 7.5 中拥有大量代码,这使得简单地交换数据库变得不那么简单。另一方面,我们不想继续使用 ADO.NET 进行开发,而是使用 Entity Framework。

如果我们决定替换数据库,那么就出现了如何从 Team Developer 访问它而不必修改太多程序代码的挑战。

我们需要做些什么才能在 Team Developer 7.5 中使用另一个数据库,如 MySQL、MariaDB、Postgre 或 MS SQL Server?这样,我们最终可以使用实体框架从 .NET 访问数据库,同时仍然使用现有的 Team Developer 代码。

谢谢

勒内

mysql sql-server mariadb guptateamdeveloper sqlbase

评论

1赞 siggemannen 9/19/2023
We're quite bothered by the fact that SQLBase still doesn't offer Entity Framework support.你确定这是一件坏事吗
0赞 temuco 9/19/2023
是的,如果需要与 Team Developer 一起在 .NET 环境中开发软件。
0赞 Steve Leighton 9/21/2023
对不起,Temuco - 不同意。当然,实体框架可能没问题(我不知道),但是OLEdB对大多数dBMS供应商都很好(如果你选择SqlServer,请使用MSOLEDBSQL驱动程序,而不是旧的SQLOLEDB),并且Team Developer处理得很好。它快速而坚固。只需将连接字符串分配给 SqlUDL 变量(或 UDL 文件路径),即可使用。您根本不需要 SQL.ini,也不再需要 SqlUser、SqlPassword 或 SqlDatabase。
0赞 temuco 9/21/2023
好吧,在 C# 应用程序中,我使用 ADO.NET,这就是重点。我想在这里使用新式 Entity Framework Core。我至少节省了 40% 的程序代码,寻址列时的典型错误已成为过去。我有完整的 Intellisense 支持。我不必担心参数的类型,我可以自始至终使用 LINQ。这些程序变得更加强大,并且完成得更快。

答:

0赞 Steve Leighton 9/20/2023 #1

我绝不隶属于 Gupta 或 SQLBase 或任何其他 dBMS 供应商,但在从 SQLBase 降级之前,请三思而后行。

我们现在正在经历这个难题。不是因为实体框架的事情(OLEdB 与 SQLBase 或 SQLServer 一起针对 TeamDeveloper、C# 或其他任何东西都可以正常工作),也不是因为 Gupta SQLBase 存在任何问题(事实上,它在某些情况下优于 SQLServer。
但仅仅因为企业在他们的智慧中说“一切都必须标准化”。

因此,不情愿地开始了迁移 120Gb SQLBase 的 l-o-n-g 过程,该过程运行良好,其所有存储的过程、触发器、索引、FK、100 个内置@functions、关键字(SYSDATETIME ...)到 SQLServer - 再次针对大型 Gupta TeamDeveloper 代码库。

你说得很对 - 简单地换出数据库并不那么简单。 将 SQLBase v12.3 迁移到 SQLServer 2019 意味着大量的工作。
主要需要注意的是:

  1. 数据类型的格式略有不同,例如 TIME 和 LONG,因此不是直接的同类。
  2. 在 INSERT 触发器之前。只有 SQLBase 才能正确管理这一点。很难找到等价物。最重要的是,“行级”和“语句”级类型。好!SQLBase 在插入触发器之前
  3. ETL。除非您使用某种向导(如 SQLServer 导入/导出向导)来在某种程度上帮助导出/传输/加载,否则您会发疯的。
  4. 罗伊德。没有 dbms 像 SQLBase 那样具有 ROWID。因此,如果你的应用使用 ROWID,请准备好在这方面做一些工作。如果迁移到 SQLServer,最相似的是 ROWVERSION,它是一个二进制 (8) 数字,它跟踪 dB 内的相对时间,而不是实际时间。因此,在整个TD代码中,您可能需要转换 例如

选择 ROWID:

Return VisStrChoose( gGetBrand(  ) = DBV_BRAND_MSSQL,
    'CONVERT(VARCHAR(MAX), CONVERT(BINARY(8),' || p_sROWIDColName || '), 2 )', 
     p_sROWIDColName )

其中 ROWID:

Return VisStrChoose( gGetBrand(  ) = DBV_BRAND_MSSQL,
    'CONVERT(binary(8),\'0x\' + :' || p_sROWIDBindName || ' , 1)', ':' || 
     p_sROWIDBindName  ) 

在完成整个 ETL 和 TD 代码修改过程后,最好的建议是三思而后行,然后三思而后行,反对从 SQLBase 迁移。我只是无法证明成本、压力和风险与(无)性能提升、交换连接(当 OLEdB 完成工作时)是合理的。但毫无疑问,我想会有其他人有不同的想法。

0赞 temuco 9/20/2023 #2

谢谢你的详细回答,史蒂夫。

我明白你的意思。特别是 ROWID 给我们带来了精神上的问题,因为我们广泛使用它。但是,我想知道如何从 Team Developer 处理另一个 SQL 数据库。你是怎么做到的?

围绕 Team Developer,我们还有许多其他在 .NET 上运行的附属应用程序 - 这里我指的是 C# 和 .NET Core。这些应用程序不能使用 Team Developer 开发,或者只能通过很大的努力来开发。

现在,这些应用程序需要访问 SQLBase,我们一直在通过 ADO.NET 来访问。它有效,但你觉得你回到了史前。有了 Entity Framework,情况就不同了:您至少节省了 40-50% 的程序代码,开发速度要快得多,而且您不再会从一开始就犯许多错误,而这些错误在 ADO.NET 下经常发生。因此,应用程序不仅开发速度更快,而且更加健壮。

更糟糕的是,Team Developer 仍然不支持 .NET Core,因此如果您需要使用 .NET 开发 DLL,则必须回退到旧的 4.8(或 4.7?)框架。

对于如此昂贵的产品来说,这实在是太多了。

如果我们有一个同时支持 Team Developer 和 Entity Framework Core 的 SQL 数据库,我们的开发人员生活会看起来会好得多,家人也会很高兴。

评论

0赞 Steve Leighton 9/20/2023
如果还没有,建议您加入我们的“团队开发人员 SQLWindows 社区论坛”forum.tdcommunity.net/index.php(注册后,您将获得更多选项)。您将获得比此处更多的TD专业知识/建议。
0赞 Steve Leighton 9/21/2023
当然,实体框架可能没问题(我不知道),但是OLEdB对大多数dBMS供应商都很好(如果你选择SqlServer,请使用MSOLEDBSQL驱动程序,而不是旧的SQLOLEDB),并且Team Developer处理得很好。它快速而坚固。只需将连接字符串分配给 SqlUDL 变量(或其中的 UDL 文件路径),即可。您根本不需要 SQL.ini,也不再需要 SqlUser、SqlPassword 或 SqlDatabase
0赞 temuco 9/21/2023
我的(过时的)知识告诉我,从TD到其他数据库系统的访问是通过ODBC进行的。如果可以用其他东西来完成,那就太好了。MySQL、Postgre 和 MariaDB 呢?
0赞 Steve Leighton 9/22/2023
我相信它们都支持OLEdB - Microsoft现在正在为未来的版本开发更多增强功能,以支持ODBC。最新版本的 SQLServer OLEdB 比 ODBC 快。TD与OLEdB配合得很好。
0赞 temuco 9/22/2023
好的,非常感谢。如果是这种情况,剩下的“唯一”就是在其他 RDBM 中复制 ROWID。这可能是我们面临的最大挑战。当然,我们有一个或另一个必须重写的 SQL 命令,但即使这样也应该是有限的。如果 SQLBase 支持实体框架,则不需要这些。这甚至在 2019 年宣布了 12.3 版——今天没有人想知道它!右侧第 15 页:公告版本 12.3 – 实体框架