Frage

Ich habe diese Idee, dass SQL-Ansichten zu abstrahieren einfachen Datenbank-Berechnungen (zB eine Zählung auf eine Beziehung) ausreichend ist, und Sie brauchen keine Verfahren (== prozeduralen Code)

Eine einfache SQL Ansicht + mit Klausel >> eine gespeicherte Prozedur mit Parametern manchmal

Während dieser Punkt mache ich einen Weg vorgestellt von Tabelle / View Abrufen von Daten ohne SQL zu schreiben und ohne die where-Klausel zu schreiben ..

Aber zu meiner Überraschung ist es nicht einen Weg scheint dies in ADO.NET zu erreichen 2.0 oder höher.

Lassen Sie mich Ihnen sagen, was ich versucht:

  • SqlDataAdapter + SqlCommandBuilder erfordert, dass Sie immer noch "SELECT ... FROM" zu schreiben und die where -Klausel in Strings (plus, wenn Sie das setzen, 'wo', Sie haben nicht viel Gebrauch von Update / Insert / DeleteCommand)

  • typisierte Datasets können Sie nur _entire DataTable_s abrufen und dann Filter, um sie anzuwenden. Filter sind Strings, ohne Hilfe zu entkommen ... (muss das Apostroph verdoppeln!)

  • SQL to Entities sah vielversprechend aus, aber sie scheinen: auf MSSQL beschränkt sein, aufgebläht von SQL-Abfragen generieren, eine ganz neue Stapel von DAOs (neben den bestehenden Domain Modellklassen) erzeugen, reqiuire .net 3.5+ für all dies usw. (das heißt, all dies sind Nachteile für mich)

Andere ORMs haben ähnliche Probleme wie SQL to Entities.

Was ich suche ist eine starke typisierte Methode von Datenbanktabellen Zugriff auf / Ansichten , dass:

  • kommt nicht mit einem anderen Satz von DAOs (K.I.S.S)
  • ermöglicht es mir, eine Tabelle abzufragen, ohne "Selects" in Strings (stark typisierte)
  • Schreiben
  • erlaubt es mir, zu filtern ( WHERE ) eine Tabelle mit richtig-escaped Parametern (und ohne die gesamte Abrufen von Daten im Voraus)
  • kann später Ausgabe Updates / Inserts / Löschungen

Ich bin ziemlich neu in .Net, aber nicht dumm: ist diese existieren

Danke.

War es hilfreich?

Lösung

Subsonic hat eine ziemlich leichte Abfrage-Tool , dass Sie direkt die Datenbank abzufragen gegen mit einem Abfrageobjekt, das die SQL abstrahiert verwenden können. Wenn Sie möchten, können Sie auch die Codegenerierung Anlage verwenden, um Ihre Datenbanktabellen POCOs Karte, oder nur eine stark typisierte Schema zu erstellen (für Spalte / Tabellennamen usw.).

Andere Tipps

Ich weiß nicht wirklich glauben, dass Sie möchten, was zu tun ist, ohne irgendeine Art von ORM erreichbar ist, oder eine spezielle DSL mit einem Compiler, dass irgendwie weiß über Ihre Datenbankschema, Typ / Spalteninformationen etc.

Beachten Sie, dass C # eine Allzweck-Sprache ist, und seine Compiler sind völlig unbekannt Ihre Datenbanktypen, das ist, warum Sie sie nicht ohne eine gewisse Abstraktionsschicht binden können, die in der Regel beinhaltet Ad-hoc-SQL-Abfragen (Strings), NHibernate oder ähnliche Mapping-Dateien (mehr Strings) und / oder DAOs.

Wenn Sie nicht die WHERE-Klausel schreiben wollen, ist eine Möglichkeit, ein Filter-Objekt zu verwenden, und fügen Sie die Bedingungen, die Sie wollen. Zum Beispiel:

        var sc = new Filter();
        sc.Add("Contacttitle", "Sales Agent");
        sc.Add("city", "london", Logical.Or);
        var customers = D2Bk.Fetch(sc, new Customers());

