Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

odbc - direct, recordset schreibgeschützt...

36 views
Skip to first unread message

Hermann Gahm

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hallo NG,

mit folgendem code:

mit diesem code:

'informix
Dim ws As Workspace
Dim con As Connection
Dim rsifx As Recordset

Set ws = CreateWorkspace("Demo", "AXENT", "axent11", dbUseODBC)
Set con = ws.OpenConnection("applixtest", , False)
Set rsifx = con.OpenRecordset("query", dbOpenDynaset)

'access
Dim db As Database
Dim rsacc As Recordset

Set db = CurrentDb
Set rsacc = db.OpenRecordset("query", dbOpenTable)

rsacc.MoveFirst
rsifx.AddNew
'undsoweiterundsofort

öffne ich 2 recodsets und versuche daten vom accessrecordset ind das
informixrs zu bekommen. nun ist das odbc-direct rs aber schreibgeschützt.
per voreinstellung. as muss ich anstellen um das zu ändern?

besten dank für evtl. hilfe im voraus.

hermann

Frank Hammerschmidt

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hallo Herrmann

Hermann Gahm <H.G...@gmx.de> schrieb in im Newsbeitrag:
OYk3WQkG$GA....@cppssbbsa02.microsoft.com...

...


> Set ws = CreateWorkspace("Demo", "AXENT", "axent11", dbUseODBC)
> Set con = ws.OpenConnection("applixtest", , False)
> Set rsifx = con.OpenRecordset("query", dbOpenDynaset)
>
> 'access
> Dim db As Database
> Dim rsacc As Recordset
>
> Set db = CurrentDb
> Set rsacc = db.OpenRecordset("query", dbOpenTable)
>

Hier macht mich das "query" stutzig. Vielleicht ist das ja
wirklich ein Abfragetext. Dieser muss die Primärschlüssel aller
beteiligten Tabellen enthalten, sonst => schreibgeschützt.
Zugrundeliegende Tabellen müssen natürlich auch erst mal einen PK
haben.

Auch habe ich ein Problem mit Deinem Verbindungsaufbau. Du machst
zwar oben einen ODBC-Workspace auf, setzt aber dann die Variable
db auf die CurrentDB. Das kann nicht gut gehen.

Hier ist mal ein Beispiel zum erzeugen einer
ODBC-Direkt-Verbindung

Public wsODBC as DAO.Workspace

Im Initialize meiner Klasse habe ich dann:

Set wsODBC = DBEngine.CreateWorkspace("", "", "", dbUseODBC)

Private Function getODBCDirekt(DriverType As Long) As Connection
Dim errx As Object

On Error GoTo err_getODBCDirekt

wsODBC.DefaultCursorDriver = DriverType

Set getODBCDirekt = wsODBC.OpenConnection("", , , _
"ODBC;DSN=" & mstrUserDSN & ";UID=" & mstrUserName & _
";PWD=" & mstrUserPassword & ";DATABASE=" & mstrDatabase)

exit_getODBCDirekt:
Set errx = Nothing
Exit Function

err_getODBCDirekt:
For Each errx In DBEngine.Errors
Err.Raise Err.Number, Err.Source, Err.Description,
Err.HelpFile, Err.HelpContext
Next errx
Resume exit_getODBCDirekt

End Function

Gruß

Frank

Frank Hammerschmidt

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to

Frank Hammerschmidt <Frank.Ham...@lr-online.de> schrieb in
im Newsbeitrag: Oz9rclkG$GA.150@cppssbbsa04...

> Hallo Herrmann
>
> Hermann Gahm <H.G...@gmx.de> schrieb in im Newsbeitrag:
> OYk3WQkG$GA....@cppssbbsa02.microsoft.com...
>
> ...

> Auch habe ich ein Problem mit Deinem Verbindungsaufbau. Du


machst
> zwar oben einen ODBC-Workspace auf, setzt aber dann die
Variable
> db auf die CurrentDB. Das kann nicht gut gehen.
>

Quark, hier habe ich Deine Frage nicht richtig gelesen. Sorry
Bleibt also nur das mit den Primärschlüsseln.

Frank

Hermann Gahm

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hallo Frank,

