![]() |
Datenbank: MSSQL / SQLITE • Version: 2008 / 3.13.0 • Zugriff über: uniDAC
EDataBaseError: Feld 'Memo' kann nicht verändert werden
Hallo Leute,
ich bin ratlos. ich bekomme oben genannten Fehler wenn ich folgenden Code ausführe:
Delphi-Quellcode:
das Feld 'Memo' ist ein Feld vom Typ 'TEXT' (sowohl in der MSSQL als auch in der SQLITE Datenbank).
Daten.Q_MSSQL_Export.Close;
Daten.Q_MSSQL_Export.SQL.Text := 'Select ID, Memo from Tabelle'; Daten.Q_MSSQL_Export.Open; Daten.Q_SQLITE_Export.Close; Daten.Q_SQLITE_Export.SQL.Text := 'Select ID, Memo from Tabelle' Daten.Q_SQLITE_Export.Open; while not Daten.Q_SQLITE_Export.Eof do begin Daten.Q_MSSQL_Export.Append; for i := 0 to Daten.Q_MSSQL_Export.Fields.Count-1 do begin FieldName := Daten.Q_MSSQL_Export.Fields[i].FullName; // Felder durchlaufen if (Daten.Q_SQLITE_Export.FindField(FieldName) <> nil) then begin if Daten.Q_SQLITE_Export.FieldByName(FieldName).Value <> Daten.Q_MSSQL_Export.FieldByName(FieldName).Value then Daten.Q_MSSQL_Export.FieldByName(FieldName).Value := Daten.Q_SQLITE_Export.FieldByName(FieldName).Value; end; end; Daten.Q_MSSQL_Export.Post; Daten.Q_SQLITE_Export.Next; end; für mich sieht das alles wunderbar aus und sollte funktionieren. Oder habe ich etwas grundlegendes vergessen? |
AW: EDataBaseError: Fled 'Memo' kann nicht verändert werden
Probier mal folgendes aus
Delphi-Quellcode:
Daten.Q_MSSQL_Export.FieldByName(FieldName).AsString:= 'Hallo Welt!'
|
AW: EDataBaseError: Fled 'Memo' kann nicht verändert werden
Hallo,
Delphi-Quellcode:
Wozu ist diese Zeile, wenn du weiter oben eh Append machst?
if Daten.Q_SQLITE_Export.FieldByName(FieldName).Value <> Daten.Q_MSSQL_Export.FieldByName(FieldName).Value then
Ausserdem durchkäufst du "alle" Felder, obwohl es doch nur Id und Memo sind. Reicht da nicht ein:
Delphi-Quellcode:
Probier doch erst mal das Einfache aus.
while not Daten.Q_SQLITE_Export.Eof do
begin Daten.Q_MSSQL_Export.Append; Daten.Q_MSSQL_Export.FieldByName('Id').Value := Daten.Q_SQLITE_Export.FieldByName('Id').Value; Daten.Q_MSSQL_Export.FieldByName('Memo').Value := Daten.Q_SQLITE_Export.FieldByName('Memo').Value; Daten.Q_MSSQL_Export.Post; Daten.Q_SQLITE_Export.Next; end; Dann würde mich interessieren, ob der Fehler schon beim ersten Datensatz kommt oder erst irgendwo zwischendrin, (vielleicht, wenn der Feldinhalt NULL ist?) |
AW: EDataBaseError: Fled 'Memo' kann nicht verändert werden
Zitat:
Value ist unterschiedlich implementiert, jenachdem ob man FieldByName/FindField, also TField oder den "richtigen" Type/Cast verwendet. Und bei Value (als Variant) wird im Getter manchmal/öfters und seltener auch im Setter aus NULL der "Default"-Wert, also '' oder 0. :wall: |
AW: EDataBaseError: Feld 'Memo' kann nicht verändert werden
Also prinzipiell finde ich das Vorgehen so ok, mache das auch regelmäßig, wenn von X nach Y kopiert werden soll, und die Routine funktioniert halt auch ohne Änderung, wenn die Tabellen noch dutzende von Spalten dazubekommen.
Es gibt nur einen Unterschied: Benutzte immer, egal welcher Typ jetzt tatsächlich in den Tabellen vorkommt
Delphi-Quellcode:
Das dürfte erst problematisch werden, wenn man Blobfelder mit irgendwelchem binären Inhalt (wie Grafiken ...) hat, auf diese Weise kopieren will.
.AsString
Anstelle von
Delphi-Quellcode:
könnte eventuell auch
.Value
Delphi-Quellcode:
funktionieren oder
.AsVariant
Delphi-Quellcode:
Also statt
.AssignValue()
Delphi-Quellcode:
eventuell
Daten.Q_MSSQL_Export.FieldByName(FieldName).Value := Daten.Q_SQLITE_Export.FieldByName(FieldName).Value;
Delphi-Quellcode:
Daten.Q_MSSQL_Export.FieldByName(FieldName).AssignValue(Daten.Q_SQLITE_Export.FieldByName(FieldName).Value);
Wobei: Bei der Benutzung von Variant kann man schonmal "etwas anderes rausbekommen, als man reingetan hat". Insbesondere, wenn man ein leeres Feld hat, dann weiß man nicht zwingend, ob im Ziel Null oder ein Leerstring oder EmptyParam ankommt. |
AW: EDataBaseError: Feld 'Memo' kann nicht verändert werden
Guten Morgen,
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: EDataBaseError: Feld 'Memo' kann nicht verändert werden
So, Tests ausgeführt und folgende Ergebnisse erbracht.
Zitat:
Zitat:
Delphi-Quellcode:
den gleichen Fehler.
.AsString
Ausserdem haut mir der Compiler bei
Delphi-Quellcode:
den Fehler 'Inkompatible Typen: 'TVarRec' und 'Variant'' raus. was habe ich da falsch gemacht?
.AssignValue()
Delphi-Quellcode:
Daten.Q_MSSQL_Export.FieldByName(FieldName).AssignValue(Daten.Q_SQLITE_Export.FieldByName(FieldName).Value);
----------------------------------------------------------- Noch eine Idee: Kurz bevor ich die neuen Datensätze anlege beinhaltet die Query "Q_MSSQL_Export" fast das selbe SQL:
Code:
in dem SQL wäre es logisch, dass die Spalte nicht veränderbar ist. allerdings wird die Query ja vor dem Anlegen geschlossen, das SQL ausgetauscht und die Query wieder geöffnet. kann es Trotzdem sein, dass es hier deswegen zu dem Fehler kommt?
Select ID, dbo.RTF2Text(Memo) as Memo from Tabelle
ich hoffe ich habe mich verständlich ausgedrückt... |
AW: EDataBaseError: Feld 'Memo' kann nicht verändert werden
Soweit ich weiß, entspricht der Typ TEXT in etwa einem BLOB.
Die können meines Wissens nicht über einfache Zuweisungen kopiert werden. Hier muss der Umweg über einen TBlobStream gemacht werden. Da ich selbst noch keinen Bedarf dafür hatte, kann ich leider nicht mit einem Beispiel dienen. |
AW: EDataBaseError: Feld 'Memo' kann nicht verändert werden
OK, Fehler gefunden (Schande über mich)
Ich hatte noch eine Funktion die mir das genaue SQL für die SQLITE Datenbank zurück liefert, und diese hat das auch SQL von "Q_MSSQL_Export" verändert, wodurch das
Code:
wieder eingefügt wurde und das Feld nich mehr editierbar wurde. habe ich nun geändert und es Funktioniert.
dbo.RTF2Text(Memo) as Memo
Vielen Vielen Dank an alle helfer! Ihr seid die Besten! :cheers: |
AW: EDataBaseError: Feld 'Memo' kann nicht verändert werden
Zitat:
Halten wir fest, es liegt nicht an der Zuweisung. * Entweder SQLite hat ein Problem, aber TEXT ist einer der 5 Basistypen, die SQLite überhaupt versteht, also sollte es daran nicht liegen. * Bleibt somit noch ein Problem bei dir. Tabelle falsch erstellt? * Oder es liegt am UniDAC. Ein Bug oder eine Option falsch? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz