Вопрос

Фон:

Наше приложение C# генерирует и выполняет запросы к нескольким типам баз данных (Oracle, SQL Server, MySQL), но возникла необходимость применить их и к собственному формату файлов.

  1. До сих пор использовалось пространство имен System.Data.Common.
  2. Запросы, которые нам нужно применить, нетривиальны (вложенные SELECT, псевдонимы в FROM, методы подстроки и конкатенации строк).

Мы изначально конвертировали содержимое фирменного файла в CSV, для которого существует Драйвер. {Текстовый драйвер Microsoft (*.txt;*.csv)}.Однако клиент требовал, чтобы временные файлы не создавались, и все должно происходить в памяти.

Создание драйвера ODBC для прямого запроса файла кажется слишком трудоемким.Итак, мы рассматриваем возможность создания драйвера (возможно ODBC), в который мы «встроим» ODBC-драйвер SQLITE.Внутри этого драйвера мы можем загрузить содержимое файлов CSV в базу данных «в памяти», а затем перенаправить запрос внутреннему драйверу ODBC.

Мои вопросы:

  1. Кажется ли это решение осуществимым?
  2. С чего нам начать, чтобы создать драйвер 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-файл?

Оба решения находятся в памяти.

Другая идея заключается в том, что вы можете экспортировать файл в формате XML вместо CSV или текста (я всегда предпочитаю экспортировать в XML, когда мне нужно обрабатывать код).Затем вы используете System.Xml или Linq to Xml для выполнения операций.

Если вам запрещено создавать временные файлы, вы можете попробовать использовать режим SQLite в памяти.Вот пример строки подключения для него (источник):

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

На мой взгляд, это проще, чем создавать полноценный провайдер.$

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top