AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Fehlermeldung: Data truncated
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung: Data truncated

Ein Thema von Nuclear-Ping · begonnen am 19. Jul 2007 · letzter Beitrag vom 21. Jul 2007
Antwort Antwort
Nuclear-Ping
(Gast)

n/a Beiträge
 
#1

Fehlermeldung: Data truncated

  Alt 19. Jul 2007, 20:50
Datenbank: Advantage • Version: 7 • Zugriff über: TDataSet, TQuery
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Fehlermeldung: Data truncated

  Alt 19. Jul 2007, 20:56
Bei welchem Feld? Versuche mal die Strings auf die richtige Länge zu stutzen.
Markus Kinzler
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#3

Re: Fehlermeldung: Data truncated

  Alt 19. Jul 2007, 21:17
Naja, das macht das Problem ja gerade so undurchsichtig. Es steht kein Feld da ...

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.

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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Fehlermeldung: Data truncated

  Alt 19. Jul 2007, 21:32
Der Fehler könnte aber auch bei den anderen Feldern ( Problem, ProblemDescription, Solution, SolutionDescription, ..) auftreten.
Markus Kinzler
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#5

Re: Fehlermeldung: Data truncated

  Alt 19. Jul 2007, 21:41
Ja, mal schauen, was der Kunde antwortet. Hoffentlich muss man da nicht fünfmal nachfragen und alles aus der Nase ziehen.

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 ...

[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 ...

[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Fehlermeldung: Data truncated

  Alt 20. Jul 2007, 08:43
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).
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#7

Re: Fehlermeldung: Data truncated

  Alt 20. Jul 2007, 09:49
Hallo Joachim,

cool, jemand von iAnywhere selber.

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!
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Fehlermeldung: Data truncated

  Alt 20. Jul 2007, 09:53
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).
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#9

Re: Fehlermeldung: Data truncated

  Alt 20. Jul 2007, 10:24
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.
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#10

Re: Fehlermeldung: Data truncated

  Alt 21. Jul 2007, 23:47
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!
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:11 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