vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Datenbanken
ADO Satz wird nicht geschrieben 
Autor: bholdie
Datum: 06.04.15 23:46

Liebe VB6-Gemeinde
Ich versuche zur Zeit, meine Random-Dateien auf DB umzustellen und habe mir da einiges zusammenkopiert. Für den DB-Zugriff habe ich ein eigenes Modul erstellt, das zum Schreiben eines neuen Satzes verwendet werden soll.

Im Hauptprogramm steht dann als Schreibaufruf z.B.

....
CnÖffnen
DBSchreiben "Freitag", "U", now
....


Mein Problem:
Das Programm läuft wunderbar ohne Fehlermeldung durch, wenn ich mir aber danach die Datenbank ansehe, ist NIX geschrieben worden.

Ich hab' jetzt schon alle Tipps und Workshops durchgearbeitet und komme einfach auf keinen grünen Zweig. Was mache ich da nur falsch?

Verweise sind gesetzt auf
Microsoft Active Data Objects 2.6 Library und
Microsoft Data Binding Collection nVB 6.0 (SP4) .

Ach so, ich nutze Windows 7 und Access-2010.

im DB-Modul steht
Private oBC As MSBind.BindingCollection
Private adoCn As ADODB.Connection
Private adoRs As ADODB.Recordset
 
Public Sub CnÖffnen()
   Set adoCn = New ADODB.Connection
   With adoCn
       .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
         dbpfad$
       .CursorLocation = adUseClient
       .Mode = adModeReadWrite  
       .Open
       If .State = adStateOpen Then
          MsgBox "Open " + dbpfad$
       End If
   End With
End Sub
 
Public Function RsÖffnen(Quelle As String, Optional Typ As _
  ADODB.CursorTypeEnum,                  Optional Ort As _
  ADODB.CursorLocationEnum) As Long
 
On Error GoTo RSfehler
  Set adoRs = New ADODB.Recordset
 
   With adoRs
       .ActiveConnection = adoCn
      .CursorType = adOpenKeyset
      .CursorLocation = adUseServer
      .Source = Quelle
      .LockType = adLockBatchOptimistic
      .Open
      RsÖffnen = adoRs.RecordCount
  End With
Exit Function
 
RSfehler:
MsgBox "RS Öffnen Fehler " + CStr(Err)
End Function
 
Public Sub DBSchreiben(f1$, f2$, f3)
   On Error GoTo DBFehler:
   RsÖffnen ("Anwesenheit")
   Set oBC = New MSBind.BindingCollection
 
  With oBC
     Set .DataSource = adoRs
     adoRs.AddNew
     adoRs("feld1") = f1$
     adoRs("feld2") = f2$
     adoRs("feld3") = f3
     adoRs.Update
     adoRs.Close
     Set adoRs = Nothing
  End With
 
  Exit Sub
 
DBFehler:
   MsgBox "Schreiben Fehler " + CStr(Err)
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: Franki
Datum: 05.05.15 08:17

Hallo,

erster Hinweis bei solchen Problemen ist immer, dass es keine Schreibberechtigung auf die DB gibt weil die Berechtigungen des Users nicht ausreichen der dein Programm ausführt.

Also konkret gefragst: Wo im Dateisystem liegt die DB? Unter welchen Benutzerrechten läuft dein Programm?.

Erstelle dir einfach mal eine Testanwendung "Hallo Welt DB" in der du einen Datensatz schreibst und wieder liest. Nur so kann man solche Fehler auf die Spur kommen.

____________________
Verweise sind gesetzt auf
Microsoft Active Data Objects 2.6 Library und
Microsoft Data Binding Collection nVB 6.0 (SP4) .
_____________________

ist übrigens nicht mehr zeitgemäß, da ist bei ADO die Verson 2.8 aktuell, und die Collection ist völlig überfrlüssig bei ADO in Verbnindung mit VB6

Aber wie auch immer, erstelle dir wenn möglich eine Test-DB eine Testanwendung wo du nur die Grundfunktionen drin hast. Also Lesen, Schreiben usw. Auch wenn da nur HslloWelt drin steht, weiß du, ob es funktioniert oder nicht.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: bholdie
Datum: 06.05.15 16:38

Erst 'mal vielen Dank für die Antwort und die Tipps!

Ich habe mir schon 'was in der Richtung gedacht. Ich werde mich einfach intensiver mit dem Thema Datenbanken beschäftigen müssen und wahrscheinlich ganz vorne mit dem "Hello World"- Beispiel anfangen.
Solange ich nur Muster aus (alten!) Büchern abtippe, kapier' ich die Grundlagen eben doch nicht.

Naja, ich mach' das ja auch nur hobbymäßig, um meine grauen Zellen auf Trab zu halten.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: Franki
Datum: 07.05.15 06:52

Hallo,

das Alter der Bücher ist nicht das Problem, das kann ruhig 10 Jahre oder sogar älter sein da du ja mit VB6 und ADO arbeitest. Daran hat sich nämlich schon lange nichts mehr geändert (Wir reden ja nicht von VB.NET bzw. ADO.NET, das ist eine andere Baustelle)

