Führen Sie mehrere gespeicherte Prozeduren mit single-Reise-Datenbank
Ich habe eine Menge von legacy-Daten-Zugangs-code vor allem ein SqlCommand-Objekt mit der Gespeicherten Prozedur-Aufrufe, die wir ausführen eine Menge Insert-Anweisung in einer Datenbank.
Solange der SQL-server auf demselben Computer wie die Anwendung es wurden akzeptable Leistung, aber jetzt werden wir versuchen, einige der Daten auf SQL Azure.
Das problem ist, dass unser code ruft einen SP für jeden Datensatz einfügen die Ergebnisse in ganz wenigen Ausflüge in die Datenbank und wenn nicht auf dem gleichen server dauert es einige Zeit.
var conn = new SqlConnection("connString")
var cmd = new SqlCommand(conn, "spMyStoreProc");
cmd.Params.Add("@a", SqlDbType.VarChar, 10);
cmd.Params.Add("@b", SqlDbType.Int);
using(conn)
{
conn.Open();
foreach(var rec in recordsToInsert)
{
cmd.Parameters["@a"].Value = rec.A;
cmd.Parameters["@b"].Value = rec.B;
cmd.ExecuteNonQuery();
}
conn.Close();
}
Ich habe versucht den obigen code mit und ohne Transaktionen.
Habe ich auch schon versucht, eine "batch" - SQL-Anweisung mehrere SPs auf jeder Reise an den server.
Wie diese:
var cmd = new SqlCommand(conn);
cmd.CommandText = "EXEC spMyStoreProc @a='a' @b=2; EXEC spMyStoreProc @a='b' @b=4;"
Es erhöht die Leistung der Bedienung, aber da habe ich durchaus ein paar SPs, wo jeder SP hat etwa 20-50 params wird es ziemlich mühsam, Sie zu schreiben, diesen code für alle insert-Befehle in diesem data access-Komponente.
Ist dies der beste Weg, dies zu erreichen, oder kann ich irgendwie sagen ADO.NET ich möchte meine Anrufe ausführen als batch (noch nicht geschafft hat, alles, was auf seine mögliche aber das Gefühl, dass ich wenigstens Fragen sollte), um eine Netzwerk-Latenz etc zwischen jedem einzelnen SP nennen?
Wenn nicht, weiß jemand eine gute Möglichkeit dies zu erreichen, ohne zu schreiben, es "von hand" und da ist es eine legacy-Anwendung, die ich nicht ändern kann den data layer vollständig.
Gibt es irgendwelche Anwendungen, die Sie treffen können SqlCommands mit Parameter und generieren die TQL würden Sie ausführen?
Vielen Dank im Voraus
InformationsquelleAutor jmw | 2011-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie wahrscheinlich eine gespeicherte Prozedur aufruft, alle anderen gespeicherten Prozeduren - es wird wahrscheinlich den wenigsten Aufwand. Also, aus dem code, den Sie nur aufrufen, das gespeicherte Prozeduren einmal... so gegeben, dass Sie die gleichen Parameter, den Sie übergeben, jedes mal (weil dein code scheint zu implizieren, dass Sie im Grunde etwas wie das hier tun:
Die Vorteile sind viele, von denen einige ist, dass die alle zentral, und Sie können sogar wickeln Sie alle von Ihnen innerhalb einer Transaktion, um so nicht zu tun, dirty-Einsätze (da Sie alle voneinander abhängen).
Auch, wenn Sie nicht das Gefühl, wie die übergabe 20/30 Parameter an jedes SP, möchten Sie vielleicht, um eine user-Tabelle definierten Daten-Typ für jeden Satz von Parametern, die übergeben werden können. So wird dann jeder SP bekommt 1 oder 2 Parameter, und der code wird viel einfacher, und lesbar ist.
EDIT:
Dies ist eine gute Referenz für die benutzerdefinierte Tabellentypen: http://msdn.microsoft.com/en-us/library/bb675163.aspx
Und dies ist, wie Tabelle übergeben bewertet Typen für SQL server: http://msdn.microsoft.com/en-us/library/bb675163.aspx
InformationsquelleAutor M.R.
Alternative zu M. R. s Ansatz wäre, zu senden allen Ihren Parametern als XML-Dokument, dann parse das XML-Dokument zu extrahieren Ihre Parameter. Dies kann vereinfachen, die Benutzeroberfläche ein wenig.
Aber ich glaube, Sie waren auf etwas, wenn Sie die Möglichkeit diskutiert, der die Verkettung aller Befehle in einem einzigen string. Aber anstatt manuell erstellen Sie, betrachten Gebäude eine Erweiterung Methode der SqlCommand-Objekt, das gibt eine einzelne Zeichenfolge für die Ausführung, die Nutzung der sp_executesql-syntax, und führen Sie die gesamte Zeichenfolge in einen single-pass.
So würden Sie eine Schleife, die aussieht wie diese, und Sie nennen würde, eine neue ToInlineSql extension Methode:
Den ToInlineSql Erweiterung Methode könnte wie folgt Aussehen (peuso-code, müssen Sie bestimmte Dinge, wie etwa die überprüfung für den Datentyp und so weiter) [und hier ist der link zu sp_executesql:
InformationsquelleAutor Herve Roggero