Zum Inhalt springen

Datenbank aktualisieren vor lesen, wie?


schkaf

Empfohlene Beiträge

Hallo zusammen,

ich habe folgendes Problem beim Lesen von Daten aus einer Access-DB. Bei einem Export aus Excel erzeuge ich Einträge in einer DB und dabei soll über einen Autowert ein eindeutiger Wert erzeugt werden, denn ich in einer anderen Tabelle dieser DB als Primärschlüssel verwenden möchte. Ich erzeuge also einen Eintrag, den ich anschließend gleich wieder lese um den Wert des Autowerts für meinen Primärschlüssel zu erhalten.

Wahrscheinlich lese oder schreibe ich mit den falschen Parametern, denn beim Lesen des eben geschriebenen Eintrags erhalte ich oft kein Ergebnis. Im Debug-Modus ist das Lesen allerdings häufiger Erfolgreich als im Echtzeitbetrieb, was mich vermuten lässt, mein eben geschriebener Eintrag steht noch nicht wirklich in der DB sondern in einer Art Puffer. Ist meine Vermutung mit dem Puffer eigentlich korrekt? Wenn ja, wie kann ich die DB dazu bringen den Puffer zu leeren bzw. wie schreibe ich direkt in die DB (ohne Puffer)?

Hier mein Code:

Sub Test_01()

Dim DB2 As DAO.Database

Dim Connect As Connection

Dim RecSet As Recordset

Dim RecSet2 As DAO.Recordset

Dim SQLString As String

Dim E_Quelle As Worksheet

Dim e_pfad As String

Dim dp_pfad As String

Dim db_tab1 As String

Dim db_struktur1 As String

Dim Personalnummer As String

Dim A_Tag_Str As String

Dim AZ_von As String

Dim AZ_bis As String

Dim S_ID As Integer

dp_pfad = "H:\db.mdb"

db_tab1 = "Tab_01"

db_struktur1 = "Personalnummer,Datum, AZ_von, AZ_bis"

Set Connect = New ADODB.Connection

With Connect

.Provider = "Microsoft.Jet.OLEDB.4.0"

.ConnectionString = "Data Source=" & dp_pfad

.Open

End With

e_pfad = "H:\tab.xls"

Set E_Quelle = Workbooks.Open(e_pfad, ReadOnly:=True).Worksheets(1)

' Datensatz schreiben

SQLString = "INSERT INTO " & db_tab1 & " (" & db_struktur1 & ") " & _

"VALUES (" & Personalnummer & A_Tag_Str & AZ_von & ", " & _

AZ_bis & ")"

Set RecSet = New ADODB.Recordset

RecSet.Open SQLString, Connect, adOpenDynamic, adLockReadOnly

' jetzt wieder lesen

SQLString = "SELECT * FROM " & db_tab1 & " " & _

"WHERE Personalnummer = " & E_Quelle.Range("N13").Text & _

" AND AZ_Typ = " & AZ_typ & " " & _

"AND Datum = " & CLng(CDate(CStr(A_Tag))) & ";"

XterVersuch:

Set DB2 = CurrentDb

Set RecSet2 = DB2.OpenRecordset(SQLString, dbOpenForwardOnly)

' prüfe ob lesen geklappt hat, falls nicht, probiers nochmal

If RecSet2.RecordCount < 1 Then

GoTo XterVersuch

End If

S_ID = RecSet2!Schlüssel_ID

RecSet2.Close

DB2.Close

Connect.Close

End Sub

DB-Struktur (Primärschlüssel ist Personalnummer&Datum)

Personalnummer (Zahl)

Datum (Datum/Uhrzeit)

Schlüssel_ID (AutoWert)

AZ_von (Datum/Uhrzeit)

AZ_bis (Datum/Uhrzeit)

Vielen Dank schon mal für Eure hilfe!

Link zu diesem Kommentar
Auf anderen Seiten teilen

- CODE-tags wären super gewesen, auch weil augenschonender.

- das mit XterVersuch ist schlechtes konzept. entweder klappt ein INSERT, oder es klappt nicht.

- du machst ein RecSet.Open auf basis eines INSERT INTO - das ist IMO blödsinn. entweder machst du eine Connection, und führst dort ein Execute aus (was ich für wesentlich einfacher und schneller halte), oder dein recordset basiert auf einem SELECT und du machst ein AddNew.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bei einem Export aus Excel erzeuge ich Einträge in einer DB und dabei soll über einen Autowert ein eindeutiger Wert erzeugt werden, denn ich in einer anderen Tabelle dieser DB als Primärschlüssel verwenden möchte. Ich erzeuge also einen Eintrag, den ich anschließend gleich wieder lese um den Wert des Autowerts für meinen Primärschlüssel zu erhalten.

Das ist ganz schlecht so. Wenn du die ID deines neuen Datensatzes direkt brauchst dann solltest du die selber vergeben anstatt das die DB beim Einfügen machen zu lassen.

Eine einfache Möglichkeit hier einen Eindeutigen Wert zu erhalten ist guids als ID zu verwenden...

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Amstelchen :valen

CODE-tags wären super gewesen, auch weil augenschonender

ich gelobe besserung

das mit XterVersuch ist schlechtes konzept. entweder klappt ein INSERT, oder es klappt nicht.

ist klar. Hat ich auch nur zum testen/verdeutlichen drin. Dauerte im übrigen auch ewig.

du machst ein RecSet.Open auf basis eines INSERT INTO - das ist IMO blödsinn. entweder machst du eine Connection, und führst dort ein Execute aus (was ich für wesentlich einfacher und schneller halte), oder dein recordset basiert auf einem SELECT und du machst ein AddNew.

vielen Dank für den Hinweis. Hab mich jetzt für Connection & Execute entschieden :D und einem

Set RecSet = Connect.Execute("SELECT @@Identity")

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...