Создание LINQ для DB2?

У меня есть существующая база данных DB2 на моей работе. (По крайней мере, я думаю, что это DB2. Они называют ее «iSeries», и она выглядит и работает как DB2 на некотором оборудовании, похожем на мейнфрейм.) В течение многих лет разработчики .NET в моем отделе просто вручную писали команды и запросы ADO. для получения конкретных данных из конкретных таблиц и т. д.

На данный момент я создаю некоторую инфраструктуру, чтобы упростить разработку и поддержку нашего внутреннего программного обеспечения, и одна вещь, которую я хотел бы решить, — это доступ к данным. Я немного новичок в различных инструментах ORM, но я знаком с синтаксисом LINQ, и это то, к чему я хотел бы добраться. Вот что мы имеем прямо сейчас:

  1. Установленная база данных DB2 с множеством таблиц.
  2. Нет установленных бизнес-объектов в коде.
  3. Нет полезной связи между таблицами и любыми потенциальными бизнес-объектами.

Итак, что я пытаюсь сделать, так это создать уровень абстракции между кодом и базой данных DB2, где разработчики могут по существу делать то, что они уже делают (получать данные и заполнять пользовательский объект), только более плавно и эффективно. То есть вместо создания классических объектов ADO и заполнения набора данных просто напишите простую инструкцию LINQ, которая возвращает анонимный IQueryable с полями для заполнения пользовательского объекта. (В качестве дополнительного бонуса мне очень нравится идея ошибок времени компиляции, когда программисты что-то путают вместо ошибок времени выполнения, как это происходит, когда опечатка попадает в литерал командной строки SQL. Кроме того, даже не поймите меня начал с уязвимостей SQL-инъекций где-то здесь.)

Дело в том, что я пока не нашел способа сделать это. Вполне возможно, что я упускаю из виду что-то простое, и если это так, то я приветствую небольшой толчок в правильном направлении. Но в нынешнем виде все, что я нахожу в Интернете, подпадает под одну из следующих категорий:

  1. Да, ты можешь это сделать! Все, что вам нужно, это драйвер от IBM, для которого нет ссылки для скачивания!
  2. Вот удобный учебник по созданию отличного ORM для ваших бизнес-объектов, который создает базу данных с нуля. (В основном NHibernate, который было бы здорово использовать, если бы я мог использовать его для того, что я пытаюсь сделать.)
  3. Загрузите какой-нибудь инструмент и создайте свой ORM. (Инструмент не поддерживает DB2 или утверждает, что не поддерживает, когда я пытаюсь.)

Кто-нибудь сталкивался с чем-то подобным раньше? Я подхожу к этому совершенно неправильно? Любые советы по этому вопросу будут высоко оценены, спасибо.

Редактировать: я собираюсь пойти дальше и наградить это. Я разговаривал с некоторыми людьми, и мне кажется, что «это пока невозможно» — это все еще актуальный ответ, но если кто-то работал над этим и нашел решение, я бы хотел его услышать.

Обновление: благодаря приведенному ниже ответу за то, что он указал мне на проект DB_Linq. На самом деле мне не потребовалось много времени, чтобы добавить к этому базовую поддержку DB2, и теперь у меня есть проверенный и работающий поставщик LINQ to DB2! На данный момент это довольно просто и очень настроено для нашей среды, поэтому пока не планируется возвращать его обратно в проект. Но, надеюсь, со временем я смогу усовершенствовать свою вилку и отправить ее обратно. Спасибо!


person David    schedule 20.07.2010    source источник
comment
+1 из-за взаимных разочарований.   -  person Derrick Turk    schedule 21.07.2010


Ответы (6)


Если вы не категорически против написания кода :-) получите LINQ to MySql, Oracle и Postgress и измените это, вероятно, сэкономит вам много работы. Помните, что LINQ to SQL по-прежнему использует то же соединение ADO.NET.

Имейте в виду, что LINQ to Entities — это не то же самое, что LINQ to SQL, и даже если вы заработаете с этой библиотекой IBM, вам сначала нужно будет проверить, разрешено ли вам использовать ее против существующей БД без большой проверки (она может легко споткнуться и попытаться изменить существующую БД - проверьте эту ветку, если вы хотите вникнуть в нее в этом аспекте: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/f3a5b27a-5b73-476a-8c38-1eaedc8f197c).

Вы также можете посетить тему бета-тестирования IBM Entity Framework. (начните с конца, где некоторые люди заявили о рабочих результатах).

Важно не пытаться получить абсолютно все, что есть в MS SQL — вам просто нужны классы табличного представления, и вы готовы к первому раунду.

Еще одна вещь, которую вы можете попробовать, - это открыть обычное соединение ADO.NET с DB2 (или принудительно использовать ODBC, если окажется, что соединение без ODBC слишком скрытное и чувствительное) к DB2 и попытаться действовать так, как если бы это был SQL Server. Если выяснится, что SqlMetal согласен работать с этим подключением, вы в значительной степени сделано - это автоматически создаст для вас классы представления таблиц.

Если это не так, вам также понадобится MS SQL Server, по крайней мере, для целей разработки. Для начала создайте несколько таблиц из DB2, создайте их в SQL Server, а затем запустите SqlMetal и просмотрите исходный код. Вы увидите, что он создает симпатичные клановые классы для табличного представления и просто помещает в них здоровенные, но прямые атрибуты — это означает, что их легко копировать и вставлять или даже генерировать с помощью хорошего скрипта. Как только вы увидите, как выглядит небольшой автоматически сгенерированный файл, вы также увидите, что вы можете добавить дополнительный код к предоставленным крючкам или удалить часть существующего кода. Убедитесь, что LINQ to MySql и т. д. еще раз.

LINQ сам по себе просто нуждается в классах представления таблиц, поэтому вы можете свободно создавать свои собственные производные System.Data.Linq.DataContext почти в соответствии с вашими желаниями, и я полагаю, что схема в DB2 почти никогда не меняется, поэтому вам не нужно будет изменять это слишком часто. LINQ в целом довольно открытая система (о чем свидетельствуют многие LINQ to something libs), что означает, что если модификации производной DataContext недостаточно, вы также можете взять на себя все выражения LINQ.

Когда у вас есть доказательство концепции с несколькими таблицами, вам может понадобиться написать сценарий Perl или Python (или PowerShell или C#), чтобы сделать небольшую замену регулярных выражений, если сценарии создания таблиц DB2 не работают на SQL Server без изменений (есть всегда несколько синтаксических отклонений), и вы действительно выбрали самый логичный маршрут.

person ZXX    schedule 02.08.2010
comment
Скатывание моего собственного из этого проекта DBLinq может быть билетом. Мне придется поработать с одним из наших специалистов по DB2 над синтаксисом запросов и всем прочим, но, как вы сказали, я просто ищу самый простой доступ к данным. Выбор столбцов из таблиц составляет около 99% цели, что было бы неплохо. - person David; 02.08.2010
comment
Я ожидаю, что DB2 будет иметь полностью стандартный синтаксис SQL для всех обычных потребностей LINQ (запросы, вставки, обновления). Но я бы ожидал некоторых различий в сценариях, которые любой инструмент пользовательского интерфейса/управления, который он генерирует, создает сценарий для создания таблицы и подобных вещей администратора, и может быть несколько типов данных, которые отличаются или просто имеют разные имена, поэтому вам, возможно, придется не Поддержите некоторые из них на данный момент. - person ZXX; 03.08.2010
comment
Вероятно, это так. Для наших нужд наиболее распространенным типом данных на сегодняшний день являются символьные поля. Хотя, насколько я помню из своего последнего опыта работы с DB2 много лет назад, это обычное поле. Я помню администраторов баз данных, которые говорили мне, что bool не подходит, и вместо этого мне нужно использовать символы T и F. Хотя, возможно, это были только они. Просто чтобы показать им абсурдность этого, я вместо этого сделал поле из 5 символов и использовал Is и No is :) Это не готовое решение, на которое я надеялся, но пока лучшее. Баунти твоя. - person David; 03.08.2010

