| |
VB & DatenbankenADO 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 | |
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
| |
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. | |
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 | |
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. | |
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 | |
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 | |
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. | |
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 | |
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
| |
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
| |
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.
| |
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
| |
| 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 |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|