Aussage: Dieser Artikel wurde in „Computer Applications“, Band 23, Ausgabe 11, veröffentlicht.
Zusammenfassung: Bei der Entwicklung verschiedener Systeme ist die Verwendung gespeicherter Prozeduren eine gute Angewohnheit, die nicht nur Funktionen wie temporäre Tabellen, Funktionen und Cursor mit sich bringt, sondern auch Debugging, Upgrades und Wartung werden bequemer. Allerdings befinden sich fast alle Aufrufe gespeicherter Prozeduren im gleichen Modus, und der Hauptunterschied besteht darin, dass die Parameter jeder gespeicherten Prozedur unterschiedlich sind. Ist es also möglich, eine Methode zu verwenden, um alle Aufrufe gespeicherter Prozeduren zu vereinheitlichen und unnötige Programmierung zu reduzieren? Basierend auf der Untersuchung der SQL Server-Datenbank und ASP.NET haben wir eine einheitliche Aufrufmethode implementiert. Diese Methode muss nur den Namen der aufzurufenden gespeicherten Prozedur angeben und beim Aufruf bestimmte Parameterwerte bereitstellen, damit alle gespeichert werden Prozedur aufgerufen werden kann.
Schlüsselwörter: gespeicherte Prozedur, Systemtabelle, Informationsstrukturansicht, ADO.NET Dokumentidentifikationscode: ② Bericht über praktische technische Leistungen (Technologie), Zusammenfassung des theoretischen Lernens und der sozialen Praxis (Sozialwissenschaften)
Rufen Sie gespeicherte Prozeduren in .NET auf die gleiche Weise auf
Zusammenfassung: Die Verwendung gespeicherter Prozeduren ist eine gute Angewohnheit bei der Entwicklung von Projekten. Sie stellt temporäre Tabellen, Funktionen und Cursor bereit, und auch das Debuggen, Aktualisieren und Warten kann davon profitieren. Fast alle Aufrufe einer gespeicherten Prozedur erfolgen jedoch nach demselben Muster Der Unterschied zwischen ihnen besteht in den Parametern jeder gespeicherten Prozedur. Können wir die gespeicherte Prozedur trotz ihrer Unterschiede auf die gleiche Weise aufrufen? Wir haben dies nach dem Studium von SQL Server und .NET getan Wenn Sie den Namen der gespeicherten Prozedur und die Werte ihrer Parameter angeben, müssen Sie die Parameter nicht selbst erstellen. Schlüsselwort: Stord-Prozedur, Systemtabelle, Informationsschema, ADO.NET
Zusammenfassung: Bei der Entwicklung eines Projekts rufen Sie häufig auf gespeicherte Prozeduren. Allerdings erfolgen fast alle Aufrufe gespeicherter Prozeduren nach dem gleichen Muster. Der Hauptunterschied liegt in der Art und dem Wert jedes erstellten Parameters. Ist es also möglich, alle gespeicherten Prozeduren über eine Funktion (oder Klasse) aufzurufen? In diesem Artikel wird eine einheitliche Aufrufmethode implementiert, die auf dem Prinzip der Verwendung der von der Datenbank bereitgestellten Systemtabellen basiert. Diese Methode muss lediglich den Namen der aufzurufenden gespeicherten Prozedur angeben und beim Aufruf bestimmte Parameterwerte bereitstellen, damit alle gespeicherte Prozedur aufgerufen werden kann.
Zusammenfassung: Wir müssen gespeicherte Prozeduren von Datenbanksystemen während der Entwicklung eines Projekts aufrufen. Der Aufruf gespeicherter Prozeduren ist jedoch fast gleich, der Hauptunterschied besteht im Unterschied zwischen Parametertyp oder -wert usw. Können wir gespeicherte Prozeduren aufrufen? Eine Funktion (oder eine Klasse)? Basierend auf den von Datenbanksystemen bereitgestellten Systemtabellen haben wir in diesem Artikel eine Klasse zum Aufrufen einer gespeicherten Prozedur geschrieben. Die einzigen Parameter, die Sie angeben, sind der Name der gespeicherten Prozedur und der Wert aller Parameter der gespeicherten Prozedur.
<DIV class=text4><B>1. Einleitung</B></DIV>
Bei der Entwicklung verschiedener Systeme ist die Verwendung gespeicherter Prozeduren eine gute Angewohnheit. Sie bietet nicht nur Funktionen wie temporäre Tabellen, Funktionen und Cursor, sondern erleichtert auch das Debuggen, Upgraden und die Wartung. Während des Speichervorgangs können die Daten verarbeitet und dann zurückgegeben werden, was eine bessere Analyse und Kontrolle der Daten ermöglicht. Bei den Aufrufen gespeicherter Prozeduren haben wir festgestellt, dass die Aufrufe gespeicherter Prozeduren fast dem folgenden Muster entsprechen:
1. SqlConnection deklarieren
2. Deklarieren Sie SqlCommand und legen Sie seine Connection-Eigenschaft auf die gerade deklarierte SqlConnection-Instanz fest, legen Sie CommandName auf den Namen der gespeicherten Prozedur und CommandType auf die gespeicherte Prozedur fest.
3. Fügen Sie alle für Aufrufe gespeicherter Prozeduren erforderlichen Parameter zur Parametersammlung der gerade deklarierten SqlCommand-Instanz hinzu 4. Rufen Sie die ExecuteReader()-Methode von SqlCommand auf, um den von der gespeicherten Prozedur zurückgegebenen Zeilensatz abzurufen.
4. Deklarieren Sie SqlDataAdapter und DataSet, legen Sie die SelectCommand-Eigenschaft von SqlDataAdapter auf die in 3 deklarierte Instanz fest und rufen Sie dann die Fill-Methode auf, um den zurückgegebenen Zeilensatz in das DataSet zu füllen.
5. Schließen Sie das SqlConnection-Objekt
6. Geben Sie jede deklarierte Objektinstanz frei (Hinweis: 4 bezieht sich auf die beiden Datenextraktionsmethoden. Wir haben festgestellt, dass sich fast alle gespeicherten Prozeduraufrufe in diesem Modus befinden. Der Unterschied liegt in der Speicherung in Schritt 2. Die unterschiedlichen Prozessnamen unterscheiden sich von den Parametern, die in jedem gespeicherten Prozeduraufruf in Schritt 3 verwendet werden. Sie unterscheiden sich in Parameternamen, Richtungen, Datentypen, Längen usw. Gibt es also eine Möglichkeit, alle Aufrufe gespeicherter Prozeduren zu implementieren? Das heißt, Sie müssen nur den Namen der gespeicherten Prozedur angeben und dann die Parameterwerte an die aufrufende Methode übergeben, um den Aufruf der gespeicherten Prozedur zu realisieren, und dann bestimmte Datenstrukturen verwenden, um den zurückgegebenen Zeilensatz, die ausgehenden Parameterwerte usw. zu speichern Prozessrückgabewerte. Nachdem wir die Systemtabellen von SQL Server untersucht hatten, stellten wir fest, dass diese Idee machbar ist.
2. Systemtabellen und Informationsstrukturansichten
Relationale Datenbanken wie SQL Server speichern Metadaten in gewisser Weise in der Datenbank. Bei SQL Server handelt es sich um die Systemdatenbank und die Systemtabellen. Nach der Installation von SQL Server werden automatisch vier Systemdatenbanken generiert: Master, Model, MSDB und TempDB. Die Masterdatenbank ist das Lager aller Informationen auf Systemebene in SQL Server. Anmeldekonten, Konfigurationseinstellungen, gespeicherte Systemprozeduren und das Vorhandensein anderer Datenbanken werden in der Masterdatenbank aufgezeichnet. Die msdb-Datenbank speichert SQL Server-Agent-Informationen. Wenn Jobs, Operatoren und Warnungen definiert werden, werden sie in msdb gespeichert. model ist eine Vorlage für alle benutzergenerierten Datenbanken. Wenn Sie eine neue Datenbank erstellen, kopieren Sie das Modell und erstellen Sie die erforderlichen Objekte. tempdb speichert temporäre Objekte in SQL Server. Die Anzeige generierter temporärer Tabellen und temporär gespeicherter Prozeduren sowie systemgenerierter temporärer Objekte nutzen alle tempdb. [1] Und jede Datenbank hat ihre eigenen Systemtabellen. Diese Systemtabellen werden zum Speichern von Konfigurations- und Objektinformationen verwendet. Aus diesen Systemtabellen können wir Informationen über alle Parameter jeder gespeicherten Prozedur abrufen. Diese Informationen werden in der Tabelle „syscolumns“ gespeichert. Es gibt Parameternamen, Typen, Längen, Richtungen usw., die in unserer Methode verwendet werden müssen. Allerdings ändern sich die Felder in den Systemtabellen mit der SQL Server-Version. Typ und xtype in syscolumns sind beispielsweise ein Beispiel für solche Änderungen. Beide speichern Typinformationen. Um unsere Methode an die Versionsänderungen von SQL Server anzupassen, müssen wir die Informationsstrukturansicht verwenden. ANSI-92 definiert Informationsstrukturansichten als eine Reihe von Ansichten, die Systemdaten bereitstellen. Durch die Nutzung dieser Ansicht können Sie die tatsächlichen Systemtabellen aus Ihrer Anwendung ausblenden. Änderungen an Systemtabellen wirken sich nicht auf Anwendungen aus, sodass Anwendungen unabhängig von Datenbankanbietern und -versionen sein können. [1] ANSI-92 und SQL Server unterstützen die Verwendung einer dreisegmentigen Namensstruktur, um auf Objekte auf dem lokalen Server zu verweisen. Die ANSI-92-Terminologie heißt „catalog.schema.object“, während SQL Server sie „database.owner.object“ nennt. [1] Wenn wir beispielsweise alle Parameterinformationen aller gespeicherten Prozeduren finden möchten, können wir Folgendes verwenden: select * from INFORMATION_SCHEMA.PARAMETERS Wenn wir alle Parameterinformationen einer bestimmten gespeicherten Prozedur finden möchten, ist dies: select * aus INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME ='Proc1 ' Mit der Informationsstrukturansicht wurden mehr als die Hälfte unserer Probleme gelöst. Als nächstes schauen wir uns an, wie wir unsere Methode in .NET implementieren.
3. Der Schwerpunkt der Implementierungsmethode liegt darauf, alle Parameterinformationen der gespeicherten Prozedur basierend auf ihrem Namen abzurufen und dann automatisch jeden Parameter basierend auf diesen Parameterinformationen zu erstellen. Um diese Aktionen zu automatisieren, sollte der Prozess der Deklaration von SqlConnection, SqlCommand und SqlParameter sowie der Prozess der Erstellung jedes SqlParameters für den Benutzer unsichtbar sein. Der Benutzer muss lediglich den Namen der gespeicherten Prozedur angeben und beim Aufruf verschiedene Parameter angeben, und selbst deren Typen müssen nicht angegeben werden.
3.1 Abrufen und Erstellen der Parameter der gespeicherten Prozedur Das Abrufen und Erstellen der Parameter der aufzurufenden gespeicherten Prozedur ist ein wichtiger Punkt. Wir können diesen Schritt automatisch über die Informationsstrukturansicht implementieren.
// Parameter der gespeicherten Prozedur abrufen und erstellen
private void GetProcedureParameter(params object[]parameter)
{ SqlCommand myCommand2 = new SqlCommand();
myCommand2.Connection = this.myConnection;
myCommand2.CommandText = "select * from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME = '" + this.ProcedureName + "' order by ORDINAL_POSITION";
SqlDataReader Reader = null; Reader = myCommand2.ExecuteReader(); // Rückgabeparameter erstellen
myParameter = new SqlParameter();
myParameter.ParameterName = "@Value";
myParameter . SqlDbType = SqlDbType.Int;
myParameter.Direction =
ParameterDirection.Parameters.Add(myParameter);
// Hier können Sie jeden Parameter automatisch erstellen
while(reader.Read())
{
myParameter = new SqlParameter();
myParameter.ParameterName = Reader["PARAMETER_NAME"].ToString();
myParameter.Direction = Reader["PARAMETER_MODE"].ToString()=="IN" ?ParameterDirection.Input:ParameterDirection.Output;
switch(reader["DATA_TYPE"].ToString()) {
case "int" :
if(myParameter.Direction == ParameterDirection.Input)
myParameter.Value = (int)parameters[i] ;
myParameter.SqlDbType=
SqlDbType.Int
; //...vielespezifische
Typverarbeitung wird weggelassen
}
i++
;
3.2 Rückgabeergebnisdatensatz, Rückgabewert und ausgehender Parametersatz Nachdem wir die Parameter der gespeicherten Prozedur erstellt haben, können wir die gespeicherte Prozedur aufrufen. Denn in .NET sind die am häufigsten verwendeten Klassen, die Ergebnismengen zurückgeben, SqlDataReader und DataSet, und SqlDataReader kann nur während der Aufrechterhaltung einer Verbindung verwendet werden, DataSet jedoch nicht. In unserer Implementierung soll die Verbindung nach dem Aufruf getrennt werden, daher wird ein DataSet zum Speichern der zurückgegebenen Ergebnismenge verwendet.
public SqlResult Call(params object[]parameters){ // SqlResult ist eine selbstdefinierte Klasse, die zum Speichern von Ergebnisdatensätzen, Rückgabewerten und ausgehenden Parametersätzen verwendet wird. result = new SqlResult(); // Definieren Sie Ihre eigene Verbindung als benötigt String
myConnection
= new SqlConnection(ConnectionString);
myCommand.CommandType
= CommandType.StoredProcedure
; // Get und erstellen Speichern Sie die Parameter der Prozedur und legen Sie die Werte fest.
GetProcedureParameter(parameters);
myAdapter.Fill(result.dataSet, "Table"); Holen Sie sich das ausgehende Parameterwert- und Namenspaar der gespeicherten Prozedur und speichern Sie es in einer Hashtable GetOutputValue(result) ; // Verschiedene Ressourcen hier freigeben und
myCommand.Dispose(
)
; myConnection.Dispose
(
);
4. Weitere Arbeiten Obwohl unsere Implementierung hier für die SQL Server-Datenbank gilt, kann diese Methode für jede Datenbank verwendet werden, die Informationsstrukturansichten bereitstellt, dem ANSI-92-Standard entspricht oder Metadaten bereitstellt. Wir kapseln es in eine SqlProcedure-Klasse, und die gespeicherte Prozedur kann bei Bedarf einfach aufgerufen werden, wodurch eine Menge sich grundsätzlich wiederholender Codearbeit reduziert wird. Damit die SqlProcedure-Klasse mehr Datentypen unterstützt, müssen Sie in der GetProcedureParameter()-Methode den Typ, die Richtung, die Länge, den Standardwert und andere Informationen jedes Parameters entsprechend Ihren eigenen Anforderungen analysieren und dann diesen Parameter erstellen. Grundsätzlich ist jeder Typ umsetzbar, auch Bildtypen können auf diese Weise erstellt werden. Auf diese Weise kann die Klasse sehr allgemein gehalten und in jedem Projekt nützlich sein.
Referenzen
[1] Ray Rankins, Paul Jensen, Paul Bertucci, SQL Server 2000 Practical Book, Beijing: Electronic Industry Press, 2002
[2] MSDN Library Januar 2003, Microsoft Corporation.
Über den Autor: Liu Zhibo (1979-), männlich, aus Xinhua, Hunan, Master-Abschluss, Hauptforschungsrichtungen: Neuronale Netzwerke und Mustererkennung, Büroautomatisierungsinformationssystem
E-Mail:[email protected]