Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Memo in MS SQL Speichern und Auslesen (https://www.delphipraxis.net/176438-memo-ms-sql-speichern-und-auslesen.html)

Andidreas 5. Sep 2013 08:56

Datenbank: MS SQL Server • Version: 2008 • Zugriff über: UniDac

Memo in MS SQL Speichern und Auslesen
 
Hallo,

ich habe in meiner MS SQL Tabelle eine Spalte vom Typ "Text"...
In dieser Spalte möchte ich den Inhalt eines Memos abspeicher:

Delphi-Quellcode:
  Try
    With (MSSQL_Query1) Do
    Begin
      Active := False;
      SQL.Clear;
        SQL.Add(' Insert Into "' + ModuleUniDBSchema + '.Table1" ');
        SQL.Add(' (Message) ');
        SQL.Add(' Values( ');
        SQL.Add(' '''+ mem_mailtext.Lines.Text +''' ');
        SQL.Add(' )' );
      ExecSQL;
    End;
  Except
    On E:EUniError Do
    Begin
      fnDisplayMyActionBox('ERR', 'MS SQL Error', 'Could not insert Record into Table1!', E.Message, EmptyStr, EmptyStr, True);
      Exit;
    End;
  End;
Das Funktioniert soweit, bzw. in der MS SQL Tabelle ist die Memo eingabe:
Code:
Das
ist
ein
Test
wie folgt abgespeichert:
Code:
Das ist ein Test
Jetzt hab ich das Problem das ich über die UniDac Komponente den Text nicht auslesen kann:
Delphi-Quellcode:
  With (MSSQL_Query1) Do
  Begin
    Active := False;
    SQL.Clear;
    SQL.Add(' Select Message From "' + ModuleUniDBSchema + '.Table1" ');
    Active := True;
  End;

  ShowMessage(MSSQL_Query1.FieldByName('Message').AsAnsiString);
Beim ShowMessage erhalte ich die Fehlermeldung:
Invalid class typecast

Was mach ich falsch, bzw. wie kann ich den Text so auslesen wie ich ihn gespeichert hab?

DeddyH 5. Sep 2013 09:08

AW: Memo in MS SQL Speichern und Auslesen
 
Ich kenne UniDAC nicht, aber üblicherweise liest man BLOB-Felder mittels BlobStream aus und kopiert dessen Inhalt dann ggf. in einen anderen Stream (TStringStream z.B.).

mkinzler 5. Sep 2013 09:13

AW: Memo in MS SQL Speichern und Auslesen
 
Wie schon oft geschrieben:
1. .Clear und dann anschliessend .Add ist Quark! nimm besser .Text
2. Verwende (SQL-)Parameter.

Insert:
Delphi-Quellcode:
    MSSQL_Query1.SQL.Text := 'Insert Into "' + ModuleUniDBSchema + '.Table1" ';
    MSSQL_Query1.SQL.Add(' (Message) ');
    MSSQL_Query1.SQL.Add(' Values( :text )');
    MSSQL_Query1.ParamByName( 'text').Value := mem_mailtext.Lines.Text;
    MSSQL_Query1.ExecSQL;

Select:
Delphi-Quellcode:
    MSSQL_Query1.SQL.Text := 'Select Message From "' + ModuleUniDBSchema + '.Table1" ';
    MSSQL_Query1.Open;
Bei Select musst du Open verwenden, da sonst die Abfrage zwar ausgeführt wird, aber das Ergebnis nicht gefetcht wird.

user0815 5. Sep 2013 09:20

AW: Memo in MS SQL Speichern und Auslesen
 
Delphi-Quellcode:
  // speichern
  ParamByName('FELDNAME').AsWideString := trim(Memo.Lines.Text);

  // auslesen
  Memo.Lines.Append(FieldByName('FELDNAME').AsWideString);
müsste funktionieren.

Andidreas 5. Sep 2013 09:54

AW: Memo in MS SQL Speichern und Auslesen
 
Zitat:

Zitat von mkinzler (Beitrag 1227233)
Wie schon oft geschrieben:
1. .Clear und dann anschliessend .Add ist Quark! nimm besser .Text

OT: Warum ist das Quark?

mkinzler 5. Sep 2013 09:59

AW: Memo in MS SQL Speichern und Auslesen
 
Weil es 1. unübersichtlich ist und 2. unnötigen Code produziert.

Andidreas 5. Sep 2013 10:44

AW: Memo in MS SQL Speichern und Auslesen
 
Ich hab Eure Lösungsansätze allesamt ausprobiert...
Ich bekomme überall den Fehler mit dem "Invalid class typecast"

Delphi-Quellcode:

  mem_message.Text := MSSQL_Query1.FieldByName('Message').Text;


So erhalte ich keinen Fehler, aber in meinem Memo steht dann nur (MEMO) aber nicht der Inhalt aus dem MS SQL Tabellen Feld...

DeddyH 5. Sep 2013 10:58

AW: Memo in MS SQL Speichern und Auslesen
 
http://www.devart.com/unidac/docs/in...data_types.htm (ganz unten):
Zitat:

A BLOB values can be retrieved from the server in two ways. The first way is using a SELECT query from the table containing a BLOB field:

Delphi-Quellcode:
UniQuery.SQL.Text := 'SELECT TextField FROM UniDAC_Text WHERE ID = 1';

UniQuery.Open;

(UniQuery.FieldByName('TextField') as TBlobField).SaveToFile('A_file_name');

UniQuery.Close;
The second way is to use output parameters like in the following example. Note that the query may differ depending on your database server.

Delphi-Quellcode:
UniSQL.SQL.Text := 'SELECT :TEXTValue = TextField FROM UniDAC_Text WHERE ID = 1';

UniSQL.ParamByName('TEXTValue').ParamType := ptOutput;

UniSQL.Execute;

ShowMessage(UniSQL.ParamByName('TEXTValue').AsString);


Andidreas 5. Sep 2013 11:57

AW: Memo in MS SQL Speichern und Auslesen
 
@DeddyH
Many Thanks!
Es funktioniert =) :thumb:

Edit: Hab das Parameter Beispiel verwendet!

Andidreas 5. Sep 2013 12:35

AW: Memo in MS SQL Speichern und Auslesen
 
Noch ein OT Frage...

Das Programm in dem ich das Text Feld in der MS SQL DB benötige wird als DLL erstellt und in den Projekt opitonen ist der hacken bei "Laufzeit-Packages" gesetzt, da die DLL in eine andere Form geladen wird...

Allerdings Funktionieren hier meine Try Except Blöcke nicht ganz:
Delphi-Quellcode:
Try
Except
  On E:EUniError Do
  Begin
    ShowMessage(E.Message);
  End
End;
Will heißen er gibt mir die Fehlermeldung nicht mehr aus... Liegt das an den Laufzeit-Packages? Muss ich die von der Datenbank Komponente mit angeben?


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