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

时间:2009-10-07 11:19:06

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

背景:

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

  1. 到目前为止使用的命名空间是System.Data.Common。
  2. 我们需要应用的查询非常重要(嵌套的SELECT,FROM中的别名,子串方法和字符串连接)
  3. 我们最初将专有文件的内容转换为CSV,其中存在驱动程序 {Microsoft Text Driver(* .txt; * .csv)} 。但是,客户端要求不生成临时文件,并且所有内容都应该在内存中发生。

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

    我的问题:

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

4 个答案:

答案 0 :(得分:2)

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

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

如果您关心性能和稳定性,构建和ODBC驱动器是一项非繁琐的工作。

答案 1 :(得分:1)

我认为您的解决方案非常耗时。您可以找到您尝试执行的现有解决方案。这里有几个替补。

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

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

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

答案 2 :(得分:1)

如果使用SQLite作为后端是可能的,我真的不明白为什么你不能使用ADO .NET提供程序到你的SQLite数据库,如System.Data.SQLite


从您的评论中,我认为您正在使用ODBC ADO .NET提供程序进行所有数据库连接(System.Data.Odbc)。如果你需要保持相同的方案,那么自定义ODBC提供程序就是可行的方法(但那时它是普通的C本机开发,而且我相信很痛苦。)

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

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

答案 3 :(得分:0)

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

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

在我看来,这比建立成熟的提供商简单。$