Access'10 via ODBC zu postgreSQL, �bertragung von ByteArray dauert sehr lang

Hallo,

Situation:

ich bin dabei eine bestehende Access Datenbanken in postgres einzufügen. Dafür habe ich mir in VBA ein Programm geschrieben, dass via ODBC mit dem postgres Serverprogramm kommuniziert. Das funktioniert. Ein Problem taucht bei den OLE-Objekt (Access Datentyp: long-binary (ByteArray)) auf, welche ich Byte für Byte kopieren will.

Problem:
der Code funktioniert und ist extrem langsam, die CPU ist voll ausgelastet und er brauch ewig um die Daten aufzubereiten.

[u]Frage:
[/u]
Gibt es eine bessere Möglichkeit das ByteArray 1:1 via ODBC in postgres einzufügen?
(die Byte-Sequenz soll direkt in der Tabelle gespeichert sein, d.h. keine OID und LargeObject und keine externe Speicherung im Dateisystem)

ist gekürzter VBA Code, ich möchte hier nur zeigen, wie ich die Übertragung gestalte.

Dim sData As String
Dim aBytes() As Byte

ReDim aBytes(rs.Fields(i).FieldSize)
aBytes() = rs.Fields(i).GetChunk(0, rs.Fields(i).FieldSize)        <--- das ByteArray (Access'10) wird mit allen Bytes gefüllt

sData = aBytes(0)                                                                  <--- erste Byte wird in Variable "sData" kopiert

For j = 1 To rs.Fields(i).FieldSize - 1                                         <--- restliche Byte an "sData" angefügt (Kommata getrennt)
      sData = sData & "," & aBytes(j)                                      
 Next j

conn_postgres.Execute ("UPDATE  tabelle  SET binarydata = '{sData}'  WHERE id=...")                  <----ODBC SQL-Befehl für postgres

F�r Tipps und Hinweise bin ich dankbar :slight_smile:

Ich würde mir als erstes anschauen welcher Teil deines Programms wie lange benötigt …

Oh, und hier eine Quizfrage für dich: was passiert wenn ein \000 Byte (binär 0) in deinem File ist?

Die For-Schleife zum füllen der Variable sData dauert ewig. Alternativ hatte ich probiert jedes Byte mit einer einzelnen SQL Anfrage einzufügen, aber das war zeitmäßig der Super-GAU, weil ich tausende Anfrage generiert habe. Deshalb die Idee mit der kommata-getrennten Variable und dem einen SQL-Befehl.

Antwort: ich würd sagen er kopiert NULL 1:1 in das jeweilige Array-Feld.

hi,

ich speichere Bitmaps in Type “bytea” im HEX Format statt escape.
vielleicht könntest du den Inhalt deines BLOB vom BIN ins HEX Format konvertieren bevor du ein INSERT / UPDATE machst.

Hex- und ESCAPE - Format sind lediglich 2 unterschiedliche Ausgabeformate für BYTEA. Das läßt sich z.B. per Session, per User oder per Database einstellen. Auf die interne Speicherung hat das aber keinen Einfluß.

Andreas

Gibt es eine andere Möglichkeit die Daten einzufügen?

Für meinen UPDATE SQL-Befehl nutze ich ja jetzt die Variable sData, deren Inhalt z.B. so aussieht: “23,12,5,63,…” und so weiter

Wenn ich auf das Komma zwischen den Werten verzichten könnte, ist das Programm gut 60% schneller beim Füllen der “sData” (die oben genannte FOR-Schleife)

Problem ist nur, dass ich ohne Komma die Werte nicht mehr auseinanderhalten kann und dann für jedes Byte eine SQL-Update Anfrage ausführe (und diese vielen SQL Anfragen machen das wieder extrem langsam)

Ok, das Problem liegt eindeutig im Generieren der Variable. Daher ist es ein VBA Problem und nicht postgres.

Die Lösung und eine Erklärung, warum das Generieren so lange dauert, findet ihr hier:

Acc2010 - einfache Variable aus ByteArray füllen (extrem langsam), 100% CPU Last - MS-Office-Forum

(kurz gesagt: Anstatt der For-Schleife sollte man die VBA Funktion “Join” benutzen)

Gotcha! Dachte ich mir …