Was genau steht bei dir in dbpfad$ ? Wenn da was von C:\Programme\... steht klappt das so nicht.

Die alten Bücher über VB6 gehen oft noch von Win98 als Betriebssystem aus, da gab es noch keine Benutzerkontensteuerung (UAC) und selbst bis XP war der am Rechner angemeldete User meistens ein Administrator der überall Schreibberechtigung hatte. Unter aktuellen Windows Versionen (>= Vista) ist das nicht mehr so.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: bholdie
Datum: 10.05.15 19:54

Hallo Franki,

in dbpfad$ steht: "G:\Daten\meineDB.mdb", das kann's also nicht sein.

Was das ganze für mich rätselhaft macht: ich habe ein ID-Feld als Auto-Wert definiert, Also ein numerischer Ident, der offensichtlich automatisch hochgezählt wird.

Ich habe auch noch eine andere Variante mit gebundenen Steuerelementen, wo der Update funktioniert.

Wenn ich jetzt in der "Problemvariante" fünfmal einen Satz schreiben will (und eben nichts passiert) und anschließend mit der funktionierenden Variante (gleiche Entwicklungsumgebung) einen funktionierenden Update durchführe, ist mein Autoident um 5 erhöht, auch wenn die Sätze selber fehlen.

Ich werde es auf jeden Fall mit Deinen Hinweisen weiter probieren. Jetzt fordert allerdings erst mal "das richtige Leben" meine Aufmerksamkeit (VB6 ist ja nur mein Hobby) und ich werde das erst 'mal zurückstellen müssen. Wollte ich nur mitteilen, damit Du nicht denkst, ich bin unhöflich und reagiere nicht auf Deine Hilfeangebote.

Vielen Dank nochmals für Deine Tipps.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: bholdie
Datum: 22.06.15 17:54

Hallo Franki,
ich hab' mittlerweile wieder mal die Zeit gehabt, mich mit diesem Thema zu beschäftigen. Dein Rat, auf die collection zu verzichten hat mir den Durchbruch gebracht. Plötzlich geht alles ganz einfach, einschließlich SQL-Anwendungen etc.
Also Danke nochmals
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: Franki
Datum: 23.06.15 07:05

Hallo,
danke für die Rückmeldung, freut mich, dass es jetzt klappt.

Und wenn du noch ein paar mehr Features brauchst, kannst du dir auch AdoX mal ansehen.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: Blackbox
Datum: 06.07.15 18:48

Hallo,

er sollte auch mal ein .Update ausführen, damit der Recordset die Daten schreiben kann.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: Franki
Datum: 07.07.15 07:22

Hallo,

ich bin mal davon ausgegangen, dass der Umstieg auf reines ADO schon das Grundwissen verwertet. Immerhin hatte er im alten Code der nicht funktionierte ja stehen:

Set oBC = New MSBind.BindingCollection
 
  With oBC
     Set .DataSource = adoRs
     adoRs.AddNew
     adoRs("feld1") = f1$
     adoRs("feld2") = f2$
     adoRs("feld3") = f3
     adoRs.Update
     adoRs.Close
     Set adoRs = Nothing
  End With
Aber bholdie schreibt ja, dass jetzt alles funktioniert, also gehe ich mal davon aus, dass auch das berücksichtigt worden ist.

Aber egal wie man es macht, ob mit oder ohne Recordset, oder Ado oder was auch immer, das System ist ja immer gleich, es gelten halt die Berechtigungen, ob Neue Datensätze, Änderungen an Datensätzen, Löschen oder was auch immer erlaubt ist oder halt nicht. Das hängt natürlich auch von der DB ab und dem BS auf dem diese läuft. Vor Userrechten ganz zu schweigen, die innerhalb der eigenen Software, vom BS oder von wo auch immer verwaltet werden. Schreiben kann man nur dann wenn man die Berechtigung dazu hat.

Ein .update wird also immer dann schief gehen wenn der Datensatz z.B. ReadOnly ist.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: bholdie
Datum: 07.07.15 17:22

Hallo blackbox,

also adors.update hatte ich ja geschrieben und natürlich besteht auf die DB Schreibberechtigung.

Warum es nicht funktioniert hat weiß ich zwar immer noch nicht aber der Hinweis von Franki, auf die Collection zu verzichten, war der Durchbruch!.

Jetzt steht da

RsÖffnen ("Anwesenheit")
adoRs.AddNew
adoRs("feld1") = f1$
adoRs("feld2") = f2$
adoRs("feld3") = f3
adoRs.Update
adoRs.Close
Set adoRs = Nothing

und alles funktioniert.

Bei SQL habe ich am Anfang Misserfolge gehabt, bis ich kapiert habe, dass ich übergebene Zeichenketten in einfache Hochkomma einschließen muss. Zur Übergabe eines Datums gibt es ja den wichtigen Tipp von Dieter.

