Einzelnen Beitrag anzeigen

EvilCodein

Registriert seit: 15. Jan 2005
Ort: Bernburg
46 Beiträge
 
Delphi 2005 Architect
 
#1

Datensatz über Record -> in Access über SQL, Fehler? Idee

  Alt 7. Dez 2005, 23:58
Datenbank: Access und ARDRecord-File • Version: 2005 • Zugriff über: godb (ADO)
hi!

Ich hab ein Problem mit meinem Quelltext...
Ich hab ein Programm gebastelt, welches mir ermöglicht datensätze aus einer mir unbekannten-Datenbank auszulesen und diese auf den Bildschirm zu schreiben. Funzt...

Delphi-Quellcode:
program ARDReader;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TARDRecord = packed record
    ID: array[1..13] of Char;
    Anrede: array[1..13] of Char;
    Art: array[1..13] of Char;
    Kunde: array[1..61] of Char;
    Name: array[1..87] of Char;
    Strasse: array[1..61] of Char;
    PLZ: array[1..10] of Char;
    Ort: array[1..41] of Char;
    Tel: array[1..21] of Char;
    Mobil: array[1..21] of Char;
    Buffer: array[1..102] of Char;
    Datum: array[1..16] of Char;
    Preis: array[1..16] of Char;
    Feld1: array[1..1] of Char;
    Feld2: array[1..6] of Char;
    Anzahl: array[1..6] of Char;
    Feld3: array[1..61] of Char;
    Feld4: array[1..61] of Char;
  end;

var
  ARDFile: file of TARDRecord;
  ARDRecord: TARDRecord;
  RecordCount: Integer = 0;

begin
  AssignFile(ARDFile, 'C:\Dokumente und Einstellungen\Herr Boo\Desktop\evilbird\KUNDEN.ARD');
  Reset(ARDFile);
  WriteLn('Größe pro Datensatz: ' + IntToStr(SizeOf(TARDRecord)) + ' Byte');
  WriteLn;
  while not Eof(ARDFile) do
  begin
    Read(ARDFile, ARDRecord);
    WriteLn(
      ARDRecord.ID +
      ARDRecord.Anrede +
      ARDRecord.Art +
      ARDRecord.Kunde +
      ARDRecord.Name +
      ARDRecord.Strasse +
      ARDRecord.PLZ +
      ARDRecord.Ort +
      ARDRecord.Tel +
      ARDRecord.Mobil +
      ARDRecord.Buffer +
      ARDRecord.Datum +
      ARDRecord.Preis +
      ARDRecord.Feld1 +
      ARDRecord.Feld2 +
      ARDRecord.Anzahl +
      ARDRecord.Feld3 +
      ARDRecord.Feld4);
    Inc(RecordCount);
  end;
  WriteLn;
  WriteLn('Anzahl der Datensätze: ' + IntToStr(RecordCount));
  CloseFile(ARDFile);
  ReadLn;
end.


Aber wenn ich das in Delphi 2005 implementiere dann bekomm ich nach 5-7 sek. eine meldung:

First chance exception at $7C81EB33. Exception class EOleException with message 'Das Feld ist zu klein für die Datenmenge, die Sie hinzufügen wollten. Versuchen Sie, weniger Daten einzufügen'. Process ServiceReport.exe (1688)

ich habs nich so ganz kapiert. Hab auch schon alles mögliche ausprobiert, um den Record wieder leer zu machen, aber ich bekomms nich hin... Is da was falsch? hab ich mir da was dummes ausgedacht, oder kommt das so hin? Ich hab die Fremd-Datenbank und die Access als Zip dran gehängt..

mein Quelltext sieht so aus:
Delphi-Quellcode:
type
  TARDRecord = packed record
    ID: array[1..13] of Char;
    Anrede: array[1..13] of Char;
    Art: array[1..13] of Char;
    Kunde: array[1..61] of Char;
    Name: array[1..87] of Char;
    Strasse: array[1..61] of Char;
    PLZ: array[1..10] of Char;
    Ort: array[1..41] of Char;
    Tel: array[1..21] of Char;
    Mobil: array[1..21] of Char;
    Buffer: array[1..102] of Char;
    Datum: array[1..16] of Char;
    Preis: array[1..16] of Char;
    Feld1: array[1..1] of Char;
    Feld2: array[1..6] of Char;
    Anzahl: array[1..6] of Char;
    Feld3: array[1..61] of Char;
    Feld4: array[1..61] of Char;
  end;

type
  TData = class(TDataModule)
    Connection: TADOConnection;
    ClientsTable: TADOTable;
    InstructionsTable: TADOTable;
    InstructionsTableID: TAutoIncField;
    InstructionsTableCID: TWideStringField;
    InstructionsTableState: TIntegerField;
    InstructionsTableUser: TIntegerField;
    InstructionsTableDate: TWideStringField;
    InstructionsTableHardeware: TWideStringField;
    InstructionsTableManufactor: TWideStringField;
    InstructionsTableSN: TWideStringField;
    InstructionsTableSpecification: TWideStringField;
    InstructionsTableOwn: TIntegerField;
    InstructionsTableMoreInformation: TMemoField;
    InstructionsTableErrorActions: TWideStringField;
    InstructionsTableErrorTime: TWideStringField;
    InstructionsTableErrorMoreInfo: TMemoField;
    ClientsTableID: TWideStringField;
    ClientsTableAnrede: TWideStringField;
    ClientsTableName: TWideStringField;
    ClientsTableStreet: TWideStringField;
    ClientsTablePLZ: TWideStringField;
    ClientsTableCity: TWideStringField;
    ClientsTableHomePhone: TWideStringField;
    ClientsTableMobilePhone: TWideStringField;
    ClientsTableField3: TWideStringField;
    ClientsTableField4: TWideStringField;
    UsersTable: TADOTable;
    UsersTableID: TAutoIncField;
    UsersTableUser: TWideStringField;
    ClientsDS: TDataSource;
    InstructionsDS: TDataSource;
    UsersDS: TDataSource;
    ClientsQuery: TADOQuery;
    InstrucionsQuery: TADOQuery;
    UsersQuery: TADOQuery;
  private
    { Private declarations }
  public
    { Public declarations }
    function SyncDatabase: Boolean;
  end;

var
  Data: TData;
  ARDFile: file of TARDRecord;
  ARDRecord: TARDRecord;
  RecordCount: Integer = 0;



function TData.SyncDatabase: Boolean;
var Fp: String;
    f: File of Byte;
    DataArray: Array[1..20] of string;
begin
    Fp := 'C:\Dokumente und Einstellungen\Herr Boo\Desktop\evilbird\KUNDEN.ARD'; //Ini.ReadString('Settings', 'SyncFilePath', '');
    AssignFile(ARDFile, Fp);
    Reset(ARDFile);
    ClientsQuery.SQL.Clear;
    ClientsQuery.SQL.Add('DELETE * FROM Clients');
    ClientsQuery.ExecSQL;
  while not Eof(ARDFile) do
  begin
    Read(ARDFile, ARDRecord);
    ClientsQuery.SQL.Clear;
    ClientsQuery.SQL.Add('INSERT INTO clients (ID, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone, Field3, Field4)');
    ClientsQuery.SQL.Add('VALUES (:var1, :var2, :var3, :var4, :var5, :var6, :var7, :var8, :var9, :var10)');

    DataArray[1] := ARDRecord.ID;
    DataArray[2] := ARDRecord.Anrede;
    DataArray[3] := ARDRecord.Name;
    DataArray[4] := ARDRecord.Strasse;
    DataArray[5] := ARDRecord.PLZ;
    DataArray[6] := ARDRecord.Ort;
    DataArray[7] := ARDRecord.Tel;
    DataArray[8] := ARDRecord.Mobil;
    DataArray[9] := ARDRecord.Feld3;
    DataArray[10] := ARDRecord.Feld4;

    ClientsQuery.Parameters.ParamByName('var1').Value := DataArray[1];
    ClientsQuery.Parameters.ParamByName('var2').Value := DataArray[2];
    ClientsQuery.Parameters.ParamByName('var3').Value := DataArray[3];
    ClientsQuery.Parameters.ParamByName('var4').Value := DataArray[4];
    ClientsQuery.Parameters.ParamByName('var5').Value := DataArray[5];
    ClientsQuery.Parameters.ParamByName('var6').Value := DataArray[6];
    ClientsQuery.Parameters.ParamByName('var7').Value := DataArray[7];
    ClientsQuery.Parameters.ParamByName('var8').Value := DataArray[8];
    ClientsQuery.Parameters.ParamByName('var9').Value := DataArray[9];
    ClientsQuery.Parameters.ParamByName('var10').Value := DataArray[10];
    ClientsQuery.ExecSQL;

    Inc(Recordcount);
  end;
  CloseFile(ARDFile);
end;
könnt ihr das bitte mal ausprobieren, oder sieht jemand schon einen fehler??? Ich bin echt voll verwirrt deswegen... Ich komm einfach nich drauf was da falsch is und es lässt mir seit heute nahmittag keine ruhe, weil ich vor 1 monat oder so davon ausging, das das schon funktioniert....

Ich danke euch fürs lesen und noch vielmehr für ideen, anregungen, vorschläge, oder gar hinweise...

codein
Angehängte Dateien
Dateityp: zip datenbanken_175.zip (74,6 KB, 5x aufgerufen)
Software is like Sex, it's best if it's free.
  Mit Zitat antworten Zitat