Aber Sie wollen nicht DAOs verwenden (Kunden, oben ist so), so dass Sie die SQL-Anweisung schreiben müßten und geben Sie die where-Klausel:

        DataSet ds = D2Bk.Fetch("SELECT * FROM Customers WHERE Contacttitle=@PAR1 OR City=@PAR2", "Sales Agent", "london");

Ich würde davon ausgehen, dass Sie unter LINQ und ADO.Net Data Services und diese nicht einige Ihrer Anforderungen?

Native ADO.Net ist ein Datenbank-Anbieter, und deshalb stellt sie eine direkte SQL-Schnittstelle in die zugrunde liegenden Datenquellen. Es gibt verschiedene CRUB basierte Lösungen gibt, die simulieren, was Sie in verschiedenen Graden vor.

Wir haben einen starken internen Trend die Datenbank auf die Datenbank Team zu verlassen und Webservices als Haupt Schnittstelle zu unseren Datenbanken verwenden, vor allem wegen einer Delphi-Code-Basis, die noch unterstützt werden muss.

Eigentlich kann nicht glauben, dass ich ADO.Net Entity Framework hinzuzufügen vergessen haben , die von ADO.Net Data Service unter anderem verwendet wird. Es gibt auch eine LINQ to Entities-Anbieter.

Ich habe so etwas wie dies mit einer gespeicherten Prozedur einmal. Im Grunde wollte ich jede Permutation von Feldern an, an passen in meiner WHERE-Klausel, aber ich wollte nicht zu 100 sprocs mit leicht unterschiedlichen param Listen schreiben und wo Klauseln.

Also, ich habe so etwas wie folgt aus:

CREATE PROCEDURE [GetSimpleCustomers]
(
@ID varchar(50) = null,
@Name varchar(50) = null,
@IsActive  bit = null,
@Address1 varchar(50) = null,
@Address2 varchar(50) = null,
@City varchar(50) = null,
@State varchar(50) = null,
@Zip varchar(50) = null
)
AS

SELECT ID, Name, IsActive, Address1, Address2, City, State, Zip
FROM SimpleCustomerExample
WHERE (ID = @ID OR @ID is NULL)
AND (Name = @Name OR @Name is NULL)
AND (IsActive = @IsActive or @IsActive is NULL)
AND (Address1= @Address1 or @Address1 is NULL)
AND (Address2= @Address2 or @Address2 is NULL)
AND (City= @City or @City is NULL)
AND (State= @State or @State is NULL)
AND (Zip= @Zip or @Zip is NULL)

Damit können Sie die gespeicherten Prozeduren in Ihrem Code aufrufen und nur die params übergeben Sie bei der Filterung auf Interesse, und der Rest wird einkalkuliert nicht, wenn man sie null verlassen.

So können Sie so etwas wie

tun
public List<SimpleCustomer> GetAllCustomersFromOhio()
{
    List<SimpleCustomer> list = new List<SimpleCustomer>();
    using (SqlCommand cmd = new SqlCommand(blah blah))
    {
        cmd.Parameters.AddWithValue("State", "Ohio");//or "OH" depending on your convention
        using(IDataReader oDR = cmd.ExecuteReader())
        {
             //hydrate your list of SimpleCustomers from the record set.
        }
    }
    return list;
}

EDIT: In ihrer Antwort auf Kommentar: Sie könnten die GetSimpleCustomers leicht genug ändern DeleteSimpleCustomers zu sein, indem die

SELECT <columns> FROM SimpleCustomers

DELETE FROM SimpleCustomers 

und halten Sie die gleiche Logik. Das gleiche gilt für ein Update wahr. Außerdem werde ich eine Frage mit einer Frage beantworten: Wie viele Tabellen haben Sie, dass tatsächlich benötigen diese Ebene der benutzerdefinierten Filterung? Die Syntax würde so ähnlich sein, das Sie sie alle aus an einem Tag Pfund könnten (oder weniger, wenn Sie ein einfaches Skript gehämmert zusammen, um es für Sie zu schreiben).

Wenn Sie stark typisierte Datasets verwenden, können Sie parametrisierte Abfragen in der Visual Studio-Editor erstellen, indem Bezeichner mit dem Präfix @ in der Abfrage hinzufügen. Erstellen Sie eine DataSet XSD-Datei in Visual Studio und erstellen Sie eine neue Tabelle mit dem Namen Produkte, dann fügen Sie eine neue Abfrage zu.

Zum Beispiel:

select * from Products where Category = @category;

Dies wird automatisch generieren Methoden für gefüllte Datensätze oder sich Datentabellen, die den zusätzlichen Parameter nehmen. Es wird auch behandeln propery die Saiten (verwendet Parameter auf den Befehl Objekte) zu entkommen. Früher habe ich dies einige super einfache Prototyp Web-Anwendungen ziemlich schnell erstellen.

Ich habe vor kurzem eine Abfrage 'Rahmen' schrieb zum Erzeugen von SQL-WHERE-Klauseln.

Die Hauptkomponente ist eine BaseQueryArgs Klasse mit einer ToWhereClause () Funktion, die Reflexionseigenschaften nutzt in Stringabschnitte zu konvertieren. Dies muss die Arbeit der Flucht und richtig Formatierung Werte zu handhaben.

Jede Klasse BaseQueryArgs muss einfach erklären öffentliche Eigenschaften, und Sie am Ende mit einem stark typisierte Abfrage Objekt zu erben. Für die optionalen Eigenschaften, stellen Sie den Wert auf NULL festlegbare (ref Typen oder Nullable <>) und der SQL-Generator filtert Nullwerte.

Sie können mit benutzerdefinierten Attributen zusätzliche Funktionen für jede Eigenschaft definieren:

  • benutzerdefinierter Spaltenname, der von dem Eigenschaftsnamen
  • unterscheidet
  • benutzerdefinierter Wert Handling (wie zum Beispiel eines Datumswert als ein zwischen dem Testausdruck verwendet wird)

Dies kann dazu verwendet werden, um Abfragen zu erstellen mit einem stark typisierte Abfrage-Objekt wie folgt:

MyCustomQueryArgs args = new MyCustomQueryArgs
{
    ProductFamilyID = 17,
    Region = Regions.Northwest,
    Active = true
};

List<Product> product = QueryProcessor.GetProductsWhere(args);

GetProductsWhere () würde offensichtlich einige Daten Methode aufrufen, die die Ansicht mit der generierten SQL-Zugriffe.

Ich habe keine Lösung für Updates / löscht, aber es scheint nicht so schwer, ein Verfahren zu schreiben, die eine Objektinstanz in eine SQL-Anweisung konvertiert einen Schalter oder Attributtabellennamen zu bestimmen.

Das ist sehr „Ihre eigene Rolle“, aber das gibt Ihnen die Freiheit, die sie für Ihre Bedürfnisse anpassen und viele schweren ORM / DAO Verpackung nicht enthalten.

Hier finden Sie aktuelle Mindscapes Light Produkte

Es baut stongly LINQ abfragbar Modelle eingegeben, die in effizienten SQL-Code führt accross eine Vielzahl von Datenbank-Engines und beinhaltet Memcached und Lucene Unterstützung

I XPO haben an mehreren Projekten verwendet und deren neuere Version hat eine bessere Unterstützung für Abfragen.

http://www.devexpress.com/Products/NET/ORM/

Die Umsetzung, wie alle von ihnen ist nicht ohne Nachteile jedoch.

Ich verwende Daten Abstrakt für meine Projekte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top