C# 为System.Data.Common创建自定义驱动程序

C# 为System.Data.Common创建自定义驱动程序,c#,.net,database,sqlite,system.data,C#,.net,Database,Sqlite,System.data,背景: 我们的C#应用程序生成并执行对几种类型的数据库(Oracle、SQL Server、MySQL)的查询,但也需要将它们应用于专有文件格式 迄今为止使用的名称空间是System.Data.Common 我们需要应用的查询非常重要(嵌套选择、FROM中的别名、子字符串方法和字符串连接) 我们最初将专有文件的内容转换为CSV,其中存在驱动程序{Microsoft文本驱动程序(*.txt;*.CSV)}。但是,客户机要求不生成临时文件,所有操作都应该在内存中进行 创建直接查询文件的ODBC驱动程

背景:

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

  • 迄今为止使用的名称空间是System.Data.Common
  • 我们需要应用的查询非常重要(嵌套选择、FROM中的别名、子字符串方法和字符串连接)
  • 我们最初将专有文件的内容转换为CSV,其中存在驱动程序{Microsoft文本驱动程序(*.txt;*.CSV)}。但是,客户机要求不生成临时文件,所有操作都应该在内存中进行

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

    我的问题是:

  • 这个解决方案可行吗
  • 为了从头开始创建ODBC驱动程序,我们应该从哪里开始

  • 谢谢

    我认为您的解决方案很耗时。您可以为您正在尝试的工作找到现有的解决方案。这里有几个备选方案

    为什么不尝试Linq到text/csv文件

    两种解决方案都在内存中


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

    如果您仅限于不创建临时文件,则可以尝试使用SQLite的内存模式。下面是它()的连接字符串示例:


    在我看来,这比构建完整的提供程序要简单。$

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


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

    另一种方法是向DB中添加第三个参数(前两个是SQL和连接字符串):要使用的ADO.NET提供程序(就像它一样,请参见
    providerName
    属性)。这样,您就可以使用任何可用的ADO.NET提供程序


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

    客户端请求很奇怪。始终会涉及到文件,您正在从文件中读取

    如果他们想将自己的东西存储在内存中(同样是一个奇怪的客户),请将CSV放在RAM磁盘上:


    如果您关心性能和稳定性,那么构建和使用ODBC驱动器是一项非常简单的工作

    无论底层数据库是什么(SQL Server、MySQL、Oracle和专有文件),我都需要执行完全相同的查询。因此,对于专有文件,我需要包括一个步骤,将其“转换”为可以执行SQL的形式。我不想创建LINQ查询。噢!我现在明白了。什么是“专有文件格式”?它是二进制文件格式还是类似xml(大多数情况下都是这样)还是其他格式?它是一个类似CSV的非xml文本文件。它被称为PC轴,用于统计数据。一开始它包含元数据,然后是实际数据。整个想法是这样的:从桌面应用程序中,我们在数据库中存储SQL查询以及ADO连接字符串。然后,远程部署的WS在DB中找到这两个,并执行查询。目前(不包括专有文件),它对WS-what提供者是透明的。我们希望这些文件也是如此。因此,我们考虑创建一个ODBC驱动程序,其连接字符串包含文件的位置,并将“嵌入”SQLite DB的生成和填充,并将接收到的查询和操作转发给内部SDLite ODBC。我怀疑:WS不能完全不知道将要使用的ADO.NET提供程序,因为必须在某个点创建普通数据库连接(System.Data.Common.DbConnection是抽象的)。更多新的发展,请参见我的答案。我也会建议:)
    Data Source=:memory:;Version=3;New=True;