【问题标题】:Create custom driver for System.Data.Common为 System.Data.Common 创建自定义驱动程序
【发布时间】:2009-10-07 11:19:06
【问题描述】:

背景:

我们的 C# 应用程序生成并执行对多种类型的数据库(Oracle、SQL Server、MySQL)的查询,但也提出了将它们应用于专有文件格式的要求。

  1. 到目前为止使用的命名空间是 System.Data.Common。
  2. 我们需要应用的查询非常重要(嵌套的 SELECT、FROM 中的别名、子字符串方法和字符串连接)

我们最初将专有文件的内容转换为 CSV,为此存在驱动程序{Microsoft Text Driver (*.txt; *.csv)}。但是,客户端要求不生成临时文件,并且一切都应该在内存中进行。

创建一个 ODBC 驱动程序来直接查询文件似乎太耗时了。因此,我们正在考虑创建一个驱动程序(可能是 ODBC),我们将在其中“嵌入”SQLITE ODBC 驱动程序。在该驱动程序中,我们可以将 CSV 文件的内容加载到“内存”数据库中,然后将查询转发到内部 ODBC 驱动程序。

我的问题:

  1. 这个解决方案看起来可行吗?
  2. 为了从头开始创建 ODBC 驱动程序,我们应该从哪里开始?

谢谢

【问题讨论】:

    标签: c# .net database sqlite system.data


    【解决方案1】:

    客户端请求是奇怪的。总是会涉及到文件,您正在从文件中读取。

    如果他们希望他们的东西在内存中(又是一个奇怪的客户),请将 CSV 放到 RAM 磁盘上: http://members.fortunecity.com/ramdisk/RAMDisk/ramdriv001.htm

    如果您关心性能和稳定性,那么构建和 ODBC 驱动器是一项非常重要的工作。

    【讨论】:

    • 我也会这么建议的 :)
    【解决方案2】:

    如果可以使用 SQLite 作为后端,我真的不明白为什么您不能使用 ADO .NET 提供程序来访问您的 SQLite 数据库,例如 System.Data.SQLite


    根据您的评论,我认为您实际上是在为所有数据库连接 (System.Data.Odbc) 使用 ODBC ADO .NET 提供程序。如果您需要保持相同的方案,那么自定义 ODBC 提供程序是可行的方法(但它是纯 C 原生开发,我相信相当痛苦)。

    另一种方法是向您的数据库添加第三个参数(前两个是 SQL 和连接字符串):要使用的 ADO .NET 提供程序(例如 supposed to be done in configuration files,请参阅 @987654323 @ 属性)。这样您就可以使用任何可用的 ADO .NET 提供程序。

    然后您可以将 SQLite 提供程序包装到您自己的自定义 ADO .NET 提供程序中,这可能包括 SQLite DB 的生成和填充。此解决方案的优势:纯托管 .NET。

    【讨论】:

    • 整个想法是这样的:从桌面应用程序中,我们将 SQL 查询以及 ADO 连接字符串存储在数据库中。然后远程部署的 WS 在数据库中找到这两个,并执行查询。目前(不包括专有文件)使用什么提供者对 WS 是透明的。我们希望文件也是如此。因此,我们考虑创建一个 ODBC 驱动程序,其连接字符串包含文件的位置,并将“嵌入”SQLite DB 的生成和填充,并将接收到的查询和操作转发到内部 SDLite ODBC。
    • 我持怀疑态度:WS 不可能完全不知道将要使用的 ADO .NET 提供程序,因为必须在某个时候创建​​一个普通的数据库连接 (System.Data.Common. DbConnection 是抽象的)。请参阅我的答案以了解更多新进展。
    【解决方案3】:

    我认为您的解决方案很耗时。您可以为您正在尝试做的事情找到现有的解决方案。这里有几个替代品。

    为什么不试试 Linq to text/csv 文件?

    两种解决方案都在内存中。

    另一个想法是,您可以将文件导出为 xml 而不是 csv 或文本(当我必须在我的代码中处理时,我总是更喜欢导出到 xml)。比你使用 System.Xml 或 Linq to Xml 来执行操作。

    【讨论】:

    • 无论底层数据库是什么(SQL Server、MySQL、Oracle 和专有文件),我都需要执行完全相同的查询。因此,对于专有文件,我需要包含一个步骤,将其“转换”为可以执行 SQL 的形式。我不想创建 LINQ 查询。
    • 哦!我现在知道了。什么样的“专有文件格式”是?是二进制文件格式还是类似 xml 的文件(在大多数情况下都是如此)还是其他?
    • 它是一个非 xml 文本文件,类似于 CSV。它被称为 PC 轴,用于统计数据。一开始它包含元数据,然后是实际数据。
    【解决方案4】:

    如果你只被限制不能创建临时文件,你可以尝试使用 SQLite 的内存模式。这是它的连接字符串示例 (source):

    Data Source=:memory:;Version=3;New=True;
    

    在我看来,这比构建成熟的提供者要简单。$

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2013-04-08
      相关资源
      最近更新 更多