PDA

Vollständige Version anzeigen : Multiuser-Connect per ODBC möglich?


fishmeck
18.01.2003, 20:01
Hallo,

ich verwende Access97 mit Zugriff auf Oracle-Tabellen. Dies geschieht über ODBC-Anmeldung.

Problem: ODBC verwendet immer den letzten Benutzer beim Connect.

Ich will per ODBC mich mit verschiedenen Benutzernamen an eine Datenbank anmelden.
Dummerweise merkt sich aber die Jet-Engine (?) für jede ODBC-Datenquelle
den Benutzernamen bei der ersten Anmeldung und verwendet den sich gemerkten immer wieder bei neuem Verbindungsaufbau anstelle des von mir angegebenen Benutzers.

Momentan muß man erst die DB beenden, dann neu Starten und sich mit dem neuen Namen anmelden.

Wie kann ich das System also dazu bringen, den von mir angegebenen
Benutzernamen zu verwenden ?

Gruß

fishmeck

michiim
26.02.2003, 15:30
hallo dein problem loest du wie folgt

bau dir einfach eine funktion die dir eine neue instanz anlegt:


Function setNewInstance(...)
Dim str as String
Dim str2 as String

str = SysCmd(acSysCmdAccessDir) 'damit bekommst du das akt. lokale Installationsverzeichnis von Access
str2 = str & "msaccess.exe C:\xyz\...\DeineMDBAnwendung.mdb"
call shell(str2, 1)
End Function


das muesste funktionieren

lg michi

//p.s.: da du access auch als frontend und als backend eine oracle anwendung hast > falls du dich mit dem analysieren und abfangen von standard-odbc-fehlermeldungen (die von der datenbank kommen --> zB von Triggers oder procedures) auskennst, viell. kannst du mir ja einen ratschlag geben
vgl. dazu meinen beitrag vom 25. feb. 2003

fishmeck
26.02.2003, 20:31
Hallo michiim,

danke für die Antwort. Aber diese Lösung war mir bekannt. Nur sollte dieses zur Laufzeit geschehen, da die DB sehr groß ist und der Start etwas dauert. Zur Laufzeit wäre dieses also wesentlich benutzerfreundlicher.
Dieses scheint wohl aber nicht besonders einfach zu sein, falls es überhaupt möglich ist.

Zu den Fehlermeldungen von Oracle - ich verwende hierfür folgende Abarbeitung (beim Aufruf von Packages/Procedures):


Public Function fktPackage(lngID As Long, _
varFehlertext As Variant) As Long
On Error GoTo Err_fktPackage

Dim qdf As QueryDef
Dim strCall As String
Dim lngErrNr As Long

' Fehler-Nummer vorbesetzen
lngErrNr = 0

' Procedurname
strCall = "{ call packageXXX(?,?,?) }"
strCall = UCase(strCall)
Set qdf = conODBC.CreateQueryDef("", strCall)

' Definition der Schnittstelle:
' PROCEDURE packageXXX(i_id IN NUMBER,
' o_err_nr OUT NUMBER,
' o_fehlertext OUT VARCHAR2)
'
' Parameter : i_id => Id des Dokumentes, das angenommen werden soll.
' o_err_nr = 0 erfolgreiche Verarbeitung
' > 0 interner Fehlercode (vergl. T_ERRCODE)
' in der T_ERRCODE sind eigene Fehlermeldungen
' enthalten, die in den Packages selbst erstellt wurden.
' Ist ein Feld im Package z.B. Null, kommt z.B. der Fehler
' 19000 zurück. Diese FehlerNr steht mit dem entspr.
' Fehlertext in der Tabelle T_ERRCODE.
' < 0 ORA-Fehlercode
With qdf
.ODBCTimeout = 0
.Parameters(0).Direction = dbParamInput
.Parameters(0).Type = dbLong
.Parameters(1).Direction = dbParamOutput
.Parameters(1).Type = dbLong
.Parameters(2).Direction = dbParamOutput
.Parameters(2).Type = dbChar
.Parameters(0) = lngID
.Execute
lngErrNr = .Parameters(1)
varFehlertext = .Parameters(2)
.Close
End With
Set qdf = Nothing

fktPackage = lngErrNr

If lngErrNr < 0 Then
fktOracleErrorText lngErrNr, "fktPackage", varFehlertext
ElseIf lngErrNr > 0 Then
varFehlertext = fktVSMError(lngErrNr) & fktNTB(varFehlertext)
MsgBox varFehlertext, vbInformation, "DUMAS II : FEHLER"
End If

Exit_fktPackage:
Exit Function
Err_fktPackage:
MsgBox "MODULXXX - fktPackage:" & vbCrLf Err.Number & vbCrLf & Err.Description
Resume Exit_fktPackage
End Function

Public Function fktOracleErrorText(lngErrNumber As Long, _
strProcName As String, _
varFehlertext As Variant)
On Error GoTo Err_fktOracleErrorText

' Beschreibung : Gibt Oracle-Fehler und zusätzliche Fehlerbeschreibung aus

Dim strMsg As String

strMsg = "Ein interner Oracle-Fehler ist beim Aufruf der Prozedur " & strProcName _
& " aufgetreten." & vbCrLf _
& "Fehlernummer: ORA-" & Format(Abs(lngErrNumber), "00000") & vbCrLf _
& "Fehlerbeschreibung: " & varFehlertext & vbCrLf & vbCrLf _
& "Bitte wenden Sie sich unter Angabe von Fehlernummer und Prozedurnamen an Ihren Systembetreuer."
MsgBox strMsg, vbCritical, "FEHLER"

Exit_fktOracleErrorText:
Exit Function
Err_fktOracleErrorText:
MsgBox "MODULXXX - fktOracleErrorText:" & vbCrLf Err.Number & vbCrLf & Err.Description
Resume Exit_fktOracleErrorText
End Function

Public Function fktVSMError(lngErrNr As Long) As String
On Error GoTo Err_fktVSMError

' Beschreibung : Ermittelt aus Fehlernummer von Oracle-Package den Fehlertext

If lngErrNr > 0 Then
fktVSMError = fktNTB(DLookup("ERC_MELDUNG", "T_ERRCODE", "ERC_ERRORCODE = " & lngErrNr)) & " "
End If

Exit_fktVSMError:
Exit Function
Err_fktVSMError:
MsgBox "MODULXXX - fktVSMError:" & vbCrLf Err.Number & vbCrLf & Err.Description
Resume Exit_fktVSMError
End Function



Hoffe das es Dir etwas hilft.

Gruß

fishmeck

michiim
27.02.2003, 12:37
hallo fishmeck,
vielen vielen dank fuer deine super aw;

zu deinem problem noch: meiner meinung gibt es dazu keine andere loesung (zur Laufzeit) --> habe mich damit auch zahlreiche stunden gequält dieses problem in der selben access-instanz zu lösen

lg michi

michiim
27.02.2003, 12:43
hab mir das jetzt genauer angschaut was du mir ueber oracle-fehlermeldungen geschickt hast;

was machst du eigentlich, wenn aber Oracle einen Fehler auslöst, wenn zB in einem Access-Formular ein Datensatz gelöscht werden sollte - dies aber zB aufgrund eines constraint nicht geht --> kann man das auch irgendwie abfangen + auslesen?

lg michi