Это входит в мой список дел, так как у меня большая система IBM DB2 и есть разработчики .net. Не так просто получить драйверы и плагины для Visual Studio 2008/2010.

ORM - я знаю (я читал), что nHibernate и Entity Framework поддерживают синтаксис SQL DB2. У nHibernate более длинная кривая обучения, и мы не решили, будем ли мы прыгать на этом. Но инфраструктура сущностей (новая) выглядит очень хорошо и в настоящее время используется для SQL Server 2008, но имейте в виду, что она должна указывать и на DB2.

И nhibernate, и платформа Entity поддерживают запуск LINQ без каких-либо проблем.

Спасибо

Саймон

person Simon Thompson    schedule 20.07.2010

Я не специалист по DB2, но вот некоторые идеи, которые вы могли видеть или не видеть.

Надеюсь, это поможет.

Удачи!

person kbrimington    schedule 31.07.2010

Ну, простой ответ для вас - да, вы можете сделать. Как?

  1. Загрузите клиент сервера данных DB2 версии 9.7 и установите. Замените всех своих старых клиентов.

  2. Возможно, вам придется переписать строку подключения к DB2. В C:\Program Files\IBM\SQLLIB\Bin\Testconn.exe поможет вам создать и протестировать строку подключения.

  3. Убедитесь, что ваш IBM.Data.Informix.dll находится в рабочем состоянии.

  4. Используйте VS2008. На сегодняшний день VSAI для DB2 для VS2010 еще не выпущен.

  5. Как и в любой другой базе данных, создайте модель объекта ADO.NET — файл edmx для вашей базы данных.

  6. Скорее всего, при большом количестве таблиц в вашей базе данных (что наиболее вероятно для DB2) вам необходимо скачать EDMGEN2.exe с сайта www.codeplex.com. Возможно, вам придется разместить текстовый файл с именем «Tables.txt», заполненный таблицами, представлениями, именами Proceduce, которым предшествует имя схемы. EdmGen2.exe будет использовать этот текстовый файл и создавать файл EDMX только для указанных таблиц. Позже вы можете добавить дополнительные таблицы.

  7. У IBM есть сайт поддержки, где они сообщают об ограничениях функций, поддерживаемых в Linq в клиенте DB2 9.7, из-за ограничений SQL DB2.

person Venkat    schedule 02.08.2010
comment
Это звучит многообещающе, но у меня возникли проблемы с шагом 1. Есть ли где-нибудь ссылка для скачивания? Веб-сайт IBM похож на охоту за мусором в аду, с множеством круговых ссылок на документацию и без фактической загрузки. - person David; 02.08.2010

Решение, которое я использую в своем текущем проекте, — это «связанный сервер» в Microsoft SQL Server, который связан через OleDB с сервером базы данных DB2.

В базе данных моего проекта я создал представления, которые отражают таблицы DB2. Запуск sqlmetal.exe с параметром /views также создаст для них файл сопоставления.

Имейте в виду, что вам нужно будет обновить сопоставление вручную, чтобы добавить информацию о первичных ключах и полях, допускающих значение NULL.

В моем проекте имеет смысл делать это таким образом, поскольку мне приходится читать/записывать базу данных как на DB2, так и на SQL Server, и с помощью связанного сервера я могу делать все это в одном и том же соединении ADO.NET, фиксируя изменения в обоих базу данных одновременно.

person Bart Jolling    schedule 05.08.2010

Вы можете использовать легкий ORM, такой как dapper-dot-net. http://code.google.com/p/dapper-dot-net/

person Zo Has    schedule 19.07.2013