Freigeben über


Gewusst wie: Debuggen einer Datenbankanwendung mit mehreren Ebenen

Dieses Thema gilt für folgende Editionen:

Visual Studio Ultimate

Visual Studio Premium

Visual Studio Professional

Visual Studio Express

ms165062.DoesApplybmp(de-de,VS.100).gif ms165062.DoesApplybmp(de-de,VS.100).gif ms165062.DoesApplybmp(de-de,VS.100).gif ms165062.DoesNotApplybmp(de-de,VS.100).gif

Dieses Thema enthält Beispielcode, der das Debuggen einer Datenbankanwendung mit mehreren Ebenen veranschaulicht. Es beschreibt die Schritte zum Debuggen aus Anwendungscode einer Anwendung der Client- oder mittleren Ebene in Transact-SQL-Code für ein Datenbankobjekt, das in einer SQL Server-Instanz ab SQL Server 2005 ausgeführt wird.

Übergänge zwischen der Anwendungsebene und der Datenbankebene erfordern einen Haltepunkt in der Zielebene. Andernfalls wird der Code einfach weiter ausgeführt, wenn Sie versuchen, einen Einzelschritt in die Ebene auszuführen.Bei Übergängen zwischen Transact-SQL- und SQL CLR-Code innerhalb der Datenbankebene sind jedoch keine Haltepunkte erforderlich, um zwischen ihnen zu wechseln.

Im folgenden Beispiel werden eine C#-Konsolenanwendung, eine SQL Server-Datenbanktabelle mit dem Namen Currency und zwei gespeicherte Prozeduren verwendet, um zwischen C# und Transact-SQL zu wechseln.Das Beispiel ist kein reales Geschäftsszenario, sondern soll lediglich diese Übergänge veranschaulichen.

Zwei gespeicherte Prozeduren werden aufgerufen:

  • DeleteCurrency ist eine gespeicherte Transact-SQL-Prozedur, die eine Währung mit einem angegebenen Währungscode löscht.

  • DeleteCurrencyDriver ist ebenfalls eine gespeicherte Transact-SQL-Prozedur.Sie ruft die vorangehende gespeicherte Prozedur mit einem Eingabeparameter auf, der den zu löschenden Währungscode angibt.

Im Anwendungscode werden beide gespeicherte Prozeduren aufgerufen, wobei ein Währungscodeparameter übergeben wird.Die nicht als Treiber fungierende gespeicherte Prozedur wird in zwei verschiedenen Kontexten aufgerufen, in DeleteCurrencyDriver und direkt in der Anwendung.Im ersten Kontext können Sie von DeleteCurrencyDriver aus einen Einzelschritt in die anderen gespeicherten Prozeduren ausführen, indem Sie auf die Schaltfläche Einzelschritt klicken.Beim Aufruf in der Anwendung ist ein direkter Einzelschritt nicht möglich, und es müssen Haltepunkte in den gespeicherten Prozeduren festgelegt werden.

Erstellen der Transact-SQL-Datenbankobjekte für diese Demo

  1. Erstellen Sie mit dem Code aus dem ersten Beispiel in einer beliebigen Datenbank aus SQL Server 2005 oder höher die Currency-Tabelle und die zwei gespeicherten Prozeduren.

    1. Öffnen Sie den Transact-SQL-Editor in Visual Studio, und stellen Sie eine Verbindung mit der Datenbank her, die Sie für dieses Beispiel verwenden können.Weitere Informationen finden Sie unter Gewusst wie: Starten des Transact-SQL-Editors und Gewusst wie: Herstellen einer Datenbankverbindung im Transact-SQL-Editor.

    2. Kopieren Sie den Transact-SQL-Code aus dem ersten Beispiel, und fügen Sie ihn in den Transact-SQL-Editor ein.

    3. Ersetzen Sie <database> durch den entsprechenden Datenbanknamen, und klicken Sie dann auf der Transact-SQL-Editor-Symbolleiste auf SQL ausführen.

  2. Wenn Sie den Transact-SQL-Editor im Kontext eines SQL Server-Datenbankprojekts oder -Serverprojekts geöffnet haben, schließen Sie das Projekt, bevor Sie fortfahren.Andernfalls können Sie den Transact-SQL-Editor geöffnet lassen und fortfahren.

Vorbereiten des Server-Explorers für das Debuggen mehrerer Ebenen

  1. Stellen Sie sicher, dass das Transact-SQL-Debugging für den Computer aktiviert wurde.Weitere Informationen finden Sie unter Gewusst wie: Aktivieren des Transact-SQL-Debuggings.

  2. Klicken Sie im Menü Ansicht auf Server-Explorer, um den Server-Explorer zu öffnen.

  3. Erstellen Sie im Server-Explorer eine neue Datenverbindung, indem Sie mit der rechten Maustaste auf Datenverbindungen klicken und Verbindung hinzufügen auswählen.Dadurch wird das Dialogfeld Verbindung hinzufügen geöffnet.

  4. Erstellen Sie eine Verbindung mit der Datenbank, in der Sie die Currency-Tabelle erstellt haben.Der für die Verbindung verwendete Benutzername muss ein Mitglied der festen Serverrolle sysadmin sein.Weitere Informationen finden Sie unter Gewusst wie: Herstellen einer Datenbankverbindung mit dem Server-Explorer.

  5. Suchen Sie unter dem Knoten Datenverbindungen nach der soeben erstellten neuen Datenverbindung.

  6. Klicken Sie mit der rechten Maustaste auf die neue Datenverbindung, und klicken Sie auf Anwendungsdebuggen.Dadurch wird das Debuggen mehrerer Ebenen für die in der Verbindung angegebene Datenbank aktiviert.

Vorbereiten der C#-Konsolenanwendung für das Debuggen mehrerer Ebenen

  1. Bereiten Sie in der Visual Studio-Instanz, in der Sie den Server-Explorer vorbereitet haben, eine C#-Konsolenanwendung vor, die die gespeicherte Prozeduren DeleteCurrencyDriver und DeleteCurrency ausführt.

    1. Öffnen Sie eine neue C#-Konsolenanwendung, indem Sie im Menü Datei auf Neues Projekt klicken.

    2. Kopieren Sie den C#-Code aus dem zweiten Beispiel, und ersetzen Sie den gesamten Code in der vom Projekt erstellten Datei Program.cs durch diesen Code.

  2. Aktivieren Sie in den Konsolenanwendungseigenschaften auf der Registerkarte Debuggen die Option SQL Server-Debugging aktivieren.Dadurch wird das Debuggen mehrerer Ebenen für die Konsolenanwendung aktiviert.Weitere Informationen finden Sie unter Gewusst wie: Aktivieren des Transact-SQL-Debuggings für ein C++-, Visual Basic- oder C#-Projekt.

Debuggen der Konsolenanwendung mit mehreren Ebenen

  1. Fügen Sie im C#-Code (Datei Program.cs) Haltepunkte vor und nach jedem Aufruf einer gespeicherten Prozedur ein.

  2. Fügen Sie Haltepunkte in den gespeicherten Prozeduren ein.Hinweis: Ein Einzelschritt von C#-Code in Transact-SQL-Code ist nicht möglich, Sie können aber zwischen SQL Server-Datenbankobjekten wechseln.

    1. Suchen Sie im Server-Explorer unter der neuen Datenverbindung nach den neuen gespeicherten Prozeduren.

    2. Klicken Sie mit der rechten Maustaste auf die gespeicherte Prozedur DeleteCurrency, und klicken Sie auf Öffnen.Dadurch wird ein Transact-SQL-Editor-Fenster geöffnet, in dem die gespeicherte Prozedur DeleteCurrency angezeigt wird.Legen Sie einen Haltepunkt in der Zeile SET NOCOUNT ON fest, indem Sie in die graue Leiste auf der linken Seite des Editors klicken.

    3. Klicken Sie mit der rechten Maustaste auf die gespeicherte Prozedur DeleteCurrencyDriver, und klicken Sie auf Öffnen.Dadurch wird ein Transact-SQL-Editor-Fenster geöffnet, in dem die gespeicherte Prozedur DeleteCurrencyDriver angezeigt wird.Legen Sie einen Haltepunkt in der Zeile SET NOCOUNT ON fest, indem Sie in die graue Leiste auf der linken Seite des Editors klicken.

  3. Drücken Sie F5, um die Anwendung auszuführen.

  4. Führen Sie die unterschiedlichen Module schrittweise aus.

  5. Versuchen Sie, einige der Haltepunkte zu entfernen, um zu sehen, wie sich ein Wechsel zwischen unterschiedlichen Ebenen und Sprachen auswirkt.

  6. Löschen Sie zum Beenden des Debuggens über das Visual Studio-Menü Debuggen alle Haltepunkte, und drücken Sie F5.

Beispiel

Dieser Abschnitt enthält den Transact-SQL-Code, durch den die Currency-Tabelle und die zwei gespeicherten Prozeduren erstellt werden: DeleteCurrency und DeleteCurrencyDriver. Ersetzen Sie <database>durch den Namen der entsprechenden Datenbank.

USE <database>
GO
CREATE TABLE Currency
(CurrencyCode nvarchar(1))

INSERT Currency 
VALUES (N'A'),(N'B'),(N'C'),(N'D')

SELECT * FROM Currency 
GO

CREATE PROCEDURE dbo.DeleteCurrency
    (
        @CurrencyCode nvarchar(3)
    )
AS
    SET NOCOUNT ON
    DELETE Currency 
      WHERE CurrencyCode = @currencyCode 
    RETURN
GO

CREATE PROCEDURE dbo.DeleteCurrencyDriver
    (
        @CurrencyCode nvarchar(3)
    )
AS
    SET NOCOUNT ON
    EXECUTE DeleteCurrency @CurrencyCode 
    RETURN
GO

Dieser Abschnitt enthält den C#-Code der Konsolenanwendung, durch den die gespeicherten Prozeduren DeleteCurrencyDriver und DeleteCurrency aufgerufen werden.Ersetzen Sie <server> und <database> durch die Instanz bzw. den Namen der Datenbank, in der sich die Currency-Tabelle befindet.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
            builder.DataSource = <server>;
            builder.IntegratedSecurity = true;
            builder.InitialCatalog = <database>;
 
            SqlConnection SqlConnection1 = new SqlConnection(builder.ConnectionString);
            SqlConnection1.Open();
 
            SqlCommand procCommand = new SqlCommand();
            procCommand.CommandText = "DeleteCurrencyDriver";
            procCommand.CommandType = CommandType.StoredProcedure;
            procCommand.Connection = SqlConnection1;

            // Fill parameters collection for the stored procedure.SqlParameter workParam = null;
            workParam = procCommand.Parameters.Add("@CurrencyCode", SqlDbType.NChar, 1);
            procCommand.Parameters["@CurrencyCode"].Value = "B";
            
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { Console.WriteLine(e.Message); }
 
            //Execute DeleteCurrency stored procedure directly
            procCommand.CommandText = "DeleteCurrency";
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { Console.WriteLine(e.Message); }
 
            SqlConnection1.Close();
            Console.WriteLine("Press any key to close...");
            Console.Read();
        }
    }
}

Siehe auch

Aufgaben

Gewusst wie: Aktivieren des Transact-SQL-Debuggings für ein C++-, Visual Basic- oder C#-Projekt

Gewusst wie: Aktivieren des Debuggings mehrerer Ebenen

Gewusst wie: Aktivieren des Transact-SQL-Debuggings