Objektverweis nicht an Objektinstanz gebunden ?

11/09/2008 - 16:12 von Frank Pacher (SachsenHessi) | Report spam
Hallo,

ich habe folgendes Problem:
In einer Methode wird folgender Fehler ausgelöst:
"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
Auf dem EntwicklungsPC làuft das Programm, auf dem Zielrechner
gibts obrige Fehlermeldung, wenn ich die Exeption.Message anzeige.
Kann mir jemand sagen, was ich falsch mache ?
Danke
Frank

verkürzter Beispielcode:
Public Class clsMyClassXY
Dim p_sConStrgFiliale As String = "" 'ConnectionString zur DB der Filiale
Dim p_oConnFiliale As New FirebirdSql.Data.Firebird.FbConnection

Public Sub XYZ()
messagebox.show(Test()) 'Rückgabe von Test() anzeigen
End Sub

Private Function Test() As Integer
Dim sSql as string = "SELECT * From xy;")

Dim oCmdFiliale As New FirebirdSql.Data.Firebird.FbCommand
Try
m_BuildDBConnStrings()
m_BuildConnections()
'Öffenen der Datenverbindungen
p_oConnFiliale.Open()
'Connection
oCmdFiliale.Connection = p_oConnFiliale
'SQL-Statement bilden
oCmdFiliale.CommandText = sSQL
Dim oDRF As FirebirdSql.Data.Firebird.FbDataReader
oDRF = oCmdFiliale.ExecuteReader
Do While (oDRF.Read())
'jetzt die Datensàtze Durchlaufen und auswerten
If NOT String.IsNullOrEmpty(oDRF("ColumnX")) Then
IF oDRF("ColumnX")="1" then
sStr = oDRF("ColumnX")
p_oConnFiliale.Close() '<- Fehler !
Return 2
Endif
End If
Loop
'Wenn Nix gefunden
p_oConnFiliale.Close() '< Fehler !
Return 0
Catch ex As Exception
Try
p_oConnFiliale.Close() '<-- Fehler !
Catch ex2 As Exception
Return 0
End Try
Return iRet
End Try
End Function


' Bildet die beiden Connect-Strings (als Klassen-Variable)
Private Function m_BuildDBConnStrings() As Boolean
Dim sDBIP As String
Dim sDBName As String
Dim sDBuser As String
Dim sDBPw As String
Try
'Filialstring
sDBIP = "192.168.1.10"
sDBName = "D:\meineDB.gdb"
sDBUser = "Nutzer"
sDBUser = "passwort"
p_sConStrgFiliale = String.Concat("User=", sDBuser, ";", "Password=",
sDBPw, ";", "Database=", sDBName, ";", "DataSource=", sDBIP, ";", _
"Connection lifetime;", "Dialect=3;", "Charset=ISO8859_1;")

Catch ex As Exception
MessageBox.Show("Fehler")
Return False
End Try
End Function

'Bildet die ConnectionObjecte (Klassen-Variable)
Private Function m_BuildConnections() As Boolean
Dim oConStrgFiliale As New
FirebirdSql.Data.Firebird.FbConnectionStringBuilder
Try
'Filiale bilden
oConStrgFiliale.ConnectionString = p_sConStrgFiliale
p_oConnFiliale.ConnectionString = oConStrgFiliale.ToString.Trim
Return True
Catch ex As Exception
MessageBox.Show("Fehler"
Return False
End Try
End Function
End Class
 

Lesen sie die antworten

#1 Elmar Boye
11/09/2008 - 17:24 | Warnen spam
Hallo Frank,

Frank Pacher (SachsenHessi) schrieb:
ich habe folgendes Problem:
In einer Methode wird folgender Fehler ausgelöst:
"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
Auf dem EntwicklungsPC làuft das Programm, auf dem Zielrechner
gibts obrige Fehlermeldung, wenn ich die Exeption.Message anzeige.
Kann mir jemand sagen, was ich falsch mache ?



Grundsàtzlich als falsch würde ich Deine Art der Ausnahmebehandlung
ansehen. Etwas wie

Catch ex As Exception
MessageBox.Show("Fehler")
Return False
End Try



tut man nicht.
(Das ist mehr oder weniger ein Nachbau von On Error Resume Next
aus alten VB Zeiten und war da schon àußerst selten richtig).

Lass das Return false weg (und am besten auch die nichtssagende MessageBox)
und behandele den Fehler oben im àusseren Catch.

Für den Abschnitt, in dem Du den ConnectionString und Connection bastelst:
Anstatt einen (sinnfreien) Boolean zu liefern, gebe den Wert selbst
zurück und verzichte auf die "Übergabe" via privater Variable.
Werden es mal mehrere, so schadet die eine oder andere Funktion mehr
der Übersichtlichkeit meist nicht. Oder man verwendet bei privaten
Methoden mal einen ByRef Parameter als Rückgabe.

Anstatt dort mehrere Close zu verteilen - und dabei zu vergessen,
den Reader zu schliessen - solltest Du using verwenden, das seit
VB 2005 existiert.

Zum Nachvollziehen wie ich das konkret meine, habe ich Deinen
Code mal etwas umgebaut (allerdings ungetestet).

Da ich nicht erst einen FireBird Provider installieren wollte,
habe ich für die Demo ersatzhalber den SqlClient verwendet.
Das sollte Du aber durch 2 Änderungen (Imports und in GetFilialeConnection)
umstellen können, sofern Dein Firebird Provider auf gemeinsamen
Db...Klassen basiert - ansonsten könnte es via IDb...Schnittstellen laufen.

Gruß Elmar

///
Imports System.Data.Common

' Da kàme nun FirebirdSql.Data.Firebird hin
Imports System.Data.SqlClient

Public Class clsMyClassXY
Public Sub XYZ()
Try
MessageBox.Show("Ergebnis: " & Test().ToString()) 'Rückgabe von Test() anzeigen
Catch ex As Exception
' Das simulierte "User Interface"
MessageBox.Show("Fehler beim Abruf: " & ex.Message)
End Try
End Sub

Private Function Test() As Integer
Const sSql As String = "SELECT ColumnX From xy;" ' Bitte kein "*"

Try
Using connection As DbConnection = GetFilialeConnection()
connection.Open()

Using oCmdFiliale As DbCommand = connection.CreateCommand()
oCmdFiliale.CommandText = sSql

Using oDRF As DbDataReader = oCmdFiliale.ExecuteReader

' Spaltenindex bestimmen (ist effizienter)
Dim columnXIndex As Integer = oDRF.GetOrdinal("ColumnX")

Do While oDRF.Read()
' wenn es wirklich ein String ist
If oDRF.GetString(columnXIndex) = "1" Then
Return 2
End If

' wenn es doch ein Integer ist wàre besser
'If Not oDRF.IsDBNull(columnXIndex) Then
' If oDRF.GetInt32(columnXIndex) = 1 Then
' Return 2
' End If
'End If
Loop
End Using
End Using
End Using
Catch exception As DbException ' bzw. die spezifische FireBird Exception
' Protokollieren (dazu gehört dann ein TraceListener ...
System.Diagnostics.Trace.WriteLine("clsMyClassXY.Test", exception.ToString())

' Behandelt (angezeigt)sollte das nur in einem User Interface),
' ansonsten lieber sterben lassen
' denn fehlschlagen kann das nur, wenn richtig was kaputt ist
Throw
End Try
Return 0
End Function

Private Function GetFilialeConnection() As DbConnection
Return New SqlConnection(CreateConnectionString())
End Function

' Bildet die beiden Connect-Strings (als Klassen-Variable)
Private Function CreateConnectionString() As String
' die zweite ist hier nicht zu erkennen
' hier könnte dann ein Parameter die "richtige" bestimmen

Dim sDBIP As String
Dim sDBName As String
Dim sDBuser As String
Dim sDBPw As String
'Filialstring
sDBIP = "192.168.1.10"
sDBName = "D:\meineDB.gdb"
sDBuser = "Nutzer"
sDBPw = "passwort"
Return String.Concat("User=", sDBuser, ";", "Password=", sDBPw, ";", "Database=", sDBName, ";", "DataSource=", sDBIP, ";", _
"Connection lifetime;", "Dialect=3;", "Charset=ISO8859_1;")
End Function
End Class

\\\

Ähnliche fragen