Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1720to1724
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Recordset = connection.Execute()

Recordset = connection.Execute()
28.10.2019 21:22:30
Toni
Hallo liebe Excel-Gemeinde,
via Connection.Execute(SQLBEFEHL) werden Werte in eine geschlossene Zieldatei geschrieben (über UPDATE bzw. INSERT INTO). Das ist auch alles soweit ok. Mir war bislang auch bekannt, dass die Werte in der Zieldatei dadurch als Text formatiert sind.
Frage 1
Aber: bevor ich jetzt über workbook.open in die Zieldatei gehe, um den Text in Zahlen umzuwandeln: Ihr wisst nicht zufällig eine Möglichkeit, wie man das bereits mit dem SQL-String regeln kann? Oder indem man das Recordset irgendwie anfässt?
Und Frage 2.
bezieht sich auf diesen Sachverhalt: https://docs.microsoft.com/de-de/office/client-developer/access/desktop-database-reference/locktypeenum-enumeration-dao
Ich werde nicht recht schlau daraus. Eigenltich möchte ich nur sicher gehen, dass wenn unterschiedliche Leute in die Zieldatei via ADO schreiben, dass da kein neuer Eintrag unterhalb (INSERT INTO) durch einen parallelen anderen Eintrag überschrieben wird. Vom Bauchgefühl würde ich auf dbOptimistic gehen, aber mir währ schon wohler, wenn nicht wieder alles an meinem Bauch hängen bleibt.
Lösungen wären echt super und dankbar bin ich auch :)
lG
Toni

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Recordset = connection.Execute()
28.10.2019 21:46:51
Luschi
Hallo Toni,
mir ist aus Deiner Beschreibung nicht klar geworden, wohin Du die Daten schicken willst_
- von Excel in Access-Tabellen
- von Excel in Excel-Tabellen
- oder noch andere Varianten
- aber wohl doch per AdoDB oder DAO von Excel in Excel-Tabellen, denn sonst dürfte eine
  Vermíschung von Text- und Zahlenwerten in einer Spalte/Feld nicht vorkommen.
Gruß von Luschi
aus klein-Paris
AW: Recordset = connection.Execute()
28.10.2019 21:48:07
Toni
Hi Luschi,
von Excel nach Excel über ADODB.
lG
AW: Recordset = connection.Execute()
29.10.2019 10:34:57
Toni
Hallo,
nach einigem Probieren ist mir das hier aufgefallen:
der erste Datensatz der per ADO eingeschrieben wird ist immer Text (ohne das Zieldatei irgendwie formatiert wäre). Manipuliere ich den in der Zieldatei händisch (also in Zelle und entern) entstehen Zahlen - nicht durch normales formatieren (Strg,1). Sind die Zahlenfelder so erst einmal Zahl ist auch jeder weitere Eintrag über ADO Zahl. Es scheint, als würde dieser erste Datensatz maßgeblich für die weitere Formatierung sein.
das zur ersten Frage. Wäre lieb, wenn jmd noch zur 2. was wüsste. Danke dafür! Kann mich aber erst heute Abend melden.
lG
Toni
Anzeige
AW: Recordset = connection.Execute()
30.10.2019 07:06:23
Luschi
Hallo Toni,
wenn Access/AdoDB Daten in eine Exceltabelle liest/schreibt, werden zuerst die ersten 8 Zeilen von Excel gescannt und daraus der entsprechenden Datentyp der Spalte festgelegt (ohne Überschriften).
Dieses Verhalten kann man auch ändern; siehe dazu

https://www.nicelabel.com/de/support/knowledge-base/article/the-data-from-excel-is-truncated-to-255-characters
Zum 2. Teil der Frage muß ich heute Vormittag noch mal ein bißchen Testen/Recherchieren.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Recordset = connection.Execute()
30.10.2019 08:22:43
Toni
... der Link war sehr hilfreich, Luschi! Danke für die Recherche!
Hallo,
zum einen, weil ich das seltsame Verhalten, was ich da in meinem letzten Beitrag schon etwas unsicher ob der Stimmigkeit beschrieben habe nun genauer spezifizieren kann. Zum anderen waren mir die Restriktionen auf 255 Zeichen nicht bewusst. Das ändert einiges und ich kann mich nun darauf einstellen.
Sehr sehr cool.
Vielen Dank dafür!
AW: Recordset = connection.Execute()
30.10.2019 21:21:09
Toni
Hallo,
weiß jemand noch etwas zu diesem Thema:
https://docs.microsoft.com/de-de/office/client-developer/access/desktop-database-reference/locktypeenum-enumeration-dao
da steht:
dbOptimistic ... Vollständige Parallelität basierend auf der Datensatz-ID. Der Cursor vergleicht die Datensatz-ID in alten und neuen Datensätzen, um zu bestimmen, ob seit dem letzten Zugriff auf den Datensatz Änderungen vorgenommen wurden.
... das müsste doch eigentlich heißen, dass sämtliche Datensätze - egal wie viele user potentiell gleichzeitig daran arbeiten - letztlich in der Zieldatei gespeichert werden, oder? Jetzt wird es nicht so häufig vorkommen, dass mehrere User exakt gleichzeitig die connection öffnen und hineinschreiben, aber falls doch ...?
das wäre mir noch ein großes Anliegen und es wäre echt nett, wenn da noch einer weitere Erfahrungen hätte zu.
Danke und lG
Toni
Anzeige
AW: Recordset = connection.Execute()
03.11.2019 15:49:11
Firmus
Hallo Toni,
generell werden bei einer Datenbank-Tabelle die User gezählt, die auf die Tabelle zugreifen.
Aus Performancegründen gibt es sogar die Möglichkeit diese Anzahl User zu begrenzen.
(Concurrent User).
Diese Zählung ist vollkommen losgelöst von den Namen oder UserIDs der Benutzer.
Obiger Teil ist nur zum besseren Verständnis aufgeführt, und nicht relevant für dein Satz-Thema.
Hier wird's relevant:
Innerhalb einer Tabelle wird jeder Zugriff auf einen Satz protokolliert, um Kollisionen zu vermeiden.
Es wird zu jeder angesprochen Record-ID im DBMS (ADO/DOA) festgehalten und mit dem "Lockedit-Flag" versehen.
Entsprechend dieses Flags können die Anwendungen, die zugreifen wollen, agieren.
https://docs.microsoft.com/de-de/office/client-developeraaccess/desktop-database-reference/locktypeenum-enumeration-dao
Wichtig ist auch die Unterscheidung von "Lesen ohne Sperre"[LoS] und "Lesen für Update"(LfU).
Hier die zwei Zugriffsarten, die häufig für Online-Anwendungen genutzt werden:
a) dbOptimistic
https://docs.microsoft.com/de-de/office/client-developer/access/desktop-database-reference/recordset-lockedits-property-dao
Beispiel: User-1 liest den Record ohne Sperre(LoS).
User-2 könnte den Record auch lesen und verändern (LfU).
User-1 kann sich also nicht sicher sein, dass seine gelesenen Daten noch aktuell sind.
Will User-1 jetzt einen Update durchführen, erhält er einen Fehler, da er den Record nicht gesperrt
hatte. Diesen Fehler muss der Programmierer in seiner Anwendung abhandeln
(z.B. "... Record wurde zwischenzeitlich verändert, bitte Vorgang wiederholen..." per Klick).
b) dbPessimistic
https://docs.microsoft.com/de-de/office/client-developer/access/desktop-database-reference/recordset2-lockedits-property-dao
Beispiel: User-1 liest den Record MIT Sperre (LfU).
User-2 kann jetzt den gleichen Record zwar lesen ohne zu sperren(LoS), kann aber keinen Update
durchführen, da er den Record nicht gesperrt hat.
Würde User-2 Lesen für Update (LfU) versuchen, würde er eine Fehlermeldung erhalten, die der
Programmierer in seiner Anwendung abhandeln müsste.
(z.B. "... Versuch es nochmals, Record wird benutzt ...." per Klick).
Der Record bleibt für alle User für Updates gesperrt bis der LfU-User seinen Update durchgeführt hat.
Lesen ohne Sperre (LoS) ist für alle User immer möglich - wie readonly.
(Meist gibt es auf Admin/DBA Level noch Befehle, die einen Record ausser der Reihe freigeben
können, z. B. wenn eine Anwendung zwischen LfU und Update abgestürzt ist. (Das wäre eine Dauersperre).
Besonderheit:
Die Daten sind auf der Festplatte meist in 4k-Blöcken abgespeichert.
Die logische Struktur (Tabellen,Zeilen,Zellen, ...) wird erst durch die Anwendung (hier Excel) zur Ansicht gebracht.
Es KANN sein, dass die Sperre auf einen gesamten 4k-Block zielt und nicht nur auf einen einzelnen Record.
Die Folge wäre, dass benachbarte Records in einer Update-Situation auch gesperrt wären.
Wie XLS das exakt handhabt, und ob man das per Parameter einstellen kann, entzieht sich meiner Kenntnis.
Es dürfte für die meisten Anwendungen unerheblich sein, dieses Wissen kann aber "unerklärbare" Sperren erklären.
Hoffe das hilft dir,
LG,
Firmus
Anzeige
AW: Recordset = connection.Execute()
03.11.2019 19:10:13
Toni
Hallo Firmus,
das ist genau, was ich gesucht habe, plus dem dazugehörigen Grundverständnis, plus Zusatzinformationen. Ist gar nicht sicher, ob das überhaupt schon mal so klar und ausführlich auf den Punkt kommuniziert wurde im Netz. Habe extremsten Dank für Deine Zeit und Deine Ausführungen, die mir und sicher auch anderen hier sehr helfen. (Userbegrenzungen und Nachbar-DS-Sperren: wo bekommt man denn so Wissen derart gebündelt und 'firm' beschrieben her? Ich bin völlig baff.)
Du unterrichtest nicht zufällig dieses Thema bzw. andere VBA-Themen? Ich würde sofort buchen (kein Quatsch)!! Falls nicht kann ich uns hier im Forum nur wünschen, dass Du möglichst viele Beiträge mit uns teilst (habe Deinen Namen bisher hier noch nicht gelesen), und das oft und lange.
Wie auch immer: habe nochmal recht herzlichen Dank für dieses Geschenk an einem sonst eher trüberen Sonntag mit dem Du mir eine sehr große Freude bereitet hast ...
Einen wunderschönen Abend wünsche ich Dir!
lG
Toni
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige