2010-05-30 17 views
7

Ich bin auf der Suche nach einer Möglichkeit, eine SQL-Anweisung in C# zu schreiben, die auf verschiedene Anbieter abzielt. Ein typisches Beispiel für differenzierende SQL-Anweisungen ist die LIMIT in PostgreSQL vs. TOP in MSSQL.Generic SQL Builder .NET

ist die einzige Möglichkeit, SQL-Syntax zu lösen wie die beide oben if-Anweisungen, auf dem Anbieter die wählen Benutzer abhängig zu schreiben oder mit try catch-Anweisungen als Flusskontrolle (LIMIT nicht, funktioniert ich werde versuchen, TOP stattdessen)? Ich habe die LINQ Take Methode gesehen, aber ich frage mich, ob man das ohne LINQ machen kann?

Mit anderen Worten, hat C# einige generische SQL-Provider-Klasse, die ich nicht finden konnte, die verwendet werden können?

+1

Warum möchten Sie nicht LINQ verwenden? –

+0

Es gibt viele Möglichkeiten, diese Unterschiede zu lösen. Sind Sie sicher, dass Sie SQL verwenden, also ein System finden, mit dem Sie eine SQL-Anweisung schreiben können, die über verschiedene Provider hinweg funktioniert? –

+0

@Mark Byers: Nun, ich finde mich oft auf .NET 2 und soweit ich weiß, funktioniert LINQ dort nicht so gut. Historisch gesehen war dies, weil ich in der Lage sein wollte, ohne Fuzz nach Mono zu portieren, und dann bin ich einfach "steckengeblieben". Da Mono heutzutage gut mit LINQ funktioniert, kann ich keine andere gute Antwort geben, warum ich immer noch in der Vergangenheit lebe. – Patrick

Antwort

7

Das Entity Framework kann auf verschiedene Datenbanken abzielen. Dadurch können Sie LINQ-Anweisungen schreiben, die mit beiden Datenbanken funktionieren. Sie müssen einen PostgreSQL-Provider für das Entity Framework finden. Es gibt mehrere zur Auswahl.

Hoffe, das hilft.

3

Es gibt DBLinq:

LINQ-Provider für Oracle, PostgreSQL, MySQL, Ingres, SQLite, Firebird und ... SQL Server (C# 3,0)

Wenn Sie erzeugen eine Abfrage mit LINQ to SQL ist es möglich, das generierte SQL anzuzeigen und zu speichern.

Es erfüllt jedoch nicht Ihre Anforderung "ohne Verwendung von LINQ". Wenn Sie LINQ verfügbar haben, warum nicht verwenden?

3

Ich glaube nicht, dass es einen "generischen SQL-Provider" gibt.

In unserem Shop müssen wir sowohl DB2 als auch SQL Server unterstützen. Daher haben wir uns für die Implementierung eines Layer-Patterns entschieden, das die Klassen Model, Data Access und Business Logic erstellt. Die Datenzugriffsebene behandelt die Verbindung zu den verschiedenen DBMS und lädt die Modellklassen, die sie an die Geschäftslogik zurückgeben. Die Geschäftslogik und die Modellklassen haben keine Ahnung, wo die Datenzugriffsebene die Daten erhält.

Die Unterschiede in SQL werden behandelt, da die Datenzugriffsebene gespeicherte Prozeduren in der Datenbank aufruft. Wir haben die gespeicherten Prozeduren mit der entsprechenden Syntax in beiden Systemen implementiert. Wenn wir zu einer anderen Datenbank gehen müssen, müssen wir nur die notwendigen Prozeduren auf den neuen DBMS implementieren und alles sollte einfach funktionieren.

+0

Autsch, meine erste Down-Abstimmung. Eine Erklärung würde geschätzt werden. Vielen Dank. –

+0

Also im Grunde implementieren Sie Ihre eigenen? :-) Gespeicherte Prozeduren sind meines Wissens kein "Standard" unter Datenbanken, obwohl ein guter Punkt, da sie Fehler reduziert, die beim Arbeiten mit Geschäftslogik auftreten können. Ich suchte nach einer Möglichkeit, zum Beispiel Tabellen in einer Datenbank aufzulisten und dann die Spalten von einer bestimmten Tabelle in "irgendeiner Datenbank" zu holen, in welchem ​​Fall S.P. nicht so gut von einer Übereinstimmung sind. – Patrick

+0

Ich sehe, Ihre Frage nicht detailliert die Anforderung der "Erkennung" von Datenbankobjekten, das geht weit über die Unterschiede in SQL-Implementierungen. Danke für die Erklärung und ich verstehe, dass das nicht das ist was du suchst und somit die down vote. –

1

Beitritt zur Idee von Marc Tidd - Wenn Sie nicht Linq möchten, erstellen Sie separate DAL-Klassen für jeden Anbieter oder verwenden Sie gespeicherte Prozeduren, die auf jedem DB implementiert werden.

+0

Ja, die wichtigste Idee zur Lösung des SQL-Problems ist die Verwendung gespeicherter Prozeduren. Sie müssen nicht das gesamte Layer-Muster durchlaufen, wenn es nicht zu Ihrer Lösung passt. –