Создайте собственный драйвер для System.Data.Common.
-
20-09-2019 - |
Вопрос
Фон:
Наше приложение C# генерирует и выполняет запросы к нескольким типам баз данных (Oracle, SQL Server, MySQL), но возникла необходимость применить их и к собственному формату файлов.
- До сих пор использовалось пространство имен System.Data.Common.
- Запросы, которые нам нужно применить, нетривиальны (вложенные SELECT, псевдонимы в FROM, методы подстроки и конкатенации строк).
Мы изначально конвертировали содержимое фирменного файла в CSV, для которого существует Драйвер. {Текстовый драйвер Microsoft (*.txt;*.csv)}.Однако клиент требовал, чтобы временные файлы не создавались, и все должно происходить в памяти.
Создание драйвера ODBC для прямого запроса файла кажется слишком трудоемким.Итак, мы рассматриваем возможность создания драйвера (возможно ODBC), в который мы «встроим» ODBC-драйвер SQLITE.Внутри этого драйвера мы можем загрузить содержимое файлов CSV в базу данных «в памяти», а затем перенаправить запрос внутреннему драйверу ODBC.
Мои вопросы:
- Кажется ли это решение осуществимым?
- С чего нам начать, чтобы создать драйвер ODBC с нуля?
Спасибо
Решение
Если использование SQLite в качестве бэкэнда возможно, я не могу понять, почему вы не можете использовать поставщика ADO .NET для своей базы данных SQLite, например Система.Данные.SQLite.
Судя по вашему комментарию, я думаю, что вы фактически используете поставщика ODBC ADO .NET для всех подключений к базе данных (System.Data.Odbc).Если вам нужно сохранить ту же схему, то вам подойдет собственный провайдер ODBC (но тогда это обычная нативная разработка C, и, я считаю, довольно болезненная).
Другой способ — добавить третий параметр в вашу БД (первые два — это SQL и строка подключения):поставщик ADO .NET, который будет использоваться (например, должно быть сделано в файлах конфигурации, см. providerName
атрибут).Таким образом, вы можете использовать любого доступного поставщика ADO .NET.
Затем вы можете включить поставщика SQLite в свой собственный поставщик ADO .NET, который может включать в себя создание и заполнение базы данных SQLite.Преимущество этого решения:чистый управляемый .NET.
Другие советы
Запрос клиента странный.Всегда будут задействованы файлы, вы читаете из файла.
Если они хотят, чтобы их данные хранились в памяти (опять же странный клиент), поместите CSV-файлы на RAM-диск:http://members.fortunecity.com/ramdisk/RAMDisk/ramdriv001.htm
Сборка и использование ODBC-диска — нетривиальная задача, если вы заботитесь о производительности и стабильности.
Я думаю, что ваше решение отнимает много времени.Вы можете найти существующие решения для того, что вы пытаетесь сделать.Вот несколько альтернатив.
Почему бы не попробовать Linq в текстовый/csv-файл?
- http://www.codeproject.com/KB/linq/LINQtoCSV.aspx
- http://blogs.msdn.com/ericwhite/archive/2008/09/30/linq-to-text-and-linq-to-csv.aspx
Оба решения находятся в памяти.
Другая идея заключается в том, что вы можете экспортировать файл в формате XML вместо CSV или текста (я всегда предпочитаю экспортировать в XML, когда мне нужно обрабатывать код).Затем вы используете System.Xml или Linq to Xml для выполнения операций.
Если вам запрещено создавать временные файлы, вы можете попробовать использовать режим SQLite в памяти.Вот пример строки подключения для него (источник):
Data Source=:memory:;Version=3;New=True;
На мой взгляд, это проще, чем создавать полноценный провайдер.$