Ach ja, wenn ich mit einer SQL-Abfrage arbeite, also SELECT * from tab WHERE .... sehe ich nicht, wieviele Records ich erhalte. RECORDCOUNT liefert immer -1. Gibt es da einen Trick? (Ist aber nicht lebenswichtig)

Beste Grüße
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: Franki
Datum: 12.07.15 03:45

Hallo,

was genau beinhaltet bei dir RSÖfnen?
Also wie genau erzeugst du das Recordset?

Wenn .recordcount nicht funktioniert liegt das meist an falschem Cursor- bzw. Locktype. Natürlich unter der Voraussetzung, dass das Recordset auch wirklich Daten enthält.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: bholdie
Datum: 12.07.15 12:05

Hallo Frank,

ich habe mir da ein kleines Programm geschrieben, in dem ich diverse Dinge ausprobiere.
Der Codeschnipsel, mit dem ich Probleme habe, sieht so aus:

DBÖffnen
xsql$ = "SELECT * FROM Anwesenheit Order by zeit"
Set adox = adoCn.Execute(xsql$)
recz1 = adox.RecordCount
adox.MoveFirst
test$ = adox.Fields(1)

Ich habe dann in recz1 den Inhalt -1, sehe aber in test$, dass er tatsächlich den ersten Satz in der gewünschten Reihenfolge liefert.

Da ich ja beim SQL-Zugriff die Tabelle nicht explizit öffne ( also mit adox.open ), gebe ich natürlich auch keine Parameter für CursorLocation, CursorType, LockType usw. an.

Es stimmt schon, sobald ich ganz trivial mit adox.open, arbeite und diese Parameter übergebe, funktioniert es aber dann habe ich ja keine SQL-Funktionalität.

Also bleibt mir die Frage: ist meine SQL-Vorgehensweise falsch?

Danke schon mal!

Übrigens: ein anderes Problem habe ich lösen können:

wenn ich suche: " SELECT * FROM Anwesenheit WHERE zeit BETWEEN #5-1-15# and #5-2-15#" werden die Sätze vom 2. Mai NICHT angezeigt.
Ursache: intern werden wohl die nicht angebenen Stunden und Minuten durch 0 ersetzt. Damit liegt natürlich jeder beliebige Termin am 2. Mai außerhalb des Bereiches. Und wenn ich den Datumstipp von Dieter richtig verstanden habe, können bei der Suche auch nur die Tage angegeben werden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: Franki
Datum: 13.07.15 04:28

Hallo,

also es ist ja klar, dass die Tabelle mit einer entsprechenden SQL Abfrage geöffnet werden muss damit ADO die Anzahl der Treffer auch ermitteln kann (.recordCount) Denn wie soll in einer Adressdatenbank das .recordCount ermittelt werden wenn du alle Müller/Maier/Schmidt haben möchtest bzw. deren Anzahl?

Ein .recordCount bezieht sich immer auf die Anzahl Treffer entsprechend einer Abfrage.

Und ADOX brauchst du ja in VB6 nur dann wenn ADO nicht mehr ausrechend ist. Normalerweise arbeitet man mit ADO, und nur wenn es darum geht Features zu benötigen die ADO nicht kann verwendet man ADOX. In der Praxis reicht zu 99% ADO für allgemeine Aufgaben völlig aus.

Bei der Datumsfrage hast du ein Verständnisproblem. Zwischen zwei Datumsangaben bedeutet nicht, dass beide Daten enthalten sind. Sondern das sind halt Grenzen die auch mathematisch bzw. programmiertechnisch logisch sind.

Wenn du das so haben möchtest, dann arbeite halt mit <=. >= oder einer Kombination daraus. Sprachlich ausgedrückt bedeutet das ja auch, dass bei einer SQL Abfrage: Zeige mir alle Preise zwischen 40 und 50 Euro, ein Preis von 55 Euro nicht als Treffer gilt. Also wieso sollte das beim Datum 2. Mai anders sein?

Bei einer Suche nach Zeitangaben können durchaus voll qualifizierte Datums- und Zeitangeben verwendet werden. Voraussetzung ist halt immer, dass der Datenbestand das auch her gibt. Also wenn in der DB auch Minuten gespeichert sind, dann kann man darauf auch eine SQL Abfrage los lassen.

Wie sepeicherst du deine Datensätze bezüglich Zeitangaben? Wenn du z.B. Now verwendest und das in der DB auch im DATE-Feld steht, ist das tauglich für SQL Abfragen. ich weiß jetz ja nicht mit welcher DB du arbeitest bzw. was du da für Datentypen eingestellt hast. Aber grundsätzlich funktioniert das, sogar bis auf die Sekunde genau.

Gruß
Frank






Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ADO Satz wird nicht geschrieben 
Autor: whisky1108
Datum: 18.12.15 21:26

Vielleicht hilft das erstmal weiter:

http://www.activevb.de/tutorials/tut_adokurs/adokurs4.html

Beitrag wurde zuletzt am 18.12.15 um 21:27:41 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel