Access und der BLOB...

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Access und der BLOB...

Beitrag von Antrepolit »

Hallo Leute,

Ich versuche verzweifelt, einen längeren Text (> 255 Zeichen) in die Tabelle zu bekommen.
Das entsprechnde Feld in Access ist als MEMO ausgewiesen.
Ich dachte, dass ich einfach im Insert-STATEMENT den String übergeben kann. Ging aber nicht... :(

Fehlermeldung: NativeError 98 / Ungültige genauigkeit.

Und diese Fehlermeldung blieb hartnäckig bestehen, trotz folgender Versuche:

- Prepared Statement über Params und mit Append direkt am DataSet
- Normaler Append mit zugriff über FieldByName am Dataset
- Normaler Append mit FieldValue[] auf der Datasource
- ändern des Feldes von MEMO auf OLE-Objekt in Access (anschließend erste 3 Sachen wiederholt).
- Versucht, mit der Methode .AsBlob den Text einzufügen

Ich weiß nicht, was Access da von mir sonst haben will. Lasse ich das entsprechende Feld ganz aus dem Append heraus,
geht alles. Aber sobald ich es im Statement habe oder Daten reinstecke, kracht es beim Query.ApplyUpdates.

Hat jemand eine Idee?

Gruß
Grüße, Antrepolit

care only if your os is really burning

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Gelöst: Re: Access und der BLOB...

Beitrag von Antrepolit »

Ok, ich habe die Lösung selbst gefunden.
Offensichtlich habe ich es nicht mit ganz simplen Prepared-Statements versucht.
So funktioniert es nun.
Grüße, Antrepolit

care only if your os is really burning

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Access und der BLOB...

Beitrag von Antrepolit »

Zu früh gefreut... :(

Mein String wird nach 255 Zeichen abgeschnitten.

Falls also jemand eine Idee hat, wie ich meine 957 Zeichen in die Access-Tabelle bekomme,
immer her damit . :)
Grüße, Antrepolit

care only if your os is really burning

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Access und der BLOB...

Beitrag von Socke »

Antrepolit hat geschrieben:Falls also jemand eine Idee hat, wie ich meine 957 Zeichen in die Access-Tabelle bekomme,
immer her damit . :)
Für den Fall, dass es noch jemanden interessiert: Access 2003 kann maximal 255 Zeichen in ein Text-Feld speichern. Die Lösung wäre also eine Eigene Tabelle für diese Daten. Dort werden die langen Zeichenketten in kleine Stücke aufgebrochen und abgelegt (bei 957 Zeichen sind das also 4 Datensätze). Beim Auslesen muss die Anwendung dann die Datensätze wieder zusammensetzen.
Ohne Programmieraufwand jenseits von SQL kommt man da aber nicht dran.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Access und der MEMO...

Beitrag von gocher »

Also ich habe für Zugriffe auf Access, MS-SQL und andere unter Windows zur Verfügung stehende Datenbanken zum Bereich ADO etliche Zeilen Code (Klassen wie ADOConnection, ADORecordset, ADOFields, ADOField, ...) geschrieben. Der kurze Weg ohne alle Vereinfachungen durch Klassen aber leider auch ohne Autovervollständigung geht so:

Code: Alles auswählen

uses  Variants, ComObj, ActiveX;
var
  cn, rs: OleVariant;
  str: string;
begin
  str := '..langer String....'
  CoInitialize(NIL); //?? zu lange her weiß nicht mehr ob das muß
  cn := CreateOleObject('ADODB.Connection');
  rs := CreateOleObject('ADODB.Recordset');
  cn.Open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb');
  rs.Open('SELECT * FROM tblTest', adOpenKeyset, adLockPessimistic);
  rs.AddNew;
  rs.Fields['Testfeld'].Value := str; //in Datenbank Feld Typ MEMO
  rs.Update;
  rs.Close;
  rs := Unassigned;   
  cn.Close;
  cn.Unassigned;
  CoUnInitialize;  //?? zu lange her weiß nicht mehr ob das muß
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Antworten