> Hier macht mich das "query" stutzig. Vielleicht ist das ja
> wirklich ein Abfragetext. Dieser muss die Primärschlüssel aller
> beteiligten Tabellen enthalten, sonst => schreibgeschützt.
> Zugrundeliegende Tabellen müssen natürlich auch erst mal einen PK
> haben.

query sind in beiden fällen tabellen. (blöde namen zugegeben...) ich krieg
die beiden recordsets auch auf, erst beim rsifx.update mag er nicht mehr.
lt. doku ist ein odbcdirect rs per default schreibgeschützt. ich fand aber
keinen hinweis darauf wie ich dem abhelfe das ich schreiben kann...

das muss doch gehen (?)

grüsse
hermann

Frank Hammerschmidt

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hallo Herrmann,
ich bin jetzt zu faul, aus nachfolgendem Beispiel das Unwichtige
rauszulöschen, guck' mal, was Du davon gebrauchen kannst.
_______________

Public Function SaveNewBlg(Buchungsnummer As Long, Streutermin As
Date, _
Agentur As Long, Kunde As Long, KundenName As String, Streuart As
Integer, _
Gewicht As Integer, ByVal rsBookings As DAO.Recordset,
Bemerkungen As String, _
Wunschtermin As Date) As Boolean

Dim conBatchUpd As DAO.Connection
Dim strSQL As String
Dim strExc As String
Dim rsTo As DAO.Recordset
Dim blnRunTrans As Boolean

On Error GoTo err_SaveNewBlg

Set conBatchUpd = getODBCDirekt(dbUseClientBatchCursor)

strSQL = "SELECT Buchungsnummer, Gem_ID, Abo_Fest, RHH_Fest, "
& _
"Bemerkung FROM tblBookings WHERE 0 = 1"

wsODBC.BeginTrans
blnRunTrans = True

strExc = "EXECUTE blg_AddJob " & Buchungsnummer & ", '" &
MilDate(Streutermin) & _
"', '" & MilDate(Wunschtermin) & "', " & Agentur & ", " &
Kunde & ", '" & KundenName & "', " & _
Streuart & ", " & Gewicht & ", '" & Bemerkungen & "'"

conBatchUpd.Execute (strExc)

Set rsTo = conBatchUpd.OpenRecordset(strSQL, dbOpenDynamic,
0, dbOptimisticBatch)

With rsBookings
.MoveFirst
While Not .EOF
rsTo.AddNew
rsTo!Buchungsnummer = Buchungsnummer
rsTo!Gem_Id = !Gem_Id
rsTo!Abo_Fest = !Abo_Fest
rsTo!RHH_Fest = !RHH_Fest
rsTo!Bemerkung = !Bemerkung
rsTo.Update
.MoveNext
Wend
End With

rsTo.Update (dbUpdateBatch)

wsODBC.CommitTrans
SaveNewBlg = True

exit_SaveNewBlg:
On Error Resume Next
rsTo.Close
Set rsTo = Nothing
conBatchUpd.Close
Set conBatchUpd = Nothing

Exit Function

err_SaveNewBlg:
If blnRunTrans Then
wsODBC.Rollback
Else
MsgBox Err.Description & vbCrLf & Err.Number & vbTab &
Err.Source, vbInformation, conCust
End If
Resume exit_SaveNewBlg

End Function

________________

Gruß

Frank

Hermann Gahm <H.G...@gmx.de> schrieb in im Newsbeitrag:

#hTerskG$GA....@cppssbbsa02.microsoft.com...

Uwe Ricken

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hallo Hermann,

das funktioniert nicht, da Du das Recordset als "VIEW" öffnest. Wenn Du mit
ODBCDirekt arbeitest, dann solltest Du auf jedem Fall mit den SQLBefehlen
arbeiten:

Beispiel:
Anstelle von einem Recordset in ein anderes zu "kopieren", verwende SQL:
"INSERT INTO tbl..." usw.


--
Gruß, Uwe Ricken
MCP FOR MS ACCESS DEVELOPMENT
GNS GmbH, Frankfurt am Main

Hermann Gahm <H.G...@gmx.de> schrieb in im Newsbeitrag:

OYk3WQkG$GA....@cppssbbsa02.microsoft.com...


> Hallo NG,
>
> mit folgendem code:
>
> mit diesem code:
>
> 'informix
> Dim ws As Workspace
> Dim con As Connection
> Dim rsifx As Recordset
>

> Set ws = CreateWorkspace("Demo", "AXENT", "axent11", dbUseODBC)
> Set con = ws.OpenConnection("applixtest", , False)
> Set rsifx = con.OpenRecordset("query", dbOpenDynaset)
>
> 'access
> Dim db As Database
> Dim rsacc As Recordset
>
> Set db = CurrentDb
> Set rsacc = db.OpenRecordset("query", dbOpenTable)
>

> rsacc.MoveFirst
> rsifx.AddNew
> 'undsoweiterundsofort

Frank Hammerschmidt

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hallo Uwe,

das krieg ich nicht gebacken:

> Anstelle von einem Recordset in ein anderes zu "kopieren",
verwende SQL:
> "INSERT INTO tbl..." usw.
>

funktioniert ja schön, wenn ich in einer Welt bleibe. Aber wie
löse ich mit diesem Ansatz unter ODBC-Direkt die Aufgabe, eine
Access-Tabelle auf den SQL-Server zu schaufeln?

Hast Du bitte ein kleines Beispiel?

Danke

Frank

Frank Hammerschmidt

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
... was mir (abseits von ODBC-Direkt) noch einfällt, ist, auf dem
Server eine Sicht zu erstellen "SELECT * FROM Tabelle WHERE 0=1"
und diese als Tabelle einzubinden.

Ich glaube, jetzt sollte ich mal meine Abneigung gegen
eingebundene Servertabellen ablegen.

Dann geht's natürlich problemlos.

Gruß

Frank


Frank Hammerschmidt <Frank.Ham...@lr-online.de> schrieb in

im Newsbeitrag: OoEQsPlG$GA.276@cppssbbsa04...

Uwe Ricken

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hallo Frank,

vielleicht war meine Erklärung etwas unklar (schäm).

Folgendes:
Wenn Du ein TSQL-Statement an ein Recordset bindest, dann ist das immer
schreibgeschützt (genau wie Views).
Deswegen kann natürlich in dieses Recordset kein Datensatz eingefügt werden.
Stattdessen kann Hermann mit PassThrough-Abfragen die Daten in die andere
Tabelle "kopieren"

Beispiel ACC97 und DAO

Dim DB As Database
Dim RS As RecordSet
Dim QDef As QueryDef
Dim strSQL As String

Set DB = CUrrentDB()
Set RS = db.OpenRecordSet("KopierTabelle", dbOpenForwardOnly)

Set QDef = DB.CreateQueryDef("")
While Not rs.Eof
strSQL = "INSERT INTO Zieltabelle (Feld1, Feld2, Feld3...) VALUES (" &
rs.Fields(1) & "," & rs.Fields(2)... & ")"
With QDef
.Connect = ODBCKonfig
.SQL = strSQL
.ReturnsRecords = True
.Execute
End With
rs.MoveNext
Wend

set QDef = Nothing
Set RS = Nothing
Set DB = NOthing

Ich war leider zu faul, einen Beispielcode dazu zu geben. Das habe ich nun
getan.

Einen schönen Abend noch

--
Gruß, Uwe Ricken
MCP FOR MS ACCESS DEVELOPMENT
GNS GmbH, Frankfurt am Main

Frank Hammerschmidt <Frank.Ham...@lr-online.de> schrieb in im

Frank Hammerschmidt

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hi Uwe,

Uwe Ricken <ric...@gns-online.de> schrieb in im Newsbeitrag:
eKqrKclG$GA....@cppssbbsa02.microsoft.com...
...

> Wenn Du ein TSQL-Statement an ein Recordset bindest, dann ist
das immer
> schreibgeschützt

nein!

> (genau wie Views).

nein!

siehe Bsp. oben

Gruß

Frank


Hermann Gahm

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hallo Frank,


> Set rsTo = conBatchUpd.OpenRecordset(strSQL, dbOpenDynamic,
> 0, dbOptimisticBatch)
>
> With rsBookings
> .MoveFirst
> While Not .EOF
> rsTo.AddNew
> rsTo!Buchungsnummer = Buchungsnummer
> rsTo!Gem_Id = !Gem_Id
> rsTo!Abo_Fest = !Abo_Fest
> rsTo!RHH_Fest = !RHH_Fest
> rsTo!Bemerkung = !Bemerkung
> rsTo.Update
> .MoveNext
> Wend
> End With


werd ich so morgen mal probieren.
das sieht so aus als würde es das machen was ich möchte...

vielen dank einstweilen.

hermann

Frank Hammerschmidt

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Huchje,
gerade sehe ich, dass es Dir um Informix geht. Ich habe keine
Ahnung, ob Informix BatchUpdates kennt. Aber es muss kein
UpdateBatch sein, schau' mal unter OpenRecordset nach den für
ODBC-Direkt gültigen Optionen.

Frank


Frank Hammerschmidt <Frank.Ham...@lr-online.de> schrieb in

im Newsbeitrag: #5r2T4kG$GA.249@cppssbbsa05...

> Set rsTo = conBatchUpd.OpenRecordset(strSQL, dbOpenDynamic,
> 0, dbOptimisticBatch)
>
> With rsBookings
> .MoveFirst
> While Not .EOF
> rsTo.AddNew
> rsTo!Buchungsnummer = Buchungsnummer
> rsTo!Gem_Id = !Gem_Id
> rsTo!Abo_Fest = !Abo_Fest
> rsTo!RHH_Fest = !RHH_Fest
> rsTo!Bemerkung = !Bemerkung
> rsTo.Update
> .MoveNext
> Wend
> End With
>

> rsTo.Update (dbUpdateBatch)
>
> wsODBC.CommitTrans
> SaveNewBlg = True
>
> exit_SaveNewBlg:
> On Error Resume Next
> rsTo.Close
> Set rsTo = Nothing
> conBatchUpd.Close
> Set conBatchUpd = Nothing
>
> Exit Function
>
> err_SaveNewBlg:
> If blnRunTrans Then
> wsODBC.Rollback
> Else
> MsgBox Err.Description & vbCrLf & Err.Number & vbTab &
> Err.Source, vbInformation, conCust
> End If
> Resume exit_SaveNewBlg
>
> End Function
>
> ________________
>
> Gruß
>
> Frank
>

> Hermann Gahm <H.G...@gmx.de> schrieb in im Newsbeitrag:

Frank Hammerschmidt

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Hallo Uwe,
man soll ja nicht kleinlich sein, aber ...

Uwe Ricken <ric...@gns-online.de> schrieb in im Newsbeitrag:
eKqrKclG$GA....@cppssbbsa02.microsoft.com...


> .ReturnsRecords = True

????

Und: Hast Du eventuell mal die Performance dieser mit der anderer
Uploadmöglichkeiten verglichen. Würde mich wirklich
interessieren.


Gruß

Frank

Uwe Ricken

unread,
Oct 20, 1999, 3:00:00 AM10/20/99
to
Hallo Frank,

sorry, da hast Du recht. Eine Aktionsabfrage liefert natürlich keine
Datensätze zurück!

Bezüglich der Views/SQL-Statements würde mich aber mal doch interessieren,
ob Du schon einmal in das Ergebins einer PassThroughQuerry weitere
Datensätze einfügen konntest.

Bezüglich der Performance haben wir auch schon Tests durchgeführt und waren
bei INSERTS mittels PTQ wesentlich schneller, als mit AddNew über ein
RecordSet

--
Gruß, Uwe Ricken
MCP FOR MS ACCESS DEVELOPMENT
GNS GmbH, Frankfurt am Main

Frank Hammerschmidt <Frank.Ham...@lr-online.de> schrieb im Beitrag
<#GO5PJnG$GA.282@cppssbbsa04>...

Frank Hammerschmidt

unread,
Oct 20, 1999, 3:00:00 AM10/20/99
to
Hallo Uwe,

Uwe Ricken <ric...@gns-online.de> schrieb in im Newsbeitrag:

01bf1ae9$35d95180$ac1b...@pc172.bartsch.de...

>
> Bezüglich der Views/SQL-Statements würde mich aber mal doch
interessieren,
> ob Du schon einmal in das Ergebins einer PassThroughQuerry
weitere
> Datensätze einfügen konntest.
>

von PT's war ja zum diesem Zeitpunkt keine Rede. Das geht
natürlich nicht.

> Bezüglich der Performance haben wir auch schon Tests
durchgeführt und waren
> bei INSERTS mittels PTQ wesentlich schneller, als mit AddNew
über ein
> RecordSet

dafür vielen Dank


Gruß

Frank

0 new messages