Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fehlermeldung: Data truncated (https://www.delphipraxis.net/96178-fehlermeldung-data-truncated.html)

Nuclear-Ping 19. Jul 2007 20:50

Datenbank: Advantage • Version: 7 • Zugriff über: TDataSet, TQuery

Fehlermeldung: Data truncated
 
Hallo,

manche Kunden unserer Software bekommen beim Einfügen von Einträgen (die Texte und Bilder / Sounds enthalten (können)) in eine ADS-Datenbank folgende SQL-Fehlermeldung:

Zitat:

Fehler bei SQL-Abfrage : Error 7200 : AQE Error : State = 01004;
Native Error = 2102 ; [Extended Systems]
[Advanced SQL Engine] Data truncated
Die Hilfe dazu meint:
Zitat:

Problem: An internal buffer within the SQL engine was too small, and data was truncated when copied into it. The most likely cause of this error is the result of data conversions. For example if you set a DBF numeric field parameter with a double or a character value, it might overflow the field width or precision. The SQL engine returns this code as a warning. All updates still occur when this code is returned. For example, if an UPDATE statement is executed that assigns too many digits of precision to a numeric field, the 2102 code will be returned, but all updates on all applicable rows will still be performed.

Solution: Verify that the statement is using compatible data types.
Das ist die Abfrage:
Delphi-Quellcode:
function TDBModule.AddNewDatabaseItem (DBName: String; DatabaseData: TDatabaseData;
  var TreeNodeData: PTreeMenuEntry): Integer;
begin
  Result := 0;
  with AdsQuery, SQL do
    try
      Clear;

      Add ('INSERT INTO "' + DBName + ' DB" ' +
           ' (CategoryID, ' +
           ' Problem, ' +
           ' ProblemDescription, ' +
           ' Solution, ' +
           ' SolutionDescription, ' +
           ' SymbolType1, ' +
           ' Symbol1, ' +
           ' SymbolType2, ' +
           ' Symbol2) ' +
           'VALUES (' +
             #39 + DelphiEscapeString (DatabaseData.CategoryID) + #39 + ', ' +
             ':Problem, ' +
             ':ProblemDescription, ' +
             ':Solution, ' +
             ':SolutionDescription, ' +
             inttostr (Integer (DatabaseData.SymbolType1)) + ', ' +
             ':Symbol1, ' +
             inttostr (Integer (DatabaseData.SymbolType2)) + ', ' +
             ':Symbol2);');

      Prepare;

      ParamByName ('Problem').AsMemo := DatabaseData.Problem;
      ParamByName ('ProblemDescription').AsMemo := DatabaseData.ProblemDescription;
      ParamByName ('Solution').AsMemo := DatabaseData.Solution;
      ParamByName ('SolutionDescription').AsMemo := DatabaseData.SolutionDescription;

      if (DatabaseData.SymbolType1 <> stNoSymbol) then
        begin
          DatabaseData.Symbol1.Position := 0;
          ParamByName ('Symbol1').LoadFromStream (DatabaseData.Symbol1, ftBlob);
        end
      else ParamByName ('Symbol1').Clear;

      if (DatabaseData.SymbolType2 <> stNoSymbol) then
        begin
          DatabaseData.Symbol2.Position := 0;
          ParamByName ('Symbol2').LoadFromStream (DatabaseData.Symbol2, ftBlob);
        end
      else ParamByName ('Symbol2').Clear;

      ExecSQL;

      Result := LastAutoIncVal;

      Close;
      inc (TreeNodeData.ItemsCount);
    except
      ThrowSQLException (SQL[0]);
    end;
end;
So schaut die Tabelle aus:
SQL-Code:
/* Table Type of Data DB.adt is ADT*/
Create Table [Data DB](
   ID AutoInc,
   CategoryID Char( 32 ),
   Problem Memo,
   ProblemDescription Memo,
   Solution Memo,
   SolutionDescription Memo,
   SymbolType1 Short,
   Symbol1 Blob,
   SymbolType2 Short,
   Symbol2 Blob );

Create Unique Index "ID" on [Data DB]( ID );
Create Index "CATEGORYID" on [Data DB]( CATEGORYID );
Die Felder der DB sind imho auch korrekt, um mit den entsprechenden Daten umgehen zu können.

Problem ist, dass diese Fehlermeldung auf keiner unserer Testmaschinen bisher auftauchte.

Jemand eine Idee? :gruebel:

mkinzler 19. Jul 2007 20:56

Re: Fehlermeldung: Data truncated
 
Bei welchem Feld? Versuche mal die Strings auf die richtige Länge zu stutzen.

Nuclear-Ping 19. Jul 2007 21:17

Re: Fehlermeldung: Data truncated
 
Naja, das macht das Problem ja gerade so undurchsichtig. Es steht kein Feld da ... :wall:

Die SQL-Abfrage selber dazu schaut so aus:
SQL-Code:
INSERT INTO "Data DB" (CategoryID, Problem, ProblemDescription, Solution, SolutionDescription, SymbolType1, Symbol1, SymbolType2, Symbol2)
VALUES ('48aa08de2a388ea2e0142456a88087af', :Problem, :ProblemDescription, :Solution, :SolutionDescription, 0, :Symbol1, 1, :Symbol2);
Durch die Parametrisierung sieht man den Text (leider) auch nicht. Das ganze sieht aber so aus, als ob der Kunde da versucht, einen Eintrag einzufügen, welcher ein Bild als "Symbol2" enthält.

Delphi-Quellcode:
TSymbolType = (stNoSymbol, stImage, stSound, stUnknown, stVibration);
Das Bild hat aber 'ne max. Größe von 400x400 und wird runterskaliert, falls es diese irgendwo überschreitet.

Wie groß kann denn ein Memo-Feld sein? Da sollte es doch eigentlich nicht wirklich Einschränkungen (ausser die üblichen OS-Grenzen) geben, oder?

Hab dem Kunden nochmal geschrieben, dass er mir mal soviele Infos wie möglich zukommen lassen soll. Also was für ein OS, was für ein Rechner, was für ein Text, was für ein Bild, etc.

mkinzler 19. Jul 2007 21:32

Re: Fehlermeldung: Data truncated
 
Der Fehler könnte aber auch bei den anderen Feldern ( Problem, ProblemDescription, Solution, SolutionDescription, ..) auftreten.

Nuclear-Ping 19. Jul 2007 21:41

Re: Fehlermeldung: Data truncated
 
Ja, mal schauen, was der Kunde antwortet. Hoffentlich muss man da nicht fünfmal nachfragen und alles aus der Nase ziehen. :mrgreen:

Hab das grad hier nochmal mit der Software getestet. In alle Memo-Felder (Problem, ProblemDescription, Solution, SolutionDescription) nen 67.815 Bytes (66kB) langen Text eingefügt, zwei 1024x768 Bilder dazu (die er runterskaliert hat), klappt ohne Probleme ... :gruebel:

[edit]
Ich merke auch gerade beim nochmaligen betrachten, dass ich ja ne Limitierung der Textlänge in den Memo-Feldern der Software auf 65kB gesetzt hab ... Ich versteh die Welt nicht mehr ...
:coder2:
[/edit]

joachimd 20. Jul 2007 08:43

Re: Fehlermeldung: Data truncated
 
grundsätzlich ist diese Fehlermeldung nur eine Warnung und wird IIRC auch nicht in jedem Fall an den Client übertragen. Oft kommt solch ein Fehler vor, wenn man nicht trimmt, also zB bei "update myfield set myfield='hallo'+myfield". Obwohl das Ergebnis korrekt aussieht (und auch korrekt ist), werden am Ende Leerzeichen abgeschnitten, daher die Meldung. Du kannst höchstens versuchen, mal mit dem Debugger an die Sache ranzugehen. Da es aber nur beim Kunden passiert, macht er irgendwas spezifisches, was Du nicht machst (das sind die liebsten Fehler - PEBCAC -> problem exists between chair and computer).

Nuclear-Ping 20. Jul 2007 09:49

Re: Fehlermeldung: Data truncated
 
Hallo Joachim,

cool, jemand von iAnywhere selber. :cheers:

Getrimmt werden die Text schon, nachdem sie den Editor für neue Einträge verlassen haben.

Ich werd testweise aber mal
Delphi-Quellcode:
      ParamByName ('Problem').AsMemo := DatabaseData.Problem;
      ParamByName ('ProblemDescription').AsMemo := DatabaseData.ProblemDescription;
      ParamByName ('Solution').AsMemo := DatabaseData.Solution;
      ParamByName ('SolutionDescription').AsMemo := DatabaseData.SolutionDescription;
in
Delphi-Quellcode:
      ParamByName ('Problem').AsMemo := Trim (DatabaseData.Problem);
      ParamByName ('ProblemDescription').AsMemo := Trim (DatabaseData.ProblemDescription);
      ParamByName ('Solution').AsMemo := Trim (DatabaseData.Solution);
      ParamByName ('SolutionDescription').AsMemo := Trim (DatabaseData.SolutionDescription);
ändern und ihm ne Version schicken.

Danke für den Hinweis! :)

joachimd 20. Jul 2007 09:53

Re: Fehlermeldung: Data truncated
 
Hallo Mario,
so rein aus Erfahrung würde ich bezweifeln, daß es mit den Memo-Feldern zusammenhängt (oder sind das Char-Felder, die Du mit AsMemo ansprichst?). Übrigens kannst Du statt AsMemo auch immer AsString verwenden (nicht, daß das jetzt helfen würde).

Nuclear-Ping 20. Jul 2007 10:24

Re: Fehlermeldung: Data truncated
 
Hallo Joachim,

nein, es sind echte Memo-Felder.
SQL-Code:
Create Table [Data DB](
   ID AutoInc,
   CategoryID Char( 32 ),
   Problem Memo,              <<--
   ProblemDescription Memo,   <<--
   Solution Memo,             <<--
   SolutionDescription Memo,  <<--
   SymbolType1 Short,
   Symbol1 Blob,
   SymbolType2 Short,
   Symbol2 Blob );
Was ich auch dachte, dass es vielleicht mit dem Short und IntToStr zusammenhängt. Allerdings sind ja die Werte die da aus der Konvertierung nur kommen zwischen 0 und 4. :gruebel:

Nuclear-Ping 21. Jul 2007 23:47

Re: Fehlermeldung: Data truncated
 
Das Problem hat sich geklärt.

Es lag an einer alten Datenbankstruktur, die der Kunde verwendet hat. Er hatte zwar die aktuellste Version vom Programm, jedoch irgendwie noch eine alte Datenbank drunter. Dort wurde früher als "Unique-ID" eine 8-stellige Prüfsumme (CRC32 aus allen möglichen Informationen über den Eintrag + Datum/Uhrzeit inkl. ms + Zufallszahl) verwendet, um einen Knoten eindeutig zu identifizieren.
Im Laufe der Zeit stellte sich jedoch herraus, dass es damit Probleme gab. Beim Import von einigen Datenmengen kam gelegentlich die SQL-Fehlermeldung, dass eine solche ID schon existiert und somit nicht "UNIQUE" ist. Fragt mich nicht warum. Wie schon gesagt ist ein Zufallswert in die Berechnung mit eingeflossen.
Also hab ich ohne viel Ruß aus CRC32 MD5 gemacht und die ID in der Tabelle von 8 auf 32 Zeichen erhöht. Die Software war noch recht jung und noch nicht soviel verbreitet, da hat das nix gemacht. Der Fehler tauchte seither nicht mehr auf.

Die besagte Fehlermeldung wurde also verursacht, weil er versucht hat, einen 32-stelligen Wert in ein Char-Feld zu schreiben, was nur 8 Zeichen hatte. Ergo: Data truncated. ;)

Danke an alle! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 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