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
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.
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ß.
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)