Discussion:
auslesen von Autowert bei neu angelegtem Datensatz
(zu alt für eine Antwort)
Jan Eisner
2008-01-18 10:46:12 UTC
Permalink
Hallo NG,


Ich habe eine Access97 Datenbank auf die ich von VB6 mittels ADO zugreife.
In der Datenbank existiert eine Tabelle A mit einem
ID_Feld(Primärindex,Autowert,Zufall)

ich lege in einem Recordset rs= ("select * From A") einen Datensatz an.

rs.addnew
rs.field("A") = ...
.
.
.
rs.update

Nach dem Update möchte ich sofort wissen, welcher Wert im ID_Feld steht (für
referenzen auf andere tabellen/datensätze)
Im debugmodus funktioniert das ohne probleme
Im release kommt immer 0 zurück.

Gibt es eine sichere Methode zur Lösung dieses Problemes (mit DAO
funktioniert das wunderbar)
das ganze sieht mir nach einem Geschwindigkeitsproblem(caching) aus (aber
vielleicht irre ich mich auch.

Welcher Curser und welcher Locktype ist beim Datenanfügen zu empfehlen.
(Netzwerk, Multiuserumgebung)?
Gibt es eine Möglichkeit nach einem connection.execute ("Insert into
A(Wert1, wert2, wert3) values (wert4, wert5, wert6)")
herrauszufinden welcher datensatz als letztes angelegt wurde bzw. wie der
wert von ID_feld des zuletzt angelegten datensatzes ist?

Vielen dank für Vorschläge


jan eisner
Ingo Moch
2008-01-20 20:24:43 UTC
Permalink
Hallo Jan,
Post by Jan Eisner
Ich habe eine Access97 Datenbank auf die ich von
VB6 mittels ADO zugreife. In der Datenbank existiert
eine Tabelle A mit einem ID_Feld(Primärindex,
Autowert,Zufall)
ich lege in einem Recordset rs= ("select * From A")
einen Datensatz an.
rs.addnew
rs.field("A") = ...
.
.
.
rs.update
Nach dem Update möchte ich sofort wissen, welcher Wert
im ID_Feld steht (für referenzen auf andere tabellen/
datensätze)
Im debugmodus funktioniert das ohne probleme
Im release kommt immer 0 zurück.
ohne es je selbst getestet zu haben:

http://support.microsoft.com/default.aspx?scid=kb;en-us;221931

Ingo
Jan Eisner
2008-01-21 12:20:18 UTC
Permalink
Post by Ingo Moch
Hallo Jan,
Post by Jan Eisner
Ich habe eine Access97 Datenbank auf die ich von
VB6 mittels ADO zugreife. In der Datenbank existiert
eine Tabelle A mit einem ID_Feld(Primärindex,
Autowert,Zufall)
ich lege in einem Recordset rs= ("select * From A")
einen Datensatz an.
rs.addnew
rs.field("A") = ...
.
.
.
rs.update
Nach dem Update möchte ich sofort wissen, welcher Wert
im ID_Feld steht (für referenzen auf andere tabellen/
datensätze)
Im debugmodus funktioniert das ohne probleme
Im release kommt immer 0 zurück.
http://support.microsoft.com/default.aspx?scid=kb;en-us;221931
Ingo
Hallo Ingo, Hallo NG,

vielen Dank für die schnelle Hilfe.
Das mit dem Bookmark und Requery funktioniert ziemlich gut.
Leider muß ich pro Session ungefähr 1000 Datensätze in Tabelle A und 2000 in
Tabelle B und C anlegen.
Mit dem Requery dauert das jetzt 22 Minuten (15 Sekunden ohne Requery), da
braucht es geduldige Benutzer.
Gibt es vielleicht noch eine andere Möglichkeit?

MfG

Jan Eisner
Dieter Strassner
2008-01-21 20:07:48 UTC
Permalink
Hallo Jan,
Post by Jan Eisner
Post by Jan Eisner
Ich habe eine Access97 Datenbank auf die ich von
VB6 mittels ADO zugreife. In der Datenbank existiert
eine Tabelle A mit einem ID_Feld(Primärindex,
Autowert,Zufall)
[...]
Gibt es vielleicht noch eine andere Möglichkeit?
Wie wäre es zur Verkettung der Records untereinander eine selbst erzeugt
GUID zu verwenden?
Fall die Verwendung der AutoID zwingend wäre, dann die GUID einfach
zusätzlich als Verweis untereinander.
Jeder Record hat also eine eindeutige AutoInkrement-ID und eine GUID, falls
auf diesen Record andere Records verweisen. Entspricht zwar nicht der
Normalform, aber eine andere performante Lösung habe ich nicht für Dich.
--
Viele Grüße

Dieter


Rückfragen bitte nur in die Newsgroup!

EDV-Kommunikation Strassner e.K.
68623 Lampertheim
Internet: www.strassner.biz
Ingo Moch
2008-01-21 22:35:18 UTC
Permalink
Hallo Jan,
Post by Jan Eisner
Post by Ingo Moch
Post by Jan Eisner
ich lege in einem Recordset rs= ("select *
From A") einen Datensatz an.
rs.addnew
rs.field("A") = ...
.
.
.
rs.update
Nach dem Update möchte ich sofort wissen,
welcher Wert im ID_Feld steht (für
referenzen auf andere tabellen/datensätze)
Im debugmodus funktioniert das ohne probleme
Im release kommt immer 0 zurück.
http://support.microsoft.com/default.aspx?scid=kb;en-us;221931
Das mit dem Bookmark und Requery funktioniert
ziemlich gut. Leider muß ich pro Session
ungefähr 1000 Datensätze in Tabelle A und 2000
in Tabelle B und C anlegen.
Du hast also ganz klassisch ein Tabelle mit
Kopfdaten und eine mit Detaildaten?
Post by Jan Eisner
Mit dem Requery dauert das jetzt 22 Minuten (15
Sekunden ohne Requery), da braucht es geduldige
Benutzer.
Der Artikel ist schon recht alt IMHO aus ADO 2.1
Zeiten. Inzwischen gibt es die Resync-Methode,
welche - je nach gewaehlter Option - nicht alle
Daten aktuallisiert, sondern nur den aktuellen
Datensatz neu einliesst. Dann kann eingentlich
auch der Hack mit den Boockmark weg.

Sollte der Wert immer noch 0 sein, klammere das
anlegen der Kopfdaten in eine Transaktion
(BeginTrans ... CommitTrans). Das sorgt dafuer,
das die Daten sofort geschrieben werden. Ggf.
noch ein DoEvents() hinter CommitTrans.
Post by Jan Eisner
Gibt es vielleicht noch eine andere Möglichkeit?
Theoretisch wuerde ich jetzt an Stapelverarbeitung
denken. Da weiss ich aber gar nicht, ob es da
irgend etwas "wildes" gibt, was den Autowert angeht.
Wenn es dich interessiert, kannst Du mal bei
http://groups.google.de/group/microsoft.public.de.vb.datenbank/browse_thread/thread/6b7f351e53c22e5f/e6fdfef150a60906?hl=de#e6fdfef150a60906
ansetzen.

Ingo
Jan Eisner
2008-01-22 08:01:39 UTC
Permalink
Post by Ingo Moch
Hallo Jan,
Post by Jan Eisner
Post by Ingo Moch
Post by Jan Eisner
ich lege in einem Recordset rs= ("select *
From A") einen Datensatz an.
rs.addnew
rs.field("A") = ...
.
.
.
rs.update
Nach dem Update möchte ich sofort wissen,
welcher Wert im ID_Feld steht (für
referenzen auf andere tabellen/datensätze)
Im debugmodus funktioniert das ohne probleme
Im release kommt immer 0 zurück.
http://support.microsoft.com/default.aspx?scid=kb;en-us;221931
Das mit dem Bookmark und Requery funktioniert
ziemlich gut. Leider muß ich pro Session
ungefähr 1000 Datensätze in Tabelle A und 2000
in Tabelle B und C anlegen.
Du hast also ganz klassisch ein Tabelle mit
Kopfdaten und eine mit Detaildaten?
Post by Jan Eisner
Mit dem Requery dauert das jetzt 22 Minuten (15
Sekunden ohne Requery), da braucht es geduldige
Benutzer.
Der Artikel ist schon recht alt IMHO aus ADO 2.1
Zeiten. Inzwischen gibt es die Resync-Methode,
welche - je nach gewaehlter Option - nicht alle
Daten aktuallisiert, sondern nur den aktuellen
Datensatz neu einliesst. Dann kann eingentlich
auch der Hack mit den Boockmark weg.
Sollte der Wert immer noch 0 sein, klammere das
anlegen der Kopfdaten in eine Transaktion
(BeginTrans ... CommitTrans). Das sorgt dafuer,
das die Daten sofort geschrieben werden. Ggf.
noch ein DoEvents() hinter CommitTrans.
Post by Jan Eisner
Gibt es vielleicht noch eine andere Möglichkeit?
Theoretisch wuerde ich jetzt an Stapelverarbeitung
denken. Da weiss ich aber gar nicht, ob es da
irgend etwas "wildes" gibt, was den Autowert angeht.
Wenn es dich interessiert, kannst Du mal bei
http://groups.google.de/group/microsoft.public.de.vb.datenbank/browse_thread/thread/6b7f351e53c22e5f/e6fdfef150a60906?hl=de#e6fdfef150a60906
ansetzen.
Ingo
hallo Ingo,

vielen dank für deine Info.
ich benutze ADO2.8
wenn ich versuche ein Resync auszuführen, bekomme ich eine Fehlermeldung
"Nicht genügend Basisinformationen zu aktualisieren"
Ich denke dass Resync die ID benötigt, die ich noch nicht im datensatz zu
stehen habe.

MfG

Jan
Peter Götz
2008-01-22 12:34:49 UTC
Permalink
Hallo Jan,

wie öffnest Du Deine Connection und Dein RS (Code)?

Mit dem Provider Microsoft.Jet.OLEDB.4.0 und einer
Access.mdb (ab Version Access2k) werden die
neuen Autowerte nach einem

Recordset.AddNew
...
Recordset.Update

im RS sofort sichtbar.
Du müsstest somit nur Deine Access97.mdb nach
Access2k.mdb konvertieren.

Hier mal ein Codebeispiel welches auf eine Access2k
oder höher mit einer Tabelle

TabellenName: "Tabelle"
Feld "ID", Autowert, adInteger
Feld "Text", Textfeld
Feld "Datum", adDate

' /// Code in Form1 mit 1 DataGrid "DataGrid1"
Option Explicit
Private mCnn As ADODB.Connection
Private WithEvents mRS As ADODB.Recordset

Private Sub Form_Load()
Dim FileName As String

Me.ScaleMode = vbPixels

FileName = "D:\DataBase\DB.mdb"

Set mCnn = New ADODB.Connection
With mCnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source") = FileName
.Properties("Jet OLEDB:Database Password") = ""
.Properties("Jet OLEDB:Database Locking Mode") = 1
.Mode = adModeShareDenyNone
.CursorLocation = adUseClient
.Open
End With

Set mRS = New ADODB.Recordset
With mRS
Set .ActiveConnection = mCnn
.Source = "Select * From Tabelle"
.CursorType = adOpenStatic
.CursorLocation = adUseClient
.LockType = adLockOptimistic
.Open
End With

Set DataGrid1.DataSource = mRS
With DataGrid1
.AllowAddNew = True
.AllowDelete = True
.AllowUpdate = True
End With
End Sub

Private Sub Form_QueryUnload _
(Cancel As Integer, _
UnloadMode As Integer)

Set DataGrid1.DataSource = Nothing

Select Case True
Case mRS Is Nothing
Case (mRS.State And adStateOpen) = _
adStateOpen

If mRS.EditMode <> adEditNone Then
mRS.Update
End If
mRS.Close
End Select

Select Case True
Case mCnn Is Nothing
Case (mCnn.State And adStateOpen) = _
adStateOpen

mCnn.Close
End Select
End Sub

Private Sub Form_Resize()
DataGrid1.Move _
10, 10, _
Me.ScaleWidth - 20, _
Me.ScaleHeight - 20
End Sub

Private Sub DataGrid1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
DataGrid1.Row = DataGrid1.Row + 1
DataGrid1.Col = 1
End If
End Sub
' \\\

Programm starten und im DataGrid nur Text und Datum
eintragen und abschliessen mit Eingabetaste. Der neue
Autowert wird sofort sichtbar.

Wenn Du mit einem "Insert Into ...." Command einen
neuen Datensatz einfügst, kannst Du den Autowert
anschl. mit

"SELECT @@Identity"

bekommen. Mehr dazu im MSDN-Artikel

Q232144
INFO: Jet OLE DB Provider Version 4.0
Supports SELECT @@Identity

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Joachim Granzow
2008-01-22 22:15:33 UTC
Permalink
Ich kenne mich mit deinem Provider nicht aus, aber beim SQL-Server mit
ADO kämpfte ich mit demselben Problem, bis ich folgendes einführte:

Function LastIdentity(Tabelle As String) As Long
LastIdentity = GetField("@@identity")
If LastIdentity = 0 Then LastIdentity = sqlsrvcnn.execute("SELECT
max(id) FROM " & Tabelle).fields(0).Value
End Function

Mal klappt das @@, zumindest aber immer das max(id). Nicht besonders
elegant, aber löpt.

Jochen
Peter Fleischer
2008-01-23 03:42:26 UTC
Permalink
Post by Joachim Granzow
Ich kenne mich mit deinem Provider nicht aus, aber beim SQL-Server mit
Function LastIdentity(Tabelle As String) As Long
If LastIdentity = 0 Then LastIdentity = sqlsrvcnn.execute("SELECT
max(id) FROM " & Tabelle).fields(0).Value
End Function
elegant, aber löpt.
Hi Jochen,
anstelle von "@@Identity" sollte "Scope_Identity". Das klappt immer. Die
Nutzung von max kann in einer Mehrnutzerumgebung zu falschen Werten führen,
wenn beispielsweise ein anderer Nutzer zwischen zeitlich einen neune
Datensatz angelegt hat.
--
Viele Gruesse

Peter
Joachim Granzow
2008-01-23 07:50:20 UTC
Permalink
Post by Joachim Granzow
If LastIdentity = 0 Then LastIdentity = sqlsrvcnn.execute("SELECT
max(id) FROM " & Tabelle).fields(0).Value
Vielen Dank, aber funktioniert das auch über ADO?

Bei dem nachfolgenden Test gibt jedenfalls immer erst die max(id)
Variante (unabhängig von der Reihenfolge) den richtigen Wert zurück:

Dim rst As New ADODB.Recordset, cnn As New Connection
cnn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist
Security Info=False;Initial Catalog=gap;Data Source=(local)"
rst.Open "Adressen", cnn, , adLockOptimistic
rst.AddNew
rst.Fields("Nachname").Value = "Peter"
rst.Update
Debug.Print rst!id
Debug.Print cnn.Execute("SELECT Scope_Identity()").Fields(0).Value
Debug.Print cnn.Execute("SELECT @@identity").Fields(0).Value
Debug.Print cnn.Execute("SELECT max(id) FROM
adressen").Fields(0).Value
rst.Close
Peter Fleischer
2008-01-23 08:25:08 UTC
Permalink
Post by Joachim Granzow
Vielen Dank, aber funktioniert das auch über ADO?
Bei dem nachfolgenden Test gibt jedenfalls immer erst die max(id)
Hi Joachim,
die Abfrage muss natürlich im gleichen Scopa ausgeführt werden und nicht
erst später wie bei dir.
--
Viele Gruesse

Peter
Ingo Moch
2008-01-23 20:37:47 UTC
Permalink
Hallo Joachim,
Post by Joachim Granzow
Ich kenne mich mit deinem Provider nicht aus,
aber beim SQL-Server mit ADO kämpfte ich mit
Function LastIdentity(Tabelle As String) As Long
If LastIdentity = 0 Then LastIdentity = _
sqlsrvcnn.execute("SELECT max(id) FROM " _
& Tabelle).fields(0).Value
End Function
Es gibt in der MSKB eine Artikel dazu. Ich finde
ihn im Moment leider nicht. Dort wird dieses
Phaenomen beschrieben und darauf zurueckgefuehrt,
dass z. B. Trigger auf der Tabelle werkeln und ein
Timming-Problem ausloesen.
Das "mal klappt das" koennte auf die im Augenblick
der Updates/Inserts vorhandene Serverlast
zurueckzufehren sein.

Das MAX(ID) ist recht feheranfaellig, aber das ist
@@Identity auch, wenn auch nicht in dem Masse. In
http://support.microsoft.com/kb/233299/en-us steht
folgendes:

The second important piece of information is
that insert triggers may cause you to
retrieve a different value than you would have
expected. For example, assume that you insert
a row into a table that uses an auto-increment
field. If there's a trigger on that table that
causes you to insert a row into another table
that also uses an auto-increment field, the
SELECT @@identity query will still retrieve the
last auto-increment value generated on your
connection. This means that the value you receive
will correspond to the auto-increment value
generated on the second table rather than on the
table that you referenced directly. [...]

Ich gehe davon aus, dass scope_identity dasselbe
Problem hat.

Die Moeglichkeit mit den hoechsten
Erfolgsaussichten duerfte, wie Peter Goetz schon
schrieb, folgendes sein:

rs.AddNew
rs.Fields("foo").Value = "x"
rs.Update
Debug.Print rs.Fields("ID").Value
Jan Eisner
2008-01-23 13:51:33 UTC
Permalink
Hallo Peter, Hallo NG,

vielen Dank für die Antwort.
Ich habe bis jetzt meine Access97.mdb mit
mCnn .CursorLocation = adUseServer geöffnet.
macht es bei Access97 einen Unterschied, ob adUseServer oder adUseClient
benutzt wird.

nach Deinem
Set mRs.ActiveConnection = mCnn
machst du nochmal
mRs.CursorLocation = adUseClient
wird der Wert nicht vom mCnn auf mRs übertragen?

MfG

Jan Eisner
Post by Ingo Moch
Hallo Jan,
wie öffnest Du Deine Connection und Dein RS (Code)?
Mit dem Provider Microsoft.Jet.OLEDB.4.0 und einer
Access.mdb (ab Version Access2k) werden die
neuen Autowerte nach einem
Recordset.AddNew
...
Recordset.Update
im RS sofort sichtbar.
Du müsstest somit nur Deine Access97.mdb nach
Access2k.mdb konvertieren.
Hier mal ein Codebeispiel welches auf eine Access2k
oder höher mit einer Tabelle
TabellenName: "Tabelle"
Feld "ID", Autowert, adInteger
Feld "Text", Textfeld
Feld "Datum", adDate
' /// Code in Form1 mit 1 DataGrid "DataGrid1"
Option Explicit
Private mCnn As ADODB.Connection
Private WithEvents mRS As ADODB.Recordset
Private Sub Form_Load()
Dim FileName As String
Me.ScaleMode = vbPixels
FileName = "D:\DataBase\DB.mdb"
Set mCnn = New ADODB.Connection
With mCnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source") = FileName
.Properties("Jet OLEDB:Database Password") = ""
.Properties("Jet OLEDB:Database Locking Mode") = 1
.Mode = adModeShareDenyNone
.CursorLocation = adUseClient
.Open
End With
Set mRS = New ADODB.Recordset
With mRS
Set .ActiveConnection = mCnn
.Source = "Select * From Tabelle"
.CursorType = adOpenStatic
.CursorLocation = adUseClient
.LockType = adLockOptimistic
.Open
End With
Set DataGrid1.DataSource = mRS
With DataGrid1
.AllowAddNew = True
.AllowDelete = True
.AllowUpdate = True
End With
End Sub
Private Sub Form_QueryUnload _
(Cancel As Integer, _
UnloadMode As Integer)
Set DataGrid1.DataSource = Nothing
Select Case True
Case mRS Is Nothing
Case (mRS.State And adStateOpen) = _
adStateOpen
If mRS.EditMode <> adEditNone Then
mRS.Update
End If
mRS.Close
End Select
Select Case True
Case mCnn Is Nothing
Case (mCnn.State And adStateOpen) = _
adStateOpen
mCnn.Close
End Select
End Sub
Private Sub Form_Resize()
DataGrid1.Move _
10, 10, _
Me.ScaleWidth - 20, _
Me.ScaleHeight - 20
End Sub
Private Sub DataGrid1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
DataGrid1.Row = DataGrid1.Row + 1
DataGrid1.Col = 1
End If
End Sub
' \\\
Programm starten und im DataGrid nur Text und Datum
eintragen und abschliessen mit Eingabetaste. Der neue
Autowert wird sofort sichtbar.
Wenn Du mit einem "Insert Into ...." Command einen
neuen Datensatz einfügst, kannst Du den Autowert
anschl. mit
bekommen. Mehr dazu im MSDN-Artikel
Q232144
INFO: Jet OLE DB Provider Version 4.0
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Ingo Moch
2008-01-23 21:57:48 UTC
Permalink
Hallo Jan,
Post by Jan Eisner
wenn ich versuche ein Resync auszuführen,
bekomme ich eine Fehlermeldung "Nicht genügend
Basisinformationen zu aktualisieren"
Mit "Basisinformationen" ist der Primaerschluessel
gemeint bzw. das Feld/die Felder die ihn vorhalten.
Beim Oeffen des Recordsets sollte er mit selektiert
werden (also nicht "SELECT foo FROM t1", sondern
"SELECT ID, foo FROM t1").
Post by Jan Eisner
Ich denke dass Resync die ID benötigt, die ich
noch nicht im datensatz zu stehen habe.
Vorsichtshalber: Mit ID meinst Du den
Primaerschluessel!?

... dann waere es warscheinlich, dass der
benoetigt wird.

http://groups.google.de/group/microsoft.public.vb.controls.databound/browse_thread/thread/dc2bc99ef3966bdf/c51c61410a2dca3d?hl=de&lnk=st#c51c61410a2dca3d
scheint dein Problem zu beschreiben. Da steht
was von serverseitigem Cursor.

Eventuell laesst sich auch etwas ueber die
dynamischen Eigenschaften "Unique Table" und
"Resync Command" erreichen, wenn Du anhand
anderer Felder den Datensatz eindeutig
identifizieren kannst. Aber auch das ist
etwas was ich bisher nie gemacht habe. In der
ADO-Hilfe steht dazu mehr.

Da es meinerseits immer mehr ein stochern im
Nebel ist, klinke ich mich hiermit aus diesem
Thread aus.

HTH
Ingo
Jan Eisner
2008-01-28 11:10:10 UTC
Permalink
Hallo NG,

erstmal vielen Dank an alle Beiträge zur Lösung meines Problems.
Ich habe mich entschlossen von Access97 nach Access2000 zu wechseln. Nicht
nur weil die Autowerte zuverlässig ausgelesen werden können, sondern auch
die Performance sehr viel besser zu sein scheint.
Gibt es eine Möglichkeit Acc97 Datenbanken per VB6_Code in eine Access2000
Datenbank umzuwandeln?

MfG

Jan Eisner
Ingo Moch
2008-01-28 20:21:57 UTC
Permalink
Post by Jan Eisner
Ich habe mich entschlossen von Access97 nach
Access2000 zu wechseln. Nicht nur weil die
Autowerte zuverlässig ausgelesen werden können,
sondern auch die Performance sehr viel besser
zu sein scheint.
... und hier findest Du den Grund dafuer:
http://support.microsoft.com/kb/240434/en-us
Post by Jan Eisner
Gibt es eine Möglichkeit Acc97 Datenbanken per
VB6_Code in eine Access2000 Datenbank
umzuwandeln?
Das sollte mit der in der Bibliothek "Jet and
Replication Objects" (JRO) enthaltenen
CompactDatabase gehen. So auf die Schnelle habe
ich nur ein Beispiel in Dephi (in die umgekehrte
Richtung) gefunden:

http://entwickler-forum.de/showthread.php?t=8856

Ist aber recht uebersichtlich und IMHO auch fuer
VBler verstaendlich.

HTH
Ingo
Peter Götz
2008-01-29 09:13:26 UTC
Permalink
Hallo Jan,
Post by Jan Eisner
Gibt es eine Möglichkeit Acc97 Datenbanken per
VB6_Code in eine Access2000 Datenbank umzuwandeln?
Ja, mit der Methode

Jro.JetEngine.CompactDataBase()

kannst Du aus Deinem VB-Code heraus eine *.mdb
komprimieren, reparieren und dabei auch die Version
der neuen, komprimierten *.mdb bestimmen. Es ist
jedoch nur möglich von einer älteren zu einer neueren
Version zu konvertieren. Von neuerer zu älterer Version
ist dagegen nicht möglich.

Ein Beispiel findest Du unter

www.gssg.de -> Visual Basic -> VBclassic
-> Datenbank -> Compact DataBase

Das Beispiel enthält im Modul modCompactJetDB.bas
eine

Sub JetCompactDatabase()

der Du u.a. einen Parameter für die gewünschte
Version der komprimierten Ausgabedatei übergeben
kannst.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Loading...