LINQ to DB2 generieren?

8

Ich habe eine vorhandene DB2-Datenbank in meinem Job. (Zumindest glaube ich, dass es DB2 ist. Sie bezeichnen es als "die iSeries" und es sieht aus und fühlt sich an wie DB2 auf einer Mainframe-ish-Hardware.) Seit Jahren haben die .NET-Entwickler in meiner Abteilung ADO-Befehle und -Abfragen manuell geschrieben um spezifische Daten aus bestimmten Tabellen usw. zu erhalten.

Momentan baue ich gerade eine Infrastruktur, um die Entwicklung und den Support unserer internen Software zu erleichtern, und eine Sache, die ich angehen möchte, ist dieser Datenzugriff. Ich bin ein wenig neu zu den verschiedenen ORM-Tools da draußen, aber ich bin vertraut mit LINQ-Syntax und das ist, wo ich gerne bekommen würde. Das haben wir gerade jetzt:

  1. Eine etablierte DB2-Datenbank mit vielen Tabellen.
  2. Keine etablierten Geschäftsobjekte im Code.
  3. Keine nützliche Beziehung zwischen Tabellen und potenziellen Geschäftsobjekten.

Ich versuche also, eine Abstraktionsschicht zwischen dem Code und der DB2-Datenbank zu erstellen, in der die Entwickler das, was sie bereits tun, einfach flüssiger und effizienter machen (Daten erfassen und ein benutzerdefiniertes Objekt füllen). Das heißt, anstatt klassische ADO-Objekte zu erstellen und ein DataSet zu füllen, schreiben Sie einfach eine einfache LINQ-Anweisung, die ein anonymes IQueryable mit den Feldern zurückgibt, um ein benutzerdefiniertes Objekt zu füllen. (Als zusätzlichen Bonus mag ich die Idee von Kompilierzeit-Fehlern, wenn Programmierer etwas versauen, anstatt Laufzeitfehler, wie es passiert, wenn ein Tippfehler in ein SQL-Befehlszeichenfolgeliteral eindringt. Auch, erhalten Sie mich nicht einmal begann hier auf SQL-Injection-Schwachstellen.)

Die Sache ist, ich konnte noch keinen Weg finden, dies zu erreichen. Es ist durchaus möglich, dass ich etwas Einfaches übersehe, und wenn das der Fall ist, dann begrüße ich ein kleines Stupsen in die richtige Richtung. Aber so wie es aussieht, passt alles, was ich online finde, in eine dieser Kategorien:

  1. Ja, das kannst du tun! Alles, was Sie brauchen, ist ein Treiber von IBM, für den es keinen Download-Link gibt!
  2. Hier ist ein praktisches Tutorial zum Erzeugen eines großartigen ORM für Ihre Geschäftsobjekte, das eine Datenbank von Grund auf neu erstellt. (NHibernate, meistens, das wäre toll zu verwenden, wenn ich es für das, was ich versuche, verwenden kann.)
  3. Laden Sie ein Tool herunter und generieren Sie Ihr ORM. (Das Tool unterstützt DB2 nicht, oder behauptet, es scheitert, wenn ich es versuche.)

Hat jemand schon einmal so etwas erlebt? Nähme ich mich dem völlig falsch? Jeder Rat in dieser Angelegenheit würde sehr geschätzt werden, danke.

Edit: Ich werde weitermachen und diesen Kopf hüten. Ich habe mit einigen Leuten gesprochen und es klingt wie "es kann noch nicht gemacht werden" ist immer noch die Antwort, aber wenn jemand daran gearbeitet hat und eine Lösung gefunden hat, würde ich es gerne hören.

Update: Danke an die Antwort unten, um mich auf das DB_Linq Projekt hinzuweisen. Es hat eigentlich nicht viel Zeit gekostet, einige grundlegende DB2-Unterstützung hinzuzufügen und jetzt habe ich einen getesteten und funktionierenden LINQ to DB2-Provider! Es ist im Moment ziemlich einfach und sehr für unsere Umgebung angepasst, also plant es nicht, es zurück zum Projekt zu bringen. Aber hoffentlich kann ich meine Gabel im Laufe der Zeit reifen lassen und zurückschicken. Danke!

    
David 20.07.2010, 13:01
quelle

6 Antworten

3

Wenn Sie nicht fest entschlossen sind, etwas zu programmieren :-) LINQ zu MySql, Oracle und Postgress zu bekommen und es wahrscheinlich zu ändern ersparen Sie auch viel Arbeit. Denken Sie daran, dass LINQ to SQL immer noch dieselbe ADO.NET-Verbindung verwendet.

Achten Sie darauf, dass LINQ to Entities nicht mit LINQ to SQL identisch ist, und selbst wenn IBM lib funktioniert, müssen Sie zunächst prüfen, ob Sie es gegen eine vorhandene Datenbank ohne große Anzahl von Proofs verwenden dürfen (Es kann leicht stolpern und versuchen, bestehende DB zu ändern - überprüfen Sie diesen Thread, wenn Sie in diesen Aspekt eintauchen möchten: Ссылка ).

Sie können auch zu IBMs Entity Framework Beta gehen thread (beginnend mit dem Ende, an dem einige Personen Arbeitsergebnisse gemeldet haben).

Wichtig ist, nicht zu versuchen, absolut alles zu bekommen, was MS SQL hat - Sie brauchen nur Tabellen-Repräsentations-Klassen und Sie sind gut für die erste Runde.

Eine andere Sache, die Sie versuchen könnten, ist, eine normale ADO.NET-Verbindung zu DB2 zu öffnen (oder ODBC zu erzwingen, wenn sich herausstellt, dass eine Nicht-ODBC-Verbindung zu snoopy und sensitiv ist) zu DB2, und versuchen Sie, so zu handeln wie SQL Server sprechen. Wenn sich herausstellt, dass SqlMetal zustimmt, mit dieser Verbindung zu arbeiten, sind Sie ziemlich fertig - es wird Autogen-Tabellen-Repräsentation Klassen für Sie.

Wenn es schief geht, brauchen Sie auch MS SQL Server, zumindest für Entwicklungszwecke. Für ein Start-Skript ein paar Tabellen von DB2, erstellen Sie dann in SQL Server und führen Sie dann SqlMetal und schauen Sie sich den Quellcode. Sie werden sehen, dass es hübsche Clan-Klassen für die Tabellendarstellung erstellt und nur kräftige, aber geradlinige Attribute auf ihnen platziert - was bedeutet, dass sie leicht kopiert und eingefügt werden können oder sogar durch ein gutes Skript erzeugt werden können. Sobald Sie sehen, wie eine kleine autogemannte Datei aussieht, werden Sie feststellen, dass Sie den bereitgestellten Hooks mehr Code hinzufügen oder vorhandenen Code entfernen können. Überprüfen Sie das LINQ zu MySql usw. erneut.

LINQ selbst benötigt nur Tabellenrepräsentationsklassen, so dass es Ihnen relativ freisteht, Ihre eigene System.Data.Linq.DataContext-Ableitung fast nach Herzenslust zu erstellen, und ich nehme an, dass sich das Schema in DB2 kaum ändert, so dass Sie es nicht tun muss es zu häufig ändern. LINQ ist ein ziemlich offenes System im Allgemeinen (wie viele LINQ zu etwas libs) bedeutet, dass, wenn DataContext-Ableitung nicht genug ist, Sie auch die gesamten LINQ-Ausdrücke übernehmen können.

Sobald Sie einen Proof of Concept mit einigen Tabellen haben, müssen Sie möglicherweise ein Perl- oder Python-Skript (oder eine Powershell oder C #) schreiben, um ein wenig Regex zu ersetzen, wenn DB2-Tabellenerstellungsskripts nicht auf SQL Server ausgeführt werden intakt (es gibt immer ein paar Syntaxabweichungen) und Sie haben wirklich den größten Weg genommen.

    
ZXX 02.08.2010, 11:41
quelle
1

Dies steht auf meiner Liste der Dinge, die ich tun kann, wenn ich ein großes IBM DB2-System betreibe und .NET-Entwickler habe. Nicht so einfach die Treiber und Plugins für Visual Studio 2008/2010 zu bekommen.

ORM - Ich weiß (ich habe gelesen), dass nHibernate und Entity Framework beide die SQL-Syntax von DB2 unterstützen. nHibernate hat eine größere Lernkurve und wir sind unschlüssig, ob wir uns darauf einlassen. Aber das Entity-Framework (das neue) sieht sehr gut aus und verwendet derzeit SQL Server 2008, sollte aber auch auf DB2 verweisen.

Sowohl nhibernate als auch Entity Framework unterstützen LINQ gegen sie, ohne Probleme.

Danke

Simon

    
Simon Thompson 20.07.2010 21:54
quelle
0

Ich bin kein DB2-Mann, aber hier sind einige Ideen, die Sie vielleicht nicht gesehen haben.

  • IBM Dokumentation der DB2 Entity Framework-Unterstützung: Ссылка
  • LLBLGen, ein LINQ-Anbieter (Hinweis: Die Seite behauptet, iSeries nicht zu unterstützen, aber das Unternehmen war in der Vergangenheit wirklich gut mit uns; Sie könnten in Betracht ziehen, ihnen einen Anruf zu geben) Ссылка
  • Ein nicht sehr vielversprechender SO-Post vom letzten Februar: LINQ mit IBM i verwenden

Ich hoffe, das hilft.

Viel Glück!

    
kbrimington 31.07.2010 17:33
quelle
0

Nun, die einfache Antwort für Sie ist ja, Sie können es tun. Wie?

  1. Laden Sie den DB2 Data Server Client 9.7 herunter und installieren Sie ihn. Ersetzen Sie alle Ihre älteren Clients.

  2. Möglicherweise müssen Sie Ihre Verbindungszeichenfolge in DB2 neu schreiben. Unter C: \ Programme \ IBM \ SQLLIB \ Bin \ Testconn.exe können Sie eine Verbindungszeichenfolge erstellen und testen.

  3. Stellen Sie sicher, dass sich Ihre IBM.Data.Informix.dll in einwandfreiem Zustand befindet.

  4. Verwenden Sie VS2008. Ab dem Datum ist VSAI für DB2 für VS2010 noch nicht freigegeben.

  5. Erstellen Sie wie jede andere Datenbank das ADO.NET-Entitätsmodell - edmx-Datei für Ihre Datenbank.

  6. Höchstwahrscheinlich mit einer großen Anzahl von Tabellen in Ihrer Datenbank (was höchstwahrscheinlich mit DB2 geschieht), müssen Sie EDMGEN2.exe von www.codeplex.com beziehen. Möglicherweise müssen Sie eine Textdatei mit dem Namen "Table.txt" platzieren, die mit Tabellen, Sichten, Proceduce-Namen mit vorangestelltem Schemanamen gefüllt ist. EdmGen2.exe wird diese Textdatei verwenden und EDMX-Datei nur für die angegebenen Tabellen erstellen. Später können Sie weitere Tabellen hinzufügen.

  7. IBM verfügt über eine Support-Site, auf der die Einschränkungen der von Linq in DB2-Client 9.7 unterstützten Funktionen aufgrund von DB2-SQL-Einschränkungen angegeben sind.

Venkat 02.08.2010 17:31
quelle
0

Die Lösung, die ich in meinem aktuellen Projekt verwende, ist ein "Linked Server" in Microsoft SQL Server, der über OleDB mit dem DB2-Datenbankserver verbunden ist.

In meiner Projektdatenbank habe ich Ansichten erstellt, die die DB2-Tabellen spiegeln. Wenn Sie die Option sqlmetal.exe mit der Option / views ausführen, wird auch die Zuordnungsdatei für diese erstellt.

Beachten Sie, dass Sie das Mapping manuell aktualisieren müssen, um Informationen zu Primärschlüsseln und Nullwertfeldern hinzuzufügen.

In meinem Projekt macht es Sinn, es auf diese Weise zu tun, da ich Datenbank sowohl auf DB2 als auch auf SQL Server lesen und schreiben muss und einen Verbindungsserver verwenden kann. Ich kann dies alles auf derselben ADO.NET-Verbindung tun Änderungen an beiden Datenbanken gleichzeitig.

    
Bart Jolling 05.08.2010 10:20
quelle
0

Sie können ein leichtes ORM wie dapper-dot-net verwenden. Ссылка

    
Zo Has 19.07.2013 04:20
quelle

Tags und Links