Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   EDataBaseError: Feld 'Memo' kann nicht verändert werden (https://www.delphipraxis.net/190927-edatabaseerror-feld-memo-kann-nicht-veraendert-werden.html)

Devil1925 21. Nov 2016 15:52

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:
  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;
das Feld 'Memo' ist ein Feld vom Typ 'TEXT' (sowohl in der MSSQL als auch in der SQLITE Datenbank).

für mich sieht das alles wunderbar aus und sollte funktionieren. Oder habe ich etwas grundlegendes vergessen?

Ritsch 21. Nov 2016 15:59

AW: EDataBaseError: Fled 'Memo' kann nicht verändert werden
 
Probier mal folgendes aus

Delphi-Quellcode:
Daten.Q_MSSQL_Export.FieldByName(FieldName).AsString:= 'Hallo Welt!'

hoika 21. Nov 2016 16:02

AW: EDataBaseError: Fled 'Memo' kann nicht verändert werden
 
Hallo,

Delphi-Quellcode:
if Daten.Q_SQLITE_Export.FieldByName(FieldName).Value <> Daten.Q_MSSQL_Export.FieldByName(FieldName).Value then
Wozu ist diese Zeile, wenn du weiter oben eh Append machst?
Ausserdem durchkäufst du "alle" Felder, obwohl es doch nur Id und Memo sind.

Reicht da nicht ein:

Delphi-Quellcode:
    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;
Probier doch erst mal das Einfache aus.

Dann würde mich interessieren, ob der Fehler schon beim ersten Datensatz kommt oder erst irgendwo zwischendrin,
(vielleicht, wenn der Feldinhalt NULL ist?)

himitsu 21. Nov 2016 16:45

AW: EDataBaseError: Fled 'Memo' kann nicht verändert werden
 
Zitat:

Zitat von hoika (Beitrag 1354314)
(vielleicht, wenn der Feldinhalt NULL ist?)

Ich war da auch vor 'ner Weile auf ein Problemchen mit Blobs und anderen Typen gestoßen.
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:

nahpets 21. Nov 2016 17:08

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:
.AsString
Das dürfte erst problematisch werden, wenn man Blobfelder mit irgendwelchem binären Inhalt (wie Grafiken ...) hat, auf diese Weise kopieren will.

Anstelle von
Delphi-Quellcode:
.Value
könnte eventuell auch
Delphi-Quellcode:
.AsVariant
funktionieren oder
Delphi-Quellcode:
.AssignValue()
Also statt
Delphi-Quellcode:
  Daten.Q_MSSQL_Export.FieldByName(FieldName).Value := Daten.Q_SQLITE_Export.FieldByName(FieldName).Value;
eventuell
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.

Devil1925 22. Nov 2016 07:25

AW: EDataBaseError: Feld 'Memo' kann nicht verändert werden
 
Guten Morgen,
Zitat:

Zitat von Ritsch (Beitrag 1354312)
Probier mal folgendes aus

Delphi-Quellcode:
Daten.Q_MSSQL_Export.FieldByName(FieldName).AsString:= 'Hallo Welt!'

Teste ich gleich mal.

Zitat:

Zitat von hoika (Beitrag 1354314)
Hallo,

[DELPHI]
Ausserdem durchkäufst du "alle" Felder, obwohl es doch nur Id und Memo sind.

Reicht da nicht ein:

Delphi-Quellcode:
    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;

Ich durchlaufe alle Felder, da es nicht nur ID und MEMO sind, das war jetzt nur eine Verkürzte version des SQL. ausserdem verwende ich diese Methode nicht nur für eine Tabelle sondern für ca 30, wobei das bei den ersten immer funktioniert.

Zitat:

Zitat von hoika (Beitrag 1354314)
Dann würde mich interessieren, ob der Fehler schon beim ersten Datensatz kommt oder erst irgendwo zwischendrin,
(vielleicht, wenn der Feldinhalt NULL ist?)

Ich bekomme die Fehlermeldung schon beim ersten Datensatz, bei welchem dieses Feld nicht leer ist.

Zitat:

Zitat von nahpets (Beitrag 1354330)
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:
.AsString
Das dürfte erst problematisch werden, wenn man Blobfelder mit irgendwelchem binären Inhalt (wie Grafiken ...) hat, auf diese Weise kopieren will.

Anstelle von
Delphi-Quellcode:
.Value
könnte eventuell auch
Delphi-Quellcode:
.AsVariant
funktionieren oder
Delphi-Quellcode:
.AssignValue()
Also statt
Delphi-Quellcode:
  Daten.Q_MSSQL_Export.FieldByName(FieldName).Value := Daten.Q_SQLITE_Export.FieldByName(FieldName).Value;
eventuell
Delphi-Quellcode:
  Daten.Q_MSSQL_Export.FieldByName(FieldName).AssignValue(Daten.Q_SQLITE_Export.FieldByName(FieldName).Value);

Werde ich gleich mal testen.

Devil1925 22. Nov 2016 08:27

AW: EDataBaseError: Feld 'Memo' kann nicht verändert werden
 
So, Tests ausgeführt und folgende Ergebnisse erbracht.

Zitat:

Zitat von Ritsch (Beitrag 1354312)
Probier mal folgendes aus

Delphi-Quellcode:
Daten.Q_MSSQL_Export.FieldByName(FieldName).AsString:= 'Hallo Welt!'

Gleicher Fehler

Zitat:

Zitat von nahpets (Beitrag 1354330)
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:
.AsString
Das dürfte erst problematisch werden, wenn man Blobfelder mit irgendwelchem binären Inhalt (wie Grafiken ...) hat, auf diese Weise kopieren will.

Anstelle von
Delphi-Quellcode:
.Value
könnte eventuell auch
Delphi-Quellcode:
.AsVariant
funktionieren oder
Delphi-Quellcode:
.AssignValue()
Also statt
Delphi-Quellcode:
  Daten.Q_MSSQL_Export.FieldByName(FieldName).Value := Daten.Q_SQLITE_Export.FieldByName(FieldName).Value;
eventuell
Delphi-Quellcode:
  Daten.Q_MSSQL_Export.FieldByName(FieldName).AssignValue(Daten.Q_SQLITE_Export.FieldByName(FieldName).Value);

Bekomme bei
Delphi-Quellcode:
.AsString
den gleichen Fehler.

Ausserdem haut mir der Compiler bei
Delphi-Quellcode:
.AssignValue()
den Fehler 'Inkompatible Typen: 'TVarRec' und 'Variant'' raus. was habe ich da falsch gemacht?

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:
 Select ID, dbo.RTF2Text(Memo) as Memo from Tabelle
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?

ich hoffe ich habe mich verständlich ausgedrückt...

Jasocul 22. Nov 2016 09:31

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.

Devil1925 22. Nov 2016 09:33

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:
dbo.RTF2Text(Memo) as Memo
wieder eingefügt wurde und das Feld nich mehr editierbar wurde. habe ich nun geändert und es Funktioniert.

Vielen Vielen Dank an alle helfer! Ihr seid die Besten! :cheers:

himitsu 22. Nov 2016 10:06

AW: EDataBaseError: Feld 'Memo' kann nicht verändert werden
 
Zitat:

Zitat von Devil1925 (Beitrag 1354355)
Ausserdem haut mir der Compiler bei
Delphi-Quellcode:
.AssignValue()
den Fehler 'Inkompatible Typen: 'TVarRec' und 'Variant'' raus. was habe ich da falsch gemacht?

Delphi-Quellcode:
  Daten.Q_MSSQL_Export.FieldByName(FieldName).AssignValue(Daten.Q_SQLITE_Export.FieldByName(FieldName).Value);

Da soll man ja auch das Field und nicht den Value reingeben :zwinker:


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 05:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz