有人知道如何在不使用 KBSQL -ODBC 的情况下使用 C# 从 MUMPS 数据库中查询吗?
我们需要从 MUMPS 数据库(Mckesson STAR Patient care)查询,当我们使用 KBSQL 时,它仅限于 6 个并发用户。所以我们尝试不使用 KBSQL 直接查询 MUMPS。
我期待像 LINQ TO MUMPS 这样的东西。
I think Mckesson uses Intersystems' Cache as its mumps (M) provider. Cache has support for .Net (see the documentation here). Jesse Liberty has a pretty good article on using C#, .Net and Windows Forms as the front end to a Cache database.
I'm not sure about LINQ (I'm no expert here), but this might give you an idea as to where to start to get your project done.
Michael
您可以通过将数据库连接与应用程序实例分开来避免 6 个用户的限制
通过中间层(应用程序中的 DAL)或单独的服务(Windows 服务)使用 KB/SQL ODBC。
该组件最多可以使用 6 个单独的线程与 MUMPS 数据库通信(符合 KB/SQL 限制)。
该组件可以使用 ADO.NET for ODBC 与 KBSQL ODBC 驱动程序进行通信。然后,您可以使用 LINQ for ADO.NET 使用应用程序中的数据。
您可能需要使用像 MSMQ 这样的排队系统来管理数据请求的排队。如果 6 个并发连接不足以满足请求量。将请求排队并使用 LINQ 异步调用以避免阻塞用户交互是一种很好的设计实践。
首先,我也感受到你的痛苦。几年前我有过在 MagicFS/Focus 中开发的不幸经历,我们对关系查询支持有完全相同的要求。为什么人们总是想要他们得不到的东西?
无论如何,如果您使用的 MUMPS 版本类似于 MagicFS/Focus,并且您可以访问保存“数据库”(平面文件)的文件系统,那么一种可能的途径是:
将平面文件导出为 XML 文件。为此,您必须使用 MUMPS 或您选择的语言从平面文件中手动发出 XML。听起来很痛苦,但 MUMPS 可能是要走的路,因为您可能不想手动确定当前记录。
使用LINQ to XML读入XML
运行 LINQ 查询。
诚然,第一步说起来容易做起来难,如果您尝试动态构建 XML 文件,可能会更加困难。对此的一种变体是通过夜间服务器进程等管理 XML 文件(如索引)的生成。
如果您只想以特定方式查询(即我想在 ID 上加入 Foo 和 Bar 表,这就是我想要的),我会考虑将数据拉取并缓存到服务器端 C# 集合中,并跳过查询完全(或使用 WCF 或类似方法将它们拉过来,然后进行 LINQ 查询)。
所有当前的 MUMPS 语言实现都能够指定响应 TCP/IP 连接的 MUMPS 程序。原生 MUMPS 数据库的结构是有序的多键和值对的层次结构,本质上是 NoSQL 范式的超集。
KB/SQL 是一组程序,它们响应 SQL/ODBC 查询,将它们翻译成这个 MUMPS“全局”数据查询,从 MUMPS 检索和合并结果,然后以 SQL/ODBC 协议的形式发回数据预计。
如果您的实现具有允许您创建和运行 MUMPS 程序(称为“例程”)的权限/安全授权,那么您可以响应您希望从这些程序中获得的任何协议。MUMPS 系统可以在 TCP/IP 端口或主机操作系统文件上生成文本或二进制结果。许多供应商在提供医疗保健和金融解决方案的合同中明确禁止您这样做。
据我所知,LINQ 语法是 Microsoft 的专有产品,尽管肯定有类似 LINQ 的开源工作。我还没有看到 LINQ 线路协议的任何正式定义,但如果有,可以编写一个 MUMPS 例程来使用该协议进行通信。然而,它必须做一些类似于 KB/SQL 的事情,因为 LINQ 语法和 SQL 语法都不是非常接近本机 MUMPS 语法。
MUMPS 数据结构化和存储机制可以机械地转换为 XML 语法。这可能仍然需要大量的工作,因为您的系统供应商极不可能提供为这种机械创建的 XML 语法定义的 DTD,并且您仍然必须处理存储在基于 MUMPS 的系统中的编码值和引用以原始形式。
您使用的是哪个供应商和版本的 MUMPS?该解决方案无疑将取决于他们公开的供应商的 api。