Gast Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 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] Zitieren
Amstelchen Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 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 Zitieren
Gast Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 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. Zitieren
Amstelchen Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 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 Zitieren
Gast Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 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. Zitieren
Gast Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 Mit SP6 besteht das Problem weiterhin. Zitieren
DevHB Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 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. Zitieren
Gast Geschrieben 22. Juni 2006 Geschrieben 22. Juni 2006 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. Zitieren
Gast Geschrieben 22. Juni 2006 Geschrieben 22. Juni 2006 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. Aber danke Euch für die Mühe. Zitieren
DevHB Geschrieben 22. Juni 2006 Geschrieben 22. Juni 2006 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...). Zitieren
Empfohlene Beiträge
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.