schkaf Geschrieben 16. Dezember 2008 Teilen Geschrieben 16. Dezember 2008 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 16. Dezember 2008 Teilen Geschrieben 16. Dezember 2008 - 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 16. Dezember 2008 Teilen Geschrieben 16. Dezember 2008 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schkaf Geschrieben 17. Dezember 2008 Autor Teilen Geschrieben 17. Dezember 2008 @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 und einem Set RecSet = Connect.Execute("SELECT @@Identity") Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.