none
ExecuteReader: Connection-Eigenschaft wurde nicht initialisiert. RRS feed

  • Frage

  • Hallo an Alle,

    hab da mal eine kleines Problem.

    Greife auf eine DB per SQL 2005 Express zu. Soweit so gut. Verbindung zum SQL / DB funzt. Beim Debuggen wird mir die obengenannte Fehlermeldung ausgegeben. Ich weis nicht weiter. Was ist falsch oder übersehe ich?

    Würde mich über Tips freuen.

    Hier der Code:

    Imports System.Data

    Imports System.Data.SqlClient

    Public Class frmHaupt

        Dim con As New SqlConnection

        Dim cmd As New SqlCommand

        Dim reader As SqlDataReader

        Dim strHelp As String

        Private Sub ConnectToSQL()

            Dim SN As Integer

            Try

                con.ConnectionString = "Data Source=ZZ1\SQLEXPRESS;Initial Catalog=QTB;User ID=QMS;Password=QMS9000"

                cmd.CommandText = "select * from dbo.T_QS_Service"

                con.Open()

                reader = cmd.ExecuteReader()

                reader.Read()

                SN = CInt(reader("SerienNr"))

            Catch ex As Exception

                MessageBox.Show("Error while connecting to SQL Server.    " & ex.Message)

                strHelp = ex.Message

            Finally

                con.Close() 'Whether there is error or not. Close the connection.

            End Try

        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            ConnectToSQL()

        End Sub

    End Class

    Samstag, 19. November 2011 20:09

Antworten

  • Hi,

    ändere die Deklarationszeile von "cmd" mal wie folgt:

      Dim cmd As SqlCommand

    Innerhalb der Methode ConnectToSql erstellst Du die Instanz dann wie folgt:

      cmd = New SqlCommand( "<SqlStatement>", con )

    Alternativ kannst Du auch vor der Zeile mit cmd.CommandText = ... folgendes einfügen:

      cmd.Connection = con

    Bei Finally bitte auch con.Dispose() aufrufen, ggfs. auch cmd.Dispose() (Merke: Alles, was eine Dispose Methode hat, sollte nach Verwendung auch explizit "disposed" werden)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 19. November 2011 20:22
    Moderator
  • Hallo Parsecccs,
    eigentlich hätte ich bei deinem Code eine NullReferenceException erwartet. Wo erzeugst du denn dein Command? Wie es aussieht hast du relevanten Code nicht gepostet.

    Vermutlich erzeugst du das Command Objekte mittels des new Operators. Optimalerweise erzeugt man ein Command aus der Connection, was übrigens dein Problem automatisch löst, da dem Command automatisch die (erzeugendende) Connection hizugefügt wird. Verwende einfach con.CreateCommand() und schon bist du deinen Fehler los, und dein Command ist gleich noch Datenbankprovider unabhängig :)

    Wie Stefan bereits richtigerweise angemerkt hat, solltest du die Connection, das Command, und den DataReader mittels Dispose() entsorgen, sonst erzeugst du dir Memleaks! Am besten, du verwendest dafür die Using Anweisung (hier eine Beispie mit einem DataReader):

    Using rdr As SqlDataReader = cmd.ExecuteReader()
        While rdr.Read()
             Console.WriteLine(rdr(0))
         End While
    End Using
    

    Genau das gleich solltest du mit dem Connection- und dem Commandobjekt machen ;)

    Somit wird dein DataReader automatisch disposed, wenn der Using-Scope verlassen wird, sogar dann, wenn innerhalb des Using-Scopes eine Exception auftritt. (Ist somit quasi ein Try Finally konstrukt).

     

    Ich hoffe ich konnte dir weiterhelfen...

    Viele Grüße
    Holger M. Rößler

    Kaum macht man es richtig, schon funktioniert es






    Sonntag, 20. November 2011 08:39

Alle Antworten

  • Hi,

    ändere die Deklarationszeile von "cmd" mal wie folgt:

      Dim cmd As SqlCommand

    Innerhalb der Methode ConnectToSql erstellst Du die Instanz dann wie folgt:

      cmd = New SqlCommand( "<SqlStatement>", con )

    Alternativ kannst Du auch vor der Zeile mit cmd.CommandText = ... folgendes einfügen:

      cmd.Connection = con

    Bei Finally bitte auch con.Dispose() aufrufen, ggfs. auch cmd.Dispose() (Merke: Alles, was eine Dispose Methode hat, sollte nach Verwendung auch explizit "disposed" werden)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 19. November 2011 20:22
    Moderator
  • Hallo Parsecccs,
    eigentlich hätte ich bei deinem Code eine NullReferenceException erwartet. Wo erzeugst du denn dein Command? Wie es aussieht hast du relevanten Code nicht gepostet.

    Vermutlich erzeugst du das Command Objekte mittels des new Operators. Optimalerweise erzeugt man ein Command aus der Connection, was übrigens dein Problem automatisch löst, da dem Command automatisch die (erzeugendende) Connection hizugefügt wird. Verwende einfach con.CreateCommand() und schon bist du deinen Fehler los, und dein Command ist gleich noch Datenbankprovider unabhängig :)

    Wie Stefan bereits richtigerweise angemerkt hat, solltest du die Connection, das Command, und den DataReader mittels Dispose() entsorgen, sonst erzeugst du dir Memleaks! Am besten, du verwendest dafür die Using Anweisung (hier eine Beispie mit einem DataReader):

    Using rdr As SqlDataReader = cmd.ExecuteReader()
        While rdr.Read()
             Console.WriteLine(rdr(0))
         End While
    End Using
    

    Genau das gleich solltest du mit dem Connection- und dem Commandobjekt machen ;)

    Somit wird dein DataReader automatisch disposed, wenn der Using-Scope verlassen wird, sogar dann, wenn innerhalb des Using-Scopes eine Exception auftritt. (Ist somit quasi ein Try Finally konstrukt).

     

    Ich hoffe ich konnte dir weiterhelfen...

    Viele Grüße
    Holger M. Rößler

    Kaum macht man es richtig, schon funktioniert es






    Sonntag, 20. November 2011 08:39
  • Hallo ihr beiden,

    danke für die superschnelle Antwort. Problem ist gelöst. Kaum arbeitet man mit Profis schon funktioniert es. Nochmals Danke.

    Sonntag, 20. November 2011 11:39