Visual Basic .NET: Fehler in SQL Server 7.0, wenn Sie Command.Prepare aufrufen, bevor Sie Parameter hinzufügen

Dieser Artikel wurde zuvor veröffentlicht unter D310368
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
310368 PRB: Error in SQL Server 7.0 When You Call Command.Prepare Before You Add Parameters Using Visual Basic .NET
Eine Version dieses Artikels für Microsoft Visual C# .NET finden Sie unter 311348.



Problembeschreibung
Wenn Sie einen parametrisierten Befehl für Microsoft SQL Server 7.0 erstellen und die Prepare-Methode aufrufen, bevor Sie Parameter zu dem Befehl hinzufügen, wird die folgende Fehlermeldung angezeigt:
Eine nicht behandelte Ausnahme des Typs 'System.Data.SqlClient.SqlException' ist in system.data.dll aufgetreten.
Weitere Informationen: Systemfehler.
Dieses Problem tritt bei SQL Server 2000 nicht auf.
Ursache
Dieses Problem tritt bei SQL Server 7.0 auf, weil Sie die Prepare-Methode programmtechnisch bedingt nicht vor dem Hinzufügen von Parametern ausführen können. Dies trifft auf die meisten Datenbanksysteme zu.

SQL Server 2000 erzeugt die oben beschriebene Ausnahme nicht, weil er Prepare erst ausführt, nachdem der erste Befehl ausgeführt wurde. Diese Optimierung verhindert den Overhead von Prepare, wenn nachfolgend keine Befehle ausgeführt werden.
Lösung
Um dieses Problem zu beheben, rufen Sie die Prepare-Methode erst nach dem Hinzufügen der Parameter auf.
Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

Im folgenden Beispielcode wird die Tabelle Region der Northwind-Beispieldatenbank verwendet.
Achtung: Diese Codebeispiele basieren auf den Beispieldatenbanken der englischsprachigen Versionen von Microsoft SQL Server oder Microsoft Access. Sie können sie nicht mit den deutschsprachigen Beispieldatenbanken von SQL Server oder Access verwenden. Verwenden Sie entweder die englischsprachigen Versionen dieser Datenbanken, oder passen Sie die Codebeispiele so an, dass sie auf die deutschen Beispieldatenbanken und die deutschsprachigen Datenbankobjekte verweisen.
  1. Öffnen Sie Microsoft Visual Studio .NET.
  2. Erstellen Sie ein neues Visual Basic Windows-Anwendungsprojekt. Form1 wird standardmäßig zu dem Projekt hinzugefügt.
  3. Stellen Sie sicher, dass Ihr Projekt eine Referenz auf den System.Data-Namespace enthält. Wenn dies nicht der Fall ist, fügen Sie eine Referenz zu diesem Namespace hinzu.
  4. Setzen Sie eine Command-Schaltfläche auf Form1. Ändern Sie die Name-Eigenschaft der Schaltfläche in btnTest und die Text-Eigenschaft in Test.
  5. Wenden Sie die Imports-Anweisung auf die Namespaces System, System.Data und System.Data.SqlClient an, damit Sie später in Ihrem Code keine Deklarationen in diesen Namespaces bestimmen müssen. Fügen Sie den folgenden Code zum Abschnitt Allgemeine Deklarationen von Form1 hinzu:
    Imports SystemImports System.Data.OleDbImports System.Data.SqlClient
  6. Fügen Sie den folgenden Code nach dem Bereich "Vom Windows Form-Designer generierter Code" in das Codefenster ein:
        Private Sub btnTest_Click(ByVal sender As System.Object, _    ByVal e As System.EventArgs) Handles btnTest.Click        Dim myConnString As String = _            "User ID=sa;password=sa;Initial Catalog=Northwind;Data Source=myServer"        Dim id As Integer = 25        Dim desc As String = "myFirstRegion"        Dim rConn As SqlConnection = New SqlConnection(myConnString)        rConn.Open()        Dim command As SqlCommand = New SqlCommand("", rConn)        command.CommandText = "insert into Region (RegionID, RegionDescription)" & _                              "values (@id, @desc)"        'SQL Server 7.0 throws an exception here.        'Comment the following line to resolve this problem against SQL Server 7.0.        command.Prepare()        command.Parameters.Add("@id", SqlDbType.Int, 4)        command.Parameters.Add("@desc", SqlDbType.Char, 50)        'You can call Prepare after you set up CommandText and parameters.        command.Prepare()         command.Parameters(0).Value = id        command.Parameters(1).Value = desc        command.ExecuteNonQuery()        MessageBox.Show("Updated Successfully")    End Sub
  7. Ändern Sie die Verbindungszeichenfolge (myConnString) entsprechend Ihrer Umgebung.
  8. Speichern Sie das Projekt. Klicken Sie im Menü Debuggen auf Starten und führen Sie das Projekt aus.
  9. Klicken Sie auf Testen. Wenn Sie mit einer SQL Server 7.0-Datenbank verbunden sind, erzeugt der Code die oben beschriebene Ausnahme.

    Wenn Sie mit einer SQL Server 2000-Datenbank verbunden sind, wird der Code korrekt ausgeführt und das Meldungsfeld "Erfolgreich aktualisiert" (Updated Successfully) angezeigt.
  10. Um dieses Problem bei SQL Server 7.0 zu beheben, müssen Sie den Aufruf an command.Prepare, der dem Code zum Hinzufügen der Parameter vorausgeht, auskommentieren und anschließend das Projekt erneut ausführen.
Informationsquellen
Weitere Informationen zu ADO.NET-Objekten und -Syntax finden Sie unter dem folgenden Thema in der Microsoft .NET Framework Software Development Kit (SDK)-Dokumentation:

Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Prepare System.Data.SqlClient.SqlException
Eigenschaften

Artikelnummer: 310368 – Letzte Überarbeitung: 02/24/2014 06:07:40 – Revision: 1.3

Microsoft ADO .NET (Bestandteil von .NET-Framework), Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft SQL Server 7.0 Standard Edition

  • kbnosurvey kbarchive kbnofix kbprb kbgrpdsvbdb kbgrpdsmdac KB310368
Feedback