Entwickler-Ecke
Datenbanken - Tabelle zeigt nur numerische Spalten
Peter18 - Mo 17.03.14 20:05
Titel: Tabelle zeigt nur numerische Spalten
Ein freundliches Hallo an alle,
ich verwende
Delphi 4 für meine Programmierung. Ein gefundenes "ADODataSet" macht Schwierigkeiten. Ich vermute es handelt sich um irreführende Meldungen. Führe ich das Programm normal aus, so erscheinen die Spalten ID und Postleitzahl, die Integer-Werte enthalten. Die Text-Spalten werden nicht angezeigt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure TADODataSet.InternalInitFieldDefs; var RowsAffected : OleVariant; nFields, I : Integer; begin if not Assigned(ADORecordset) then begin ADORecordSet := CoRecordSet.Create; ADORecordSet.CursorLocation := adUseClient; ADORecordSet.Open(fRecordSetSQL, ADOConnection, adOpenStatic, adLockOptimistic,-1) end; InternalFirst; FieldDefs.Clear;
begin nFields := ADORecordSet.Fields.Count; for I := 0 to nFields-1 do begin If ADORecordSet.Fields[I].Type_ in [adVarChar, adVarBinary, adChar] then FieldDefs.Add(ADORecordSet.Fields[I].Name, ADOFieldType(ADORecordSet.Fields[I].Type_), ADORecordSet.Fields[I].DefinedSize, False) else FieldDefs.Add(ADORecordSet.Fields[I].Name, ADOFieldType(ADORecordSet.Fields[I].Type_), 0, False); end; end; end; |
in allen Fällen wird "
FieldDefs.Add" im Else-Teil aufgerufen. Ersetze ich die 0 durch eine andere Zahl folgt die Fehlermeldung: "
Ungültige Feldgröße". Mit "
ActualSize" ercheint "BOF oder EOF ist True". Ich habe den Eindruck das die eigentliche Ursache wieder an anderer Stelle liegt. Ich hoffe jemand hat einen heißen Tipp!
Grüße von der Nordsee und Dank im Voraus
Peter
WasWeißDennIch - Di 18.03.14 09:11
Ich denke, Dein eigener Code sowie die Tabellendefinition wären zielführender als der VCL-Code (von urheberrechtlichen Bedenken einmal ganz abgesehen).
zuma - Di 18.03.14 09:58
Hast du denn mal geprüft, welcher Typ jeweils im AdoDataSet ist ?
Also, Haltepunkt auf die If-Zeile und dann mal gucken, was in
ADORecordSet.Fields[I].Type_ für ein Typ je Durchlauf angegeben wird ?
Klingt für mich so, als ob es ein anderer Datentyp als die abgefragten [adVarChar, adVarBinary, adChar] ist.
Peter18 - Di 18.03.14 12:28
Hallo WasWeißDennIch,
danke für Deine Antwort. Urheberrechtliche Bedenken sind nicht notwendig. Zum einen geht es mir um den Einstieg (Testprogram) und zum anderen ist die Quelle ausdrücklich freigegeben.
Hallo zuma,
auch Dir meinen Dank. Das habe ich getan und den Wert 202 gefunden. Da ich ihn nicht finden konnte (war etwas spät) habe ich die Zahl dort eingetragen wo "ftString" zugewiesen wird.
Inzwischen bin ich wieder fit und habe die 202 als "adVarWChar" identifiziert. Zuweisen von "ftWideString" führt aber auch zu einer Fehlermeldung: "Type für Feld 'Vorname'ist unbekannt".
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| function TADODataSet.ADOFieldType(ID: DataTypeEnum) :TFieldType; begin case ID of adInteger: ADOFieldType := ftInteger; adVarChar, adChar: ADOFieldType := ftString; adVarWChar: ADOFieldType := ftWideString; adLongVarChar: ADOFieldType := ftMemo; adDBTimeStamp: ADOFieldType := ftDateTime; adDouble, adSingle, adNumeric: ADOFieldType := ftFloat; adLongVarBinary: ADOFieldType := ftBlob; adCurrency: ADOFieldType := ftCurrency; adSmallInt, adTinyInt: ADOFieldType := ftSmallInt; adVarBinary: ADOFieldType := ftVarBytes; else ADOFieldType := ftUnknown; end; end; |
Die Zeilen
Delphi-Quelltext
1: 2:
| adVarWChar: ADOFieldType := ftWideString; |
habe ich eingefügt. Anscheinend ist das der falsche Typ. Der Fehler tritt in der Zeile
if DefaultFields then CreateFields;auf. Vielleicht ist ein anderer Typ richtig, doch welcher? Werde experimentieren vielleicht hilft das oder ein Tipp von Euch.
Grüße von der Nordsee und Dank im Voraus
Peter
baumina - Di 18.03.14 12:38
Ich würde ja sagen, dass adVarWChar hier fehlt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TADODataSet.InternalInitFieldDefs; var RowsAffected : OleVariant; nFields, I : Integer; begin if not Assigned(ADORecordset) then begin ADORecordSet := CoRecordSet.Create; ADORecordSet.CursorLocation := adUseClient; ADORecordSet.Open(fRecordSetSQL, ADOConnection, adOpenStatic, adLockOptimistic,-1) end; InternalFirst; FieldDefs.Clear;
begin nFields := ADORecordSet.Fields.Count; for I := 0 to nFields-1 do begin If ADORecordSet.Fields[I].Type_ in [adVarChar, adVarWChar, adVarBinary, adChar] then FieldDefs.Add(ADORecordSet.Fields[I].Name, ADOFieldType(ADORecordSet.Fields[I].Type_), ADORecordSet.Fields[I].DefinedSize, False) else FieldDefs.Add(ADORecordSet.Fields[I].Name, ADOFieldType(ADORecordSet.Fields[I].Type_), 0, False); end; end; end; |
jaenicke - Di 18.03.14 12:40
Peter18 hat folgendes geschrieben : |
Urheberrechtliche Bedenken sind nicht notwendig. Zum einen geht es mir um den Einstieg (Testprogram) und zum anderen ist die Quelle ausdrücklich freigegeben. |
Die Quellen der VCL, die du postest, sind bestimmt nicht freigegeben. Und die meinte er.
Welche Datentypen verwendest du denn in der Tabelle?
Bezüglich ftWideString:
Das mag durchaus sein, dass Delphi 4 das an der Stelle noch nicht als Feldtyp unterstützt hat.
Da sollte helfen, wenn du einen Stringtyp in deiner Tabelle benutzt, der nicht Unicode ist. Dann sollte als Feldtyp auch adVarChar kommen, und das wird ja unterstützt.
Zudem ist es auch nicht so sinnvoll in den VCL Quellen etwas zu ändern. Das bringt nur Probleme.
Peter18 - Di 18.03.14 13:26
Hallo baumina,
Danke für Deine Antwort. Es kann so Einfach sein, wenn man die Peilung hat. Dieser Kronleuchter ist mir beim Experementieren auch gerade aufgegangen. Und nun sehe ich die Strings auch in der Tabelle.
Danke!
Delphi-Quelltext
1: 2:
| adVarChar, adChar, adVarWChar: ADOFieldType := ftString; |
Delphi-Quelltext
1: 2: 3: 4:
| If ADORecordSet.Fields[I].Type_ in [adVarChar, adVarBinary, adChar, adVarWChar] then FieldDefs.Add(ADORecordSet.Fields[I].Name, ADOFieldType(ADORecordSet.Fields[I].Type_), ADORecordSet.Fields[I].DefinedSize, False) |
Hallo jaenicke,
Deinen Einwand
Zitat: |
Die Quellen der VCL, die du postest, sind bestimmt nicht freigegeben. |
kann ich entkräften! Hier die Originalbeschreibung zu dem Download:
Zitat: |
A Free ADO Dataset component with source code, includes support for Blob fields and Filters. |
Und hier ein Auszug aus der Beschreibung des Autors:
Zitat: |
You can use the source code for comercial and non-comercial use, but if you want to use this for comercial use, drop me an e-mail first, so I can know. |
Grüße von der Nordsee
Peter
jaenicke - Di 18.03.14 14:14
Ah, ok, das heißt nur so wie das mit Delphi mitgelieferte TADODataset. Das war zwar keine gute Idee des Autors, aber das "ist dann eben so". ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!