Kann nicht in ACCESS Datei schreiben

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Kann nicht in ACCESS Datei schreiben

Beitrag von Bernd Reinhardt »

Hallo.
Ich bräuchte mal eine kleine Hilfe. Habe leider die Lösung im Forum nicht gefunden, deshalb
hier die Frage.
Ich habe über ODBCDBE einen Zugriff auf eine lokale Access Datei (MdB).
Ich kann die Daten der Tabelle lesen, aber leider nichts schreiben.
Schreiben müsste doch über ODBC gehen. Ich will ja keine neue Datei oder Tabelle anlegen.
In der Tabelle ist ein Datensatz vorhanden, den möchte ich gerne überschreiben. Habe zwei
Varianten versucht aber nichts geht.
Bei den ODBC-Eigenschaften ist kein Hacken bei schreibgeschützt, somit müsste das auch gehen.
Anbei der Code.
Vielleicht sieht jemand eine Fehler

ACCESSTEST ist als ODBC Verbindung eingerichtet.
Bauunion.mdb heißt meine Access-Datei
access1 ist die Tabelle in der Access Datei. Über Access kann ich dort die Daten ändern.

Code: Alles auswählen

   cOldDbe := DbeSetDefault("ODBCDBE")    // odbc ist geladen und aktiv
   cConnect := "DBE=ODBCDBE;DSN=" + "accesstest" + ";DBQ=" + "bauunion.mdb"   // cDatabase
   oSession := dacSession():new(cConnect)
   IF !oSession:isConnected()
      MsgBox( oSession:getLastMessage(), "Cannot connect to " + cConnect)
      RETURN 
   else
      // msgbox("connect")
   ENDIF
   cTable = "access1"      // dies ist die Tabelle in meiner Datei Bauunion.mdb
   USE (cTable) NEW ALIAS mytest
   dbgotop()              // hier komme ich hin uns sehe auch die Felder meiner Tabelle
   do while !rlock()
   enddo
   // altd()
   cLienr := mytest->dl_lienr // := "TEST"      // ich kann das Feld gut lesen
   mytest->dl_lienr := time()    // Kann das Charakterfeld leider nicht überschreiben nur direkt über ACCESS
   dbcommit()
   dbunlock()
   dbclosearea()
   
   
   cSQL := "SELECT * FROM access1;"            // habe es mal mit select versucht
   use (cSQL) Alias MYADRESS VIA "ODBCDBE"   
   dbgotop()
   do while !rlock()
   enddo
   altd()             // auch hier sehe ich meine Tabelle 
   replace MYADRESS->dl_lienr with time() + "222" // kann auch hier leider das Feld dl_lienr nicht überschreiben Feld ist numerisch 10    
   dbcommit()
   dbunlock()
   dbclosearea() 
   oSession:disconnect() 

   DbeSetDefault( cOldDbe )

Hat jemand eine Idee.
Danke für die Hilfe
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Kann nicht in ACCESS Datei schreiben

Beitrag von georg »

Hallo, Bernd -


ich vermisse im Connect-String Username und Passwort. Eventuell liegt es daran.

Die (vermutete) Tatsache, dass Du beim Starten von Access keinen Benutzernamen und kein Passwort eingeben musst, hat nichts mit dem Zugriff über ODBC zu tun. Das ist zumindest meine (leidvolle) Erfahrung.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Kann nicht in ACCESS Datei schreiben

Beitrag von brandelh »

georg hat geschrieben:ich vermisse im Connect-String Username und Passwort. Eventuell liegt es daran.
Wenn das Kennwort fehlt oder falsch ist, dann müsste doch schon das LESEN unmöglich sein oder ?

Ich selbst nutzte SQLexpress(), mich wundert der Befehl ! RLock() muss man sich ODBC Tabellen locken ?
Ich würde auch nie die Schreibweise MIT Alias und OHNE Alias mischen, alles mit Alias, das ist sicherer falls man aus versehen mal die Workarea wechselt.
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Kann nicht in ACCESS Datei schreiben

Beitrag von georg »

Hallo, Hubert -


die Rechteverwaltung unter Access 2003 und 2007/2010 ist katastrophal. Daher kann ich nicht ausschliessen, dass es damit zusammenhängt, dass eventuell Leserechte allgemein vergeben sind, die Schreibrechte aber eingeschränkt sind.

Ob die ODBCDBE ein RLock() nun weitergibt oder intern verwaltet, das kann ich Dir leider nicht sagen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Re: Kann nicht in ACCESS Datei schreiben

Beitrag von Bernd Reinhardt »

Hallo.
Danke für die Anmerkungen aber haben mir leider auch nicht weiter geholfen.
Falls doch mal jemand was in eine ACCESS-Datei schreiben möchte anbei den kompletten Code
wie es funktioniert. Bei ACCESS benötigt mein keinen Benutzernamen und auch kein Passwort.
Denn dann dürfte ja auch das lesen nicht gehen.
ODBCDBE muss natürlich auch geladen sein.

Code: Alles auswählen

     
      select MDBDATEI_D  // hab ich mir definiert
      cConnect := "DBE=ODBCDBE"  
      cConnect += ";DRIVER=Microsoft Access Driver (*.mdb, *.accdb)"   // ist so bei odbc im Betriebssystem dabei
      // Zugriff entweder direkt über den Treiber oder über System DSN   
      
      cConnect += ";FIL=MS Access"            // muss so sein
      cConnect += ";DBQ=" + cMdbDatei         // Datenbank angeben mit Pfad und Dateinamen liegt in einer Variablen bei mir
      oSession := DacSession():new( cConnect ) 

      oSession := dacSession():new(cConnect)
      IF !oSession:isConnected()
         MsgBox( oSession:getLastMessage(), "Cannot connect to " + cConnect)
         RETURN .f.
      ENDIF
   
      use access1 Alias MDBACCESS VIA "ODBCDBE"   // access1 ist der Name der Tabelle in der Access MdB Datei
      dbgotop()
      do while !rlock()  // bin mir nicht sicher ob ich das brauche so jedenfalls geht es. 
      enddo
      replace mdbaccess->DL_MEHRFER with time()  // Ändere das Feld mit z. B. Uhrzeit
      dbcommit()
      dbunlock()    
      xErgebnis := oSession:sessionList()  // es wird nicht nur eine Session geöffnet 
      dbclosearea()    // MDB Datei schließen
      for nI = 1 to len(xErgebnis)
         oLoesche := xErgebnis[nI]   //oSession:disconnect() 
         oLoesche:disconnect()       // alle offenen Sessions schließen damit die Datei frei wird
      next
      xErgebnis := oSession:sessionList()     // xErgebnis ist jetzt leer
      sleep(10)
Gruß
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Kann nicht in ACCESS Datei schreiben

Beitrag von brandelh »

Wenn das die helfende Zeile ist :arrow:
replace mdbaccess->DL_MEHRFER with time() // Ändere das Feld mit z. B. Uhrzeit
dann ist offenbar die interne Umsetzung von := nach REPLACE bzw. FieldPut() bei der ODBCDBE nicht OK.
Ich persönlich nutze bei Feldern grundsätzlich und ausschließlich REPLACE, da so sofort sichtbar ist was gemeint ist ;-)
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Kann nicht in ACCESS Datei schreiben

Beitrag von georg »

Guten Morgen,


ich möchte doch einmal auf den Berechtigungsdialog von Access hinweisen:

Es gibt klar die Möglichkeit, Leserechte zu gewähren und gleichzeit Updaterechte zu verweigern. Dann funktioniert auch ein SELECT ohne Probleme, ein UPDATE aber scheitert.

Wobei das für .MDB Dateien gilt (auch unter Office 2007/2010), während für .accdb Dateien andere Regeln zu gelten scheinen.
Dateianhänge
access-rights.png
access-rights.png (16.54 KiB) 5547 mal betrachtet
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Kann nicht in ACCESS Datei schreiben

Beitrag von brandelh »

Hallo Georg,

wird diese Zugriffsberechtiung nicht nur von Access selbst beachtet ?

Ich habe vor Jahren mit SQLexpress Daten aus einer MDB gelesen, die selbst eine Anwendung enthielt
über die man normalerweise nur begrenzten Zugriff haben sollte ;-)

Es kann natürlich gut sein, dass die "Ersteller" der MDB diese nicht richtig geschützt haben ... :-)
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Kann nicht in ACCESS Datei schreiben

Beitrag von georg »

Hallo, Hubert -


dummerweise "gehorcht" Access diesen Einstellungen. Das ist ein Grund, warum ich monatlich eine Datenlieferung umkopieren muss, um sie mittels SQLExpress verarbeiten zu können (auf der "anderen Seite" ist man nämlich nicht in der Lage, die Anpassung vorzunehmen).

Das Irritierende ist ja, dass der Zugriff über Access als Programm ohne jede Schwierigkeit geht, und beim ODBC-Zugriff gegebenenfalls Benutzername und Kennwort erforderlich sind.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten