AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Prism Access-Memofeld mit ASP.NET auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Access-Memofeld mit ASP.NET auslesen

Ein Thema von Delbor · begonnen am 19. Okt 2006 · letzter Beitrag vom 21. Okt 2006
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

Access-Memofeld mit ASP.NET auslesen

  Alt 19. Okt 2006, 14:41
Hi zusammen
ZellText := cRow[cCol.Ordinal].ToString; Mit dieser Zeile lese ich in einem DataSet ein Feld aus, das aus einer Access-Datenbank stammt und da als Memo deklariert ist. Dazu verwende ich die Bdp-Komponenten.
In der Datenbank habe ich mittlerweile die Unicode-Kompression für dieses Feld abgeschaltet. Trotzdem erhalte ich bei einem Probelauf die Testausgabe "System.Char[]" anstelle des tatsächlichen Textes.
Andere Felder, die in der Datenbank als "Text" deklariert sind, werden korrekt ausgegeben.

Würde mich riesig freuen, wenn mir jemand einen guten Typ geben könnte. Ach ja - dieses Feld in Access als Text zu deklarieren, ist leider nicht möglich, da die enthaltenen Texte unterschiedlich gross sein können und die Aceess-Vorgaben für den Datentyp "Text" sprengen würden.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Access-Memofeld mit ASP.NET auslesen

  Alt 19. Okt 2006, 14:43
Was stört dich denn daran, wenn du ein Char[] zurückbekommst ?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Access-Memofeld mit ASP.NET auslesen

  Alt 19. Okt 2006, 14:55
Hi Khabarakh
Zitat:
Was stört dich denn daran, wenn du ein Char[] zurückbekommst
Solange dieser Char (oder besser ein Char-Array) den in dem Feld wirklich enthaltenen Text wiedergibt, überhaupt nichts. Testweise gebe ich die Texte in einer Listbox aus, und anstelle des in Access gespeicherten Textes erhalte ich die Ausgabe "System.Char[]" und nicht etwa ein Item des Typs System.Char, wie du mich offensichtlich verstanden hast.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Access-Memofeld mit ASP.NET auslesen

  Alt 19. Okt 2006, 15:10
Zitat:
Testweise gebe ich die Texte in einer Listbox aus, und anstelle des in Access gespeicherten Textes erhalte ich die Ausgabe "System.Char[]" und nicht etwa ein Item des Typs System.Char, wie du mich offensichtlich verstanden hast.
Ich habe dich schon richtig verstanden . Aber es ist numal so, dass ToString auf ein Char-Array angewandt nicht etwa den Text im Array sondern "System.Char[]" zurückgibt. Von welchem Typ ist nun cRow[...]?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Access-Memofeld mit ASP.NET auslesen

  Alt 19. Okt 2006, 15:12
Zitat von Delbor:
Hi Khabarakh
Zitat:
Was stört dich denn daran, wenn du ein Char[] zurückbekommst
Solange dieser Char (oder besser ein Char-Array) den in dem Feld wirklich enthaltenen Text wiedergibt, überhaupt nichts. Testweise gebe ich die Texte in einer Listbox aus, und anstelle des in Access gespeicherten Textes erhalte ich die Ausgabe "System.Char[]" und nicht etwa ein Item des Typs System.Char, wie du mich offensichtlich verstanden hast.
Was ist die Implementierung von ToString in Object? Richtig, "result := GetType().ToString();".
Was sagt Reflector dazu ob System.Array ToString überschreibt? Nix? Nunja er überschreibt es ja auch nicht. Ein Char array ist kein wirklicher Typ, eher etwas compiler magic kombiniert mit der speziellen Behandlung von typisierten Arays in der CLR.
Er kann ToString also auch nicht überschreiben.
Was stellt eine ListBox dar wenn du ihr keinen DisplayMember gibst oder der DisplayMember selbst kein primitiver Typ ist? Richtig, ToString.
Was passiert also wenn du eine Liste von Char arrays an eine ListBox hängst?
Richtig:
Code:
System.Char[]
System.Char[]
System.Char[]
System.Char[]
System.Char[]
System.Char[]
System.Char[]
System.Char[]
System.Char[]
System.Char[]
System.Char[]
System.Char[]
Der Wert des Items in der DataRow ist ein Char Array, aber ein Char Array ist nur ein Array und wird seine Chars nicht als String ausgeben wenn man ToString auf ihn ausführt.
Einen String würdest du zum Beispiel so bekommen:
Code:
x := String.Create(deinWert as array of Char);
Das sind übrigens absolute Basics in .Net.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Access-Memofeld mit ASP.NET auslesen

  Alt 19. Okt 2006, 15:28
Hi zusammen
@Khabarakh
Meine Deklaration:
cRow:DataRow; cCol:DataColumn; @Elvis:
Danke für deine ausführliche Antwort! Der Gedanke an eine Konvertierung ist mir auch schon gekommen, nur...
Zitat:
Das sind übrigens absolute Basics in .Net.
Ja. Ich muss zugeben, ich bin gerade erst bei meinen ersten zaghaften .Net-Versuchen.

Jetzt irritiert mich aber die Tatsache, dass ein als "Text" in Access deklariertes Feld korrekt ausgegeben wird...

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Access-Memofeld mit ASP.NET auslesen

  Alt 20. Okt 2006, 23:13
Hi zusammen
Hmmm....
2 Versionen der Prozedur, dasselbe Ergebnis:
Delphi-Quellcode:
procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
 var Tabelle : System.Data.DataTable; i: integer; StriBu: StringBuilder;
     Zeile: TableRow; Zelle : TableCell; TZ,j: Integer; cRow:DataRow; cCol:DataColumn;
     CreateDate,ZellShow,ZellText,ZellInhalt,HeVa :System.String;
begin
      BdpDataAdapter1.Active:=True;
      BdpDataAdapter1.Fill(Dataset1);
      Tabelle := Dataset1.Tables[0];
      For j := 0 to Tabelle.Rows.Count-1 do begin
         cRow := Tabelle.Rows[j];
         For i := 0 to Tabelle.Columns.Count-1 do begin
            cCol := Tabelle.Columns[i];
            if cCol.ColumnName='Content_IDthen
               ZellInhalt := cRow[i].ToString;
            if cCol.ColumnName='Textthen begin
               HeVa := cRow[i].ToString;
               StriBu := Stringbuilder.Create(cRow[i].ToString);
               ZellText := StriBu.Append(HeVa).ToString;
            end;
            if cCol.ColumnName='Visiblethen
               ZellShow := cRow[i].ToString;
            if cCol.ColumnName='Edit_Datethen
               CreateDate := cRow[cCol.Ordinal].ToString;
            Label1.Text := CreateDate;
            Label2.Text:= ZellShow;
            Label3.Text := Zelltext;
            Label4.Text := ZellInhalt;
            Listbox1.Items.Add(cCol.ColumnName.ToString + ' = '+ cRow[cCol.Ordinal].ToString);
         end;
      end;
Contra
Delphi-Quellcode:
procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
 var Tabelle : System.Data.DataTable; i: integer; StriBu: StringBuilder;
     Zeile: TableRow; Zelle : TableCell; TZ,j: Integer; cRow:DataRow; cCol:DataColumn;
     CreateDate,ZellShow,ZellText,ZellInhalt:System.String;
begin
      BdpDataAdapter1.Active:=True;
      BdpDataAdapter1.Fill(Dataset1);
      Tabelle := Dataset1.Tables[0];
      For j := 0 to Tabelle.Rows.Count-1 do begin
         cRow := Tabelle.Rows[j];
         For i := 0 to Tabelle.Columns.Count-1 do begin
            cCol := Tabelle.Columns[i];
            if cCol.ColumnName='Content_IDthen
               ZellInhalt := cRow[i].ToString;
            if cCol.ColumnName='Textthen
               ZellText := cRow[i].ToString;
            if cCol.ColumnName='Visiblethen
               ZellShow := cRow[i].ToString;
            if cCol.ColumnName='Edit_Datethen
               CreateDate := cRow[cCol.Ordinal].ToString;
            Label1.Text := CreateDate;
            Label2.Text:= ZellShow;
            Label3.Text := Zelltext;
            Label4.Text := ZellInhalt;
            Listbox1.Items.Add(cCol.ColumnName.ToString + ' = '+ ZellText);
         end;
      end;
      BdpDataAdapter1.Active:=False;
Zur Erinnerung:

Zitat:
Delphi-Quellcode: markieren
ZellText := cRow[cCol.Ordinal].ToString;

Mit dieser Zeile lese ich in einem DataSet ein Feld aus, das aus einer Access-Datenbank stammt und da als Memo deklariert ist. Dazu verwende ich die Bdp-Komponenten.
In der Datenbank habe ich mittlerweile die Unicode-Kompression für dieses Feld abgeschaltet. Trotzdem erhalte ich bei einem Probelauf die Testausgabe "System.Char[]" anstelle des tatsächlichen Textes.
Andere Felder, die in der Datenbank als "Text" deklariert sind, werden korrekt ausgegeben.
Zitat:
Der Wert des Items in der DataRow ist ein Char Array, aber ein Char Array ist nur ein Array und wird seine Chars nicht als String ausgeben wenn man ToString auf ihn ausführt.
Meiner erster Versuch war, eine Char-Array-Variable zu deklarieren und dieser den Wert von cCol.Columns[i] zuzuweisen - interessant ist, dass der Compiler meckerte, dass String und Char-Array nicht kompatibel wären. Da die Variable als Char-Array deklariert war, ist klar, wo der String enthalten ist.

Das Problem ist also weiterhin ungelöst.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Access-Memofeld mit ASP.NET auslesen

  Alt 21. Okt 2006, 10:01
Zitat von Delbor:
Hi zusammen
@Khabarakh
Meine Deklaration:
cRow:DataRow; cCol:DataColumn;
Ich meinte eigentlich den Typ des Rückgabewertes . Hättest du diesen im Debugger geprüft, hättest du ihn einerseits als Char-Array bestätigen (ein überaus maliziöser Adapter könnte ja wirklich nur einen "System.Char[]"-String ausgeben ) und andererseits auch sofort seinen Inhalt einsehen können.

Hast du schon Elvis' Vorschlag ausprobiert?
ZellText := String.Create(cRow[cCol.Ordinal] as array of string);
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Access-Memofeld mit ASP.NET auslesen

  Alt 21. Okt 2006, 22:42
Hi zusammen
Zitat:
Hast du schon Elvis' Vorschlag ausprobiert?
Das habe ich jetzt nachgeholt. Delphi's Reaktion: sofortige Fehleranzeige bei 'array' ('@ erwartet aber array gefunden' im Kurzhinweis)und 'Char'('; erwartet, aber 'Char' erhalten, dito).

Die Delphi-Hilfe ist ganz klar besser als unter Dephi2005, wenn auch durch 'F1' nichts gefunden werden kann, doch manuelles Handling schafft da interessante Abhilfe: Zitat aus der .net-Framework SDK:
Zitat:
Die DataColumn ist der grundlegende Baustein bei der Erstellung des Schemas einer DataTable. Das Schema wird erstellt, indem der DataColumnCollection ein oder mehrere DataColumn-Objekte hinzugefügt werden. Weitere Informationen finden Sie unter Hinzufügen von Spalten zu einer Tabelle.

Jede DataColumn besitzt eine DataType-Eigenschaft, die die Art der in der DataColumn enthaltenen Daten bestimmt.
Danach ist der Datentyp des Columns-Objekts standardmässig kein Char-Array, was auch Erklärt, weshalb in Access als 'Text' deklarierte Felder korrekt wiedergegeben werden.


Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  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 06:43 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