AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datensatz über Record -> in Access über SQL, Fehler? Ideen?

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

Ein Thema von EvilCodein · begonnen am 7. Dez 2005 · letzter Beitrag vom 21. Dez 2005
Antwort Antwort
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
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 8. Dez 2005, 09:04
Hallo,

sieh Dir mal die Definition der Relation CLIENTS an. Der Fehler könnte daran liegen, dass mindestens eines der String-Felder in Clients auf eine zu kleine Maximallänge begrenzt ist, um den entsprechenden Wert aus diesem ARD-Record aufzunehmen. Das ganze funktioniert halt nur so lange, wie die Strings aus der Quelldatei nicht zu lang sind.

Hilft das weiter?
  Mit Zitat antworten Zitat
EvilCodein

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

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

  Alt 8. Dez 2005, 13:42
aber das is ja das problem: kein feld des Records is länger als 102 Zeichen. und die Datenbank is dach diesem Muster (nach dem Muster der Längen der Felder des Records) erstellt. Das bedeutet, das es nicht möglich ist, das ein Feld zu klein für den Inhalt des Records ist.
Aber könnte es sein, das der Record nicht neu beschrieben wird, sondern die nächste Zeichenkette dran gehängt wird?? Ich hab die Idee gehabt, weil wenn das Programm abstürtz kann man bei Delphi2005 einsehen was in den Variablen gespeichert is. In der ARDRecord sind die Daten ja Array-Mäßig gespeichert. ARDRecord.ID besteht aus (#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0) nichts... ?!? Warum.. An der Stelle Sollten diese 13 Plätze die Zahlen für die KundenNummern speichern. Ich kann das nicht verstehen.... Buitte helft mir. Ich muss das unbedingt bald fdertig haben... Ich könnte echt heulen....

Ich hab hier noch die Erstellung der Datenbank zur Laufzeit... Für die die wissen möchten, wie die Access-DB aussieht...
Delphi-Quellcode:
function TEDM.SetupDB(Database: String): Boolean;
var
  ADOXCatalog: _Catalog;
  ADOXTable: _Table;
  ADOXColumn: _ColumnDisp;
  ColName: OLEVariant;
  DSN: String;
begin
  DSN := Format('%s%s',[cCONNECTSTRING, Database]);
  ADOXCatalog := CoCatalog.Create;
  ADOXCatalog.Create(DSN);

  // Clients
  ADOXTable := CoTable.Create;
  ADOXTable.ParentCatalog := ADOXCatalog;
  ADOXTable.Name := 'Clients';
  ColName:='ID';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'ClientNumber';
  ColName:='Anrede';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Gender';
  ColName:='Name';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Name';
  ColName:='Street';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Street';
  ColName:='PLZ';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Nullable'].Value := True;
  ADOXColumn.Properties['Description'].Value := 'PLZ';
  ColName:='City';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'City';
  ColName:='HomePhone';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'PhoneNumber at Home';
  ADOXColumn.Properties['Jet OLEDB:Allow Zero Length'].Value := True;
  ADOXColumn.Properties['Default'].Value := '(unknown)';
  ColName:='MobilePhone';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'PhoneNumber at Mobile';
  ADOXColumn.Properties['Jet OLEDB:Allow Zero Length'].Value := True;
  ADOXColumn.Properties['Default'].Value := '(unknown)';
  ColName:='Field3';
  ADOXTable.Columns.Append(ColName, adVarWChar, 75);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Addon3';
  ColName:='Field4';
  ADOXTable.Columns.Append(ColName, adVarWChar, 75);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Addon4';
  ADOXCatalog.Tables.Append(ADOXTable);

  // Instrunctions
  ADOXTable := CoTable.Create;
  ADOXTable.ParentCatalog := ADOXCatalog;
  ADOXTable.Name := 'Instructions';
  ColName := 'ID';
  ADOXTable.Columns.Append(ColName, adInteger, 10);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['AutoIncrement'].Value := True;
  ADOXColumn.Properties['Description'].Value := 'Id of Dataset';
  ADOXTable.Keys.Append('ID', adKeyPrimary, ColName, '', '');
  ColName:='CID';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'ClientNumber';
  ColName:='State';
  ADOXTable.Columns.Append(ColName, adInteger, 1);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Nullable'].Value := True;
  ADOXColumn.Properties['Description'].Value := 'Status';
  ColName:='User';
  ADOXTable.Columns.Append(ColName, adInteger, 1);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'User';
  ColName:='Date';
  ADOXTable.Columns.Append(ColName, adVarWChar, 100);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Date and Time';
  ColName:='Hardeware';
  ADOXTable.Columns.Append(ColName, adVarWChar, 150);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Hardeware';
  ColName:='Manufactor';
  ADOXTable.Columns.Append(ColName, adVarWChar, 100);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Manufactor';
  ColName:='SN';
  ADOXTable.Columns.Append(ColName, adVarWChar, 100);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'SerialNumber';
  ColName:='Specification';
  ADOXTable.Columns.Append(ColName, adVarWChar, 100);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Specification';
  ColName:='Own';
  ADOXTable.Columns.Append(ColName, adInteger, 1);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Nullable'].Value := True;
  ADOXColumn.Properties['Description'].Value := 'Own Hardware';
  ColName:='MoreInformation';
  ADOXTable.Columns.Append(ColName, adLongVarWChar, 1000);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'More Informations';
  ColName:='ErrorActions';
  ADOXTable.Columns.Append(ColName, adVarWChar, 50);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Action of Error';
  ColName:='ErrorTime';
  ADOXTable.Columns.Append(ColName, adVarWChar, 150);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Time of Error';
  ColName:='ErrorMoreInfo';
  ADOXTable.Columns.Append(ColName, adLongVarWChar, 2000);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Info of Error';
  ADOXCatalog.Tables.Append(ADOXTable);

  // Users
  ADOXTable := CoTable.Create;
  ADOXTable.ParentCatalog := ADOXCatalog;
  ADOXTable.Name := 'Users';
  ColName := 'ID';
  ADOXTable.Columns.Append(ColName, adInteger, 6);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['AutoIncrement'].Value := True;
  ADOXColumn.Properties['Description'].Value := 'Id of User';
  ADOXTable.Keys.Append('ID', adKeyPrimary, ColName, '', '');
  ColName:='User';
  ADOXTable.Columns.Append(ColName, adVarWChar, 30);
  ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp;
  ADOXColumn.Properties['Description'].Value := 'Name of User';
  ADOXCatalog.Tables.Append(ADOXTable);

  SetupDB := true;
end;
Gibt es eigendlich möglichkeiten, das anders zu implementieren?? Weil ADOX is unter Delphi 2005 nich verfügbar.. oder ich finde es einfach nicht. Kennt jemand Möglicherweise einen anderen Weg eine Access Datenbank zur Laufzeit zu erstellen?

Danke, Codein
Software is like Sex, it's best if it's free.
  Mit Zitat antworten Zitat
EvilCodein

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

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

  Alt 9. Dez 2005, 12:29
hat echt keiner eine ahnung, woran es liegen könnte??
Software is like Sex, it's best if it's free.
  Mit Zitat antworten Zitat
EvilCodein

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

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

  Alt 20. Dez 2005, 17:20
Halle an alle...

Ich weiss nich woran es liegt, möglicherweise kann mich hier keiner leiden, oder ihr habt alle was zu tun, oder es möchte einfach keiner helfen, aber ich sehe mich diesem Problem hilflos ausgeliefert. Ich finde den Fehler einfach nicht.
Kann nicht bitte jemand mit mal helfen. Ich schaff das nicht und ich muss das fertig bekomm, sonst kann ich mir gleich nen strick nehmen..
Bitte, wer kurz zeit hat, ich möchte nur wissen, ob ihr den gleichen fehler bei euch zu hause bekommt. Ich bin mir nämlich sicher, das dieser quelltext in Delphi 7 funktioniert hat. Ich schreibe das hier nicht aus spass, sondern, weil ich wirklich am verzweifeln bin. Bitte helft mir... bitte

codein
Software is like Sex, it's best if it's free.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

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

  Alt 20. Dez 2005, 19:59
Zitat von EvilCodein:
Delphi-Quellcode:
    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;
....
Ich danke euch fürs lesen und noch vielmehr für ideen, anregungen, vorschläge, oder gar hinweise...
Dein Delphicode sieht noch ziemlich anfängermässig aus.
Also: SQL-Anweisung sollten ausserhalb einer Schleife zusammengebaut werden.
Delphi-Quellcode:
    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)');

  while not Eof(ARDFile) do
  begin
    Read(ARDFile, ARDRecord);
    .......
    
    ClientsQuery.ExecSQL; // IN der Schleife nur noch benutzen
    ...
  end;
Andreas
  Mit Zitat antworten Zitat
EvilCodein

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

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

  Alt 21. Dez 2005, 14:02
ich hab jetzt den quelltext wie folgt umgeändert:
Delphi-Quellcode:
function TMain.SyncDatabase: Boolean;
var Fp: String;
    f: File of Byte;
begin
  SyncDatabase := TRUE;
  Fp := 'C:\Dokumente und Einstellungen\Tilo\Desktop\micha\ServiceReport\Kunden.ard';
  AssignFile(ARDFile, Fp);
  Reset(ARDFile);
  ClientsQuery.SQL.Clear;
  ClientsQuery.SQL.Add('DELETE * FROM Clients');
  ClientsQuery.ExecSQL;
  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)');

  while not Eof(ARDFile) do
  begin
    Read(ARDFile, ARDRecord);

    Data.cnumber := ARDRecord.cnumber;
    Data.cpre := ARDRecord.cpre;
    Data.cname := ARDRecord.cname;
    Data.cstreet := ARDRecord.cstreet;
    Data.cplz := ARDRecord.cplz;
    Data.ccity := ARDRecord.ccity;
    Data.ctel := ARDRecord.ctel;
    Data.cmobil := ARDRecord.cmobile;
    Data.cfield3 := ARDRecord.cfield3;
    Data.cfield4 := ARDRecord.cfield4;

    ClientsQuery.Parameters.ParamByName('var1').Value := Data.cnumber;
    ClientsQuery.Parameters.ParamByName('var2').Value := Data.cpre;
    ClientsQuery.Parameters.ParamByName('var3').Value := Data.cname;
    ClientsQuery.Parameters.ParamByName('var4').Value := Data.cstreet;
    ClientsQuery.Parameters.ParamByName('var5').Value := Data.cplz;
    ClientsQuery.Parameters.ParamByName('var6').Value := Data.ccity;
    ClientsQuery.Parameters.ParamByName('var7').Value := Data.ctel;
    ClientsQuery.Parameters.ParamByName('var8').Value := Data.cmobil;
    ClientsQuery.Parameters.ParamByName('var9').Value := Data.cfield3;
    ClientsQuery.Parameters.ParamByName('var10').Value := Data.cfield4;

    // Inc(Recordcount);
    ProgressBar.Position := Recordcount * 100 div FileSize(ARDFile);
    ProgressBar.Update;

    ClientsQuery.ExecSQL;
  end;

  CloseFile(ARDFile);
  ProgressBar.Position := 0;
end;
Die Fehlermeldung bleibt jedoch die gleiche ... kann nich jemand mal mit Delphi 7 ausprobieren, ob da der gleiche Fehler auftritt? Bitte..

Codein
Software is like Sex, it's best if it's free.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

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

  Alt 21. Dez 2005, 14:15
Zitat von EvilCodein:
Die Fehlermeldung bleibt jedoch die gleiche ... kann nich jemand mal mit Delphi 7 ausprobieren, ob da der gleiche Fehler auftritt? Bitte..
Du musst den Fehler schon selber finden; wir können dir hier nur begrenzte Hilfe bieten.
Irgend einer deiner 10 Parameter wird wohl zu lang sein.
Du solltest alle Leerzeichen aus deinen Eingangsdaten mit Trim wegschneiden:
ClientsQuery.Parameters.ParamValues['var1'] := Trim(DataArray[1]); Wenn alle Stricke reisen, dann gibt es noch die Möglichkeit anstelle von INSERT eine SELECT-Anweisung zu verwenden:
Delphi-Quellcode:
ClientsQuery.SQL.Text := 'SELECT [ID], Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone, Field3, Field4 FROM clients WHERE 0=1';
// das Feld ID könnte ein reserviertes Wort sein, deshalb in eckige []
ClientsQuery.Open;
...
// später in der Schleife
ClientsQuery.Append;
ClientsQuery['ID'] := Trim(DataArray[1]);
ClientsQuery['Anrede'] := Trim(DataArray[2]);
...
ClientsQuery.Post;
Diese Vorgehensweise ist zwar langsamer, dafür sorgen aber die TField-Komponenten im Hintergrund dafür, dass die String-Felder nicht "überfüllt" werden können.
Andreas
  Mit Zitat antworten Zitat
EvilCodein

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

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

  Alt 21. Dez 2005, 14:29
danke. Ich habs jetzt hinbekommen...

Die Prozedur funtioniert jetzt mit der Select-Anweisung. Das ist aber net so schlimm, das es länger dauert, weil der Kundenstamm eh nur dann updegatet wird, wenn es nötig ist... ich danke dir.. Du hast mir echt ein schönes Weihnachtsgeschenk bereitet... Ich muss jetzt nur noch rausfinden, warum es unter delphi 2005 kein ADOX gibt... bzw. warum ich es nich finden kann.

codein
Software is like Sex, it's best if it's free.
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
795 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 21. Dez 2005, 15:02
ADOX mußt du dir schon selbst importieren. Bei Delphi 7 wie ich es auf meiner Homepage beschrieben habe. Delphi 2005 habe ich nicht, aber bei Delphi 2006 sollte es unter "Komponenten/Komponenten importieren" ähnlich funktionieren (nicht getestet).

Grüße
Mikhal
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:14 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