Zum Inhalt springen

VB 6 - unerklärlicher Rücksprung aus einer Funktion


Empfohlene Beiträge

Geschrieben

Hallo zusammen,

wie schon durch den Threadtitel deutig bekomme ich einen seltsamen (weil ungewollten und unerklärlichen) Rücksprung aus einer Funktion.


Public Function get_free_install_id() As Integer

Dim lngFehler As Long

Dim intInstallID As Integer

    modDatenbank.sqlQuery.CommandText = "select max(installations_id) from " & strQualifier & ".installationstabelle;"

    [COLOR="Red"]Set modDatenbank.rsValues = modDatenbank.sqlQuery.Execute[/COLOR]

    On Error Resume Next

        intInstallID = CInt(modDatenbank.rsValues.Fields(0).Value) + 1

        lngFehler = Err.Number

    On Error GoTo 0

    If lngFehler <> 0 Then

        get_free_install_id = 1

    Else

        get_free_install_id = intInstallID

    End If

End Function

letzte Ausgeführte Zeile vor dem Rücksprung aus der Funktion Dies ist eine von drei fast identischen Funktionen, von denen die anderen beiden wie gewünscht funktionieren. (Ich habe sie mit Copy&Paste erzeugt und lediglich die Tabellen- und ID-Namen geändert) Die Deklarationen im Modul modDatenbank lauten:

Public rsValues As Recordset

Public sqlQuery As New Command

Visual Basic 6.0 SP3 auf Microsoft Windows XP [Version 5.1.2600]

Geschrieben


Public rsValues As Recordset

Public sqlQuery As New Command

was hast du in den verweisen drin? nur ADO, ADO und DAO?

versuch mal Recordset als ADO.Recordeset zu deklarieren.

übergib dem CommandType von deinem Command.Execute ein adCmdText, so muss ADO sich nicht anstrengen um herauszufinden ob dein SQL ein SQL, eine tabelle, stored proc, etc. ist.

Visual Basic 6.0 SP3 auf Microsoft Windows XP [Version 5.1.2600]

VB6 SP6 ist übrigens die aktuellste ;-)

s'Amstel

Geschrieben

Public rsValues As Recordset

Public sqlQuery As New Command

was hast du in den verweisen drin? nur ADO, ADO und DAO?

[...]

Habe nur ADO 2.7 gehabt, jetzt ADO 2.7 und DAO 3.6

[...]

versuch mal Recordset als ADO.Recordeset zu deklarieren.

übergib dem CommandType von deinem Command.Execute ein adCmdText, so muss ADO sich nicht anstrengen um herauszufinden ob dein SQL ein SQL, eine tabelle, stored proc, etc. ist.

[...]

Habe ich jetzt. Das Problem besteht weiterhin. Und vor allen Dingen wundert es mich, daß es bei den zwei vorhergegangenen Funktionen einwandfrei geklappt hat und bei der dritten Funktion der Ausstieg kommt.

[...]

VB6 SP6 ist übrigens die aktuellste ;-)

s'Amstel

Hmm, an SP6 komme ich nicht dran um es zu installieren.

Geschrieben
Habe ich jetzt. Das Problem besteht weiterhin. Und vor allen Dingen wundert es mich, daß es bei den zwei vorhergegangenen Funktionen einwandfrei geklappt hat und bei der dritten Funktion der Ausstieg kommt.

wird die funktion einfach beendet, d.h. zum End Function gesprungen? was steht dann in Err.Number bzw. Err.Description drin?

Hmm, an SP6 komme ich nicht dran um es zu installieren.

sorry, is mir nicht ganz klar, was du meinst. meinst du, du kommst mangels genügender rechte lokal nicht dran, oder konntest du das SP nicht ausfindig machen? hier zu finden und wärmstens zu empfehlen: http://www.microsoft.com/downloads/details.aspx?familyid=9EF9BF70-DFE1-42A1-A4C8-39718C7E381D&displaylang=de

s'Amstel

Geschrieben
wird die funktion einfach beendet, d.h. zum End Function gesprungen? was steht dann in Err.Number bzw. Err.Description drin?

[...]

Wenn ich es durchtrace, dann springt er einfach nach dem .execute-Befehl zu der Stelle an der die Funktion aufgerufen wurde (ohne je das End Function zu erreichen, es sieht so aus, als ob dort ein Exit Funktion wäre, ist es aber mit Sicherheit nicht) Err.Description hat zu diesem Zeitpunkt keinen Wert, da es erst nach dem On Error Resume Next initialisiert wird und dahin komme ich leider nicht.

[...]

sorry, is mir nicht ganz klar, was du meinst. meinst du, du kommst mangels genügender rechte lokal nicht dran, oder konntest du das SP nicht ausfindig machen? hier zu finden und wärmstens zu empfehlen: http://www.microsoft.com/downloads/details.aspx?familyid=9EF9BF70-DFE1-42A1-A4C8-39718C7E381D&displaylang=de

s'Amstel

Rechte habe ich schon, bloß ich sitze hier am Firmen-PC mit einer automatischen und angepassten Softwareverteilung, so daß ich diesen Schritt ungerne gehen würde. Versuche ich aber jetzt als ultima ratio. Danke für den Link. :)

Geschrieben

Hi,

ich würde eventuell mal versuchen, den Command auf Prozedurebene zu deklarieren, zudem ist die Deklaration mit "AS New XXX" nicht sonderlich gut, weil die Objekte nie den Zustand "nothing" erreichen.

"On Error Resume Next" initialisiert das Err-Objekt nicht, es schaltet die Fehlerhandlung aus!

Ob das jetzt ein Problem ist kann ich nicht sagen, jedoch sollte man sparsam damit umgehen, da die Fehlerbehandlung projektweit ausgeschaltet wird.

(In Deinem Fall sollte das "On Error Goto 0" die Sache jedoch wieder aufheben).

Wenn Du ADO schon drin hast, nimm DAO wieder raus.

Mit der Installation vom SP 6 wäre ich vorsichtig, zumindest wenn man einige Controls aus der CommonControls verwendet, manche Dinge gehen mit dem SP 6 nicht mehr (oder unter größeren Umständen).

SP 5 sollte jedoch auf jeden Fall installiert sein, da sind einige Änderungen geschehen.

Einen schönen Abend.

Geschrieben
Hi,

ich würde eventuell mal versuchen, den Command auf Prozedurebene zu deklarieren, zudem ist die Deklaration mit "AS New XXX" nicht sonderlich gut, weil die Objekte nie den Zustand "nothing" erreichen.

Wenn ich den Command auf Prozedurebene deklariere, dann fehlt mir noch die Zuweisung des Command zu der jeweiligen Connection. Ich weise bei dem Connect auf die jeweilige Datenbank noch die .ActiveConnection zu.


'modDatenbank

Public Function connect_db_odbc(ByVal strDatenbank As String, ByVal strUser As String, strPassword As String) As Boolean

On Error Resume Next

    Set connDatenbank = New Connection

    connDatenbank.CursorLocation = adUseClient

    connDatenbank.Open "Data Source=" & strDatenbank & "; User ID=" & strUser & "; PWD=" & strPassword

    strPassword = ""

    sqlValues.ActiveConnection = connDatenbank

    sqlValues.CommandType = adCmdText

    lngFehler = Err.Number

On Error GoTo 0

    If lngFehler = 0 Then connect_db_odbc = True Else connect_db_odbc = False

End Function

"On Error Resume Next" initialisiert das Err-Objekt nicht, es schaltet die Fehlerhandlung aus!

Ob das jetzt ein Problem ist kann ich nicht sagen, jedoch sollte man sparsam damit umgehen, da die Fehlerbehandlung projektweit ausgeschaltet wird.

(In Deinem Fall sollte das "On Error Goto 0" die Sache jedoch wieder aufheben).

Stimmt. Err.Number ist aber vom Aufruf der Function bis zu dem ominösen Exit = 0

Wenn Du ADO schon drin hast, nimm DAO wieder raus.

Erledigt.

Mit der Installation vom SP 6 wäre ich vorsichtig, zumindest wenn man einige Controls aus der CommonControls verwendet, manche Dinge gehen mit dem SP 6 nicht mehr (oder unter größeren Umständen).

SP 5 sollte jedoch auf jeden Fall installiert sein, da sind einige Änderungen geschehen.

Einen schönen Abend.

Habe jetzt schon den SP6 drauf. Bis jetzt noch keine Seiteneffekte.

Geschrieben

Ok. Das Problem besteht nicht mehr seit ich den Aufruf der Function nicht mehr aus einem 'On Error Resume Next ... On Error GoTo 0'-Block durchführe, obwohl es zwei Mal vorher geklappt hat. Komsiches Verhalten. :rolleyes: Aber danke Euch für die Mühe.

Geschrieben
Wenn ich den Command auf Prozedurebene deklariere, dann fehlt mir noch die Zuweisung des Command zu der jeweiligen Connection. Ich weise bei dem Connect auf die jeweilige Datenbank noch die .ActiveConnection zu.

--> Das kannst Du ja bequem über einen 2. Paremeter in der Funktion machen:


Public Function get_free_install_id(ByRef oActiveCon As ADODB.Connection _

) As Integer


Dim lngFehler As Long

Dim intInstallID As Integer


-->    HIER die Zuweisung

    Set modDatenbank.sqlQuery.ActiveConnection = oActiveCon

-->


    modDatenbank.sqlQuery.CommandText = "select max(installations_id) from " & strQualifier & ".installationstabelle;"

    Set modDatenbank.rsValues = modDatenbank.sqlQuery.Execute

    On Error Resume Next

        intInstallID = CInt(modDatenbank.rsValues.Fields(0).Value) + 1

        lngFehler = Err.Number

    On Error GoTo 0

    If lngFehler <> 0 Then

        get_free_install_id = 1

    Else

        get_free_install_id = intInstallID

    End If

End Function

Wie gesagt, mit "On Error Resume Next" vorsichtig umgehen, ein Error Handler sieht im Normalfall so aus (zumindest für VB 6):

Private Function get_All_ID(ByRef oActiveCon As ADODb.Connection _

) As Integer

On Error GoTo Err_get_All_ID



'   -----------------Procedure-Exit---------------

Exit_get_All_ID:


    ' --> Zerstörung von Objekten

    ' --> Set obj = Nothing o.ä.


    '   Prozedur verlassen

    Exit Function

'   -----------------Err-Handler------------------

Err_get_All_ID:

    Call MsgBox("Fehler: " & Err.Number & vbCrLf & Err.Description, _

                vbExclamation, "TITEL")


    ' Rückgabewert der Function

    ' = False o.ä.


    Resume Exit_get_All_ID

End Function

Seiteneffekte bei den CommonControls treten auch nur in bestimmten Fällen auf, hauptsächlich beim Zugriff aufs TreeView per API (SetWindowLong, Backcolor setzen etc...).

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...