AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken EDataBaseError: Feld 'Memo' kann nicht verändert werden
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Devil1925 · begonnen am 21. Nov 2016 · letzter Beitrag vom 22. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Devil1925
Devil1925

Registriert seit: 20. Nov 2015
Ort: Saerbeck
236 Beiträge
 
Delphi 10.3 Rio
 
#1

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

  Alt 21. Nov 2016, 16:52
Datenbank: MSSQL / SQLITE • Version: 2008 / 3.13.0 • Zugriff über: uniDAC
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?
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.

Geändert von TBx (21. Nov 2016 um 16:59 Uhr) Grund: Tipselfehler aus Titel entfernt
  Mit Zitat antworten Zitat
Benutzerbild von Ritsch
Ritsch

Registriert seit: 15. Apr 2014
Ort: Wolfenbüttel
33 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

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

  Alt 21. Nov 2016, 16:59
Probier mal folgendes aus

Daten.Q_MSSQL_Export.FieldByName(FieldName).AsString:= 'Hallo Welt!'
Richard
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 21. Nov 2016, 17:02
Hallo,

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?)
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 21. Nov 2016, 17:45
(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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

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

  Alt 21. Nov 2016, 18:08
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 .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 .Value könnte eventuell auch .AsVariant funktionieren oder .AssignValue() Also statt   Daten.Q_MSSQL_Export.FieldByName(FieldName).Value := Daten.Q_SQLITE_Export.FieldByName(FieldName).Value; eventuell   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.
  Mit Zitat antworten Zitat
Benutzerbild von Devil1925
Devil1925

Registriert seit: 20. Nov 2015
Ort: Saerbeck
236 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 22. Nov 2016, 08:25
Guten Morgen,
Probier mal folgendes aus

Daten.Q_MSSQL_Export.FieldByName(FieldName).AsString:= 'Hallo Welt!'
Teste ich gleich mal.

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.

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.

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 .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 .Value könnte eventuell auch .AsVariant funktionieren oder .AssignValue() Also statt   Daten.Q_MSSQL_Export.FieldByName(FieldName).Value := Daten.Q_SQLITE_Export.FieldByName(FieldName).Value; eventuell   Daten.Q_MSSQL_Export.FieldByName(FieldName).AssignValue(Daten.Q_SQLITE_Export.FieldByName(FieldName).Value);
Werde ich gleich mal testen.
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.

Geändert von Devil1925 (22. Nov 2016 um 09:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Devil1925
Devil1925

Registriert seit: 20. Nov 2015
Ort: Saerbeck
236 Beiträge
 
Delphi 10.3 Rio
 
#7

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

  Alt 22. Nov 2016, 09:27
So, Tests ausgeführt und folgende Ergebnisse erbracht.

Probier mal folgendes aus

Daten.Q_MSSQL_Export.FieldByName(FieldName).AsString:= 'Hallo Welt!'
Gleicher Fehler

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 .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 .Value könnte eventuell auch .AsVariant funktionieren oder .AssignValue() Also statt   Daten.Q_MSSQL_Export.FieldByName(FieldName).Value := Daten.Q_SQLITE_Export.FieldByName(FieldName).Value; eventuell   Daten.Q_MSSQL_Export.FieldByName(FieldName).AssignValue(Daten.Q_SQLITE_Export.FieldByName(FieldName).Value);
Bekomme bei .AsString den gleichen Fehler.

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

  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...
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 22. Nov 2016, 10:31
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.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Devil1925
Devil1925

Registriert seit: 20. Nov 2015
Ort: Saerbeck
236 Beiträge
 
Delphi 10.3 Rio
 
#9

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

  Alt 22. Nov 2016, 10:33
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!
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 22. Nov 2016, 11:06
Ausserdem haut mir der Compiler bei .AssignValue() den Fehler 'Inkompatible Typen: 'TVarRec' und 'Variant'' raus. was habe ich da falsch gemacht?

  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


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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (22. Nov 2016 um 11:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 Uhr.
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