Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 17.03.14 20:05 
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.

ausblenden 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;    // make sure BOF is true;
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: 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.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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".

ausblenden 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; // wrong
  end;
end;


Die Zeilen
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: Di 18.03.14 12:38 
Ich würde ja sagen, dass adVarWChar hier fehlt:

ausblenden 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;    // make sure BOF is true;
  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  <-- HIER FEHLT adVarWChar !!!!
      If ADORecordSet.Fields[I].Type_ in [adVarChar, adVarWChar, adVarBinary, adChar] then // <-- ALSO SO
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 18.03.14 12:40 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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!
ausblenden Delphi-Quelltext
1:
2:
    adVarChar, adChar, adVarWChar:
      ADOFieldType := ftString;

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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". ;-)