Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen (https://www.delphipraxis.net/203485-erstellen-einer-accessdb-ueber-firedac-falsche-feldtypen-und-laengen.html)

Keldorn 23. Feb 2020 06:59

Datenbank: Access • Version: 2003 • Zugriff über: Firedac

Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
Hallo,

ich muss auch mal wieder was programmieren ;-) und versuche mich ein wenig an Datenbanken.

Ich möchte über Firedac eine accessdb erstellen und möchte dort später diverse aus xml importierte Daten ablegen. Diese liegen aktuell in Clientdatasets.

Kleines Demo, prinzipiell geht das:
Delphi-Quellcode:
procedure TForm2.Button3Click(Sender: TObject);
const const_DBDateiname='D:\TestDB\Test2.mdb';

  procedure proc_debugType(const Caption:string;const fieldno:integer);
  Var s:string;
    begin
      s:=GetEnumname( TypeInfo(TFieldType), Ord(FDTable1.FieldDefs[fieldno].DataType));
      Memo1.Lines.add(Caption+'-'+FDTable1.Name+': Fieldtype:'+s+' Size:'+FDTable1.FieldDefs[fieldno].size.ToString);
    end;

  procedure Proc_debug(const Caption:string);
    begin
      proc_debugType(Caption,0);
      proc_debugType(Caption,1);
      proc_debugType(Caption,2);
      proc_debugType(Caption,3);
    end;

begin
  if FileExists(const_DBDateiname) then
    deletefile(const_DBDateiname);

  FDMSAccessService1.Database :=const_DBDateiname;
  FDMSAccessService1.CreateDB;

  FDConnection1.ConnectionName:='test2';
  FDConnection1.DriverName:='MSAcc';
  FDConnection1.Params.clear;
  FDConnection1.Params.Add('DriverID=MSAcc');
  FDConnection1.Params.Add('Database='+const_DBDateiname);

  FDTable1.TableName:='Testname';
//  FDTable1.FieldDefs.Assign(ClientDataSet1.FieldDefs); //egal ob so oder direkt wie folgend:
  FDTable1.FieldDefs.Add('Test_ftInteger',ftInteger,0);
  FDTable1.FieldDefs.Add('Test_ftString',     ftString,25);
  FDTable1.FieldDefs.Add('Test_ftWideString', ftWideString,25);
  FDTable1.FieldDefs.Add('Test_ftMemo',       ftMemo,0);
  FDTable1.CreateTable(false);

  FDConnection1.Open;

  Proc_debug('vor table open');
  FDTable1.Open;
  Proc_debug('nach table open');
end;
Problem: nach table.open sind alle string-Felder vom Typ ftwidememo und von der Länge offen. Damit kann ich in access keine Beziehungen setzen.
Code:
vor table open-FDTable1: Fieldtype:ftInteger Size:0
vor table open-FDTable1: Fieldtype:ftString Size:25
vor table open-FDTable1: Fieldtype:ftWideString Size:25
vor table open-FDTable1: Fieldtype:ftMemo Size:0
nach table open-FDTable1: Fieldtype:ftInteger Size:0
nach table open-FDTable1: Fieldtype:ftWideMemo Size:0
nach table open-FDTable1: Fieldtype:ftWideMemo Size:0
nach table open-FDTable1: Fieldtype:ftWideMemo Size:0
Wenn ich in access eine DB erstelle und die mit dem Prog öffne, sind die Feldtypen und Längen richtig.

Was mache ich falsch :wall:, bzw was muss ich mir nochmal genauer anschauen?

Danke und Gruß Frank

jobo 23. Feb 2020 07:38

AW: Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
Der Code sieht nicht schlecht aus. :)

Wenn Du das nur zum Spaß musst, "reicht" vielleicht ein Table Create Statement per ExecSQL? Und wenn es wirklich Spaß machen soll, warum Access? Access ist ungefähr die unkonventionellste "Datenbank", die ich kenne.

Keldorn 23. Feb 2020 07:57

AW: Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
Zitat:

Zitat von jobo (Beitrag 1458109)
Der Code sieht nicht schlecht aus. :)

danke, immerhin :lol:

Zitat:

Zitat von jobo (Beitrag 1458109)
Wenn Du das nur zum Spaß musst, "reicht" vielleicht ein Table Create Statement per ExecSQL? Und wenn es wirklich Spaß machen soll, warum Access? Access ist ungefähr die unkonventionellste "Datenbank", die ich kenne.

Grundlage sind (sehr viele) XML die in clientdatasets gespeichert werden. FDTable1.FieldDefs.Assign(ClientDataSet1.FieldDefs ) und copydataset würden mich hier schon recht einfach weiterbringen.
ExecSQL scheitert am erstmal am Hintergrundwissen, muss ich mich belesen.

Access: hätte für mich den Vorteil, dass die Daten auch für andere einfacher auswertbar sind und ich weiß, dass Access auf den Zielrechnern auch drauf ist, wenn aus dem Spaß Ernst wird ;-).

Was würdest du empfehlen? Mit Firedac habe ich es hier auch beim Wechsel immer recht einfach, oder?
Es geht eigentlich nur um Auswertungen, die Tabellenstruktur ist aber schon recht komplex. Außer beim Erstellen wird nix mehr geschrieben.

Keldorn 23. Feb 2020 08:26

AW: Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
Delphi-Quellcode:
  FDConnection1.ExecSQL('create table Testname (id integer, name1 varchar(10), name2 varchar(25),name3 varchar(40))');
Danke, war einfach ;-).
interessanterweise wird die Tabelle in Access so mit der richtige Feldgröße angelegt.

aber warum geht's nicht direkt über FDTable?

jobo 23. Feb 2020 09:22

AW: Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
Zitat:

Zitat von Keldorn (Beitrag 1458111)
Delphi-Quellcode:
  FDConnection1.ExecSQL('create table Testname (id integer, name1 varchar(10), name2 varchar(25),name3 varchar(40))');
Danke, war einfach ;-).
interessanterweise wird die Tabelle in Access so mit der richtige Feldgröße angelegt.

aber warum geht's nicht direkt über FDTable?

Weil Access none standard ist? Weil Dein Delphi und Dein Access zu alt sind? Schlechte Treiber? Alles nur geraten.
Ich bin nicht mehr aktiv in der Delphientwicklung, es gibt hier sicher einige Leute, die das kompetent beantworten können.

jobo 23. Feb 2020 09:35

AW: Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
Zitat:

Zitat von Keldorn (Beitrag 1458110)
Grundlage sind (sehr viele) XML die in clientdatasets gespeichert werden. FDTable1.FieldDefs.Assign(ClientDataSet1.FieldDefs ) und copydataset würden mich hier schon recht einfach weiterbringen.
ExecSQL scheitert am erstmal am Hintergrundwissen, muss ich mich belesen.

Access: hätte für mich den Vorteil, dass die Daten auch für andere einfacher auswertbar sind und ich weiß, dass Access auf den Zielrechnern auch drauf ist, wenn aus dem Spaß Ernst wird ;-).

Was würdest du empfehlen? Mit Firedac habe ich es hier auch beim Wechsel immer recht einfach, oder?
Es geht eigentlich nur um Auswertungen, die Tabellenstruktur ist aber schon recht komplex. Außer beim Erstellen wird nix mehr geschrieben.

"scheitert erstmal" ist ja schon Geschichte. Du kannst das natürlich alles mit Clientoperationen machen. FD Komponenten wären grundsätzlich der richtige Ansatz, dafür nimmt man ja Delphi.

Accessvorteil "Verfügbarkeit" klingt nach professioneller Bürotätigkeit. Anscheinend ist MS Office immer noch der Quasi Standard im Büro. Verfügbarkeit eines DB Systems wäre auch durch einige andere, sogar kostenlose Systeme gegeben.
- Früher MSDE heute glaub ich SQL Server Express (oder das analoge Produkt von Oracle, Oracle Express)
- Firebird Embedded kannst Du direkt in Dein Programm integrieren
- Postgres arbeitet schon serverseitig ganz gut mit XML
(dazu gibt's nebenan eine Diskussion über JSON Analyse per SQL:
https://www.delphipraxis.net/203478-...-new-post.html)
- Vielleicht auch SQLite

P.S.: Die Systeme haben natürlich alle unterschiedliche Fußabrücke, auch wenn sie erstmal verfügbar sind. Hervorzuheben ist da Firebird und SQLite.

p80286 23. Feb 2020 11:52

AW: Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
Zitat:

Zitat von jobo (Beitrag 1458114)
Accessvorteil "Verfügbarkeit" klingt nach professioneller Bürotätigkeit.

Auch wenn ich ACCESS nicht gerade freundlich gegenüber stehe, Programm aufrufen 3-7 klicks und Du hast Deine Datenbank. Alleine SQL-Server-Express richtig zu installieren und "Arbeitstauglich" zu machen hat mich schon einmal 3 Stunden gekostet (gut ich mußte etwas ältere mdb-Dateien verwursten)
Meine Empfehlung für QuicknDirty-DBMS ist Firebird auch wenn der SQL-Dialekt stellenweise etwas gewöhnungsbedürftig ist. Was aber nichts negatives über die genannten Expressversionen oder andere DBMS sagen soll. Für mein Privatvergnügen sind mir Lizenzfragen relativ egal wer aber Freunde und Bekannte oder sogar Kunden mit einer DB beglücken will, sollte da schon sorgfälig auswählen.

Gruß
K-H

Keldorn 23. Feb 2020 12:14

AW: Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
:thumb: danke, hilft mir erstmal weiter. ich werde mich den genannten intensiver auseindersetzen

Uwe Raabe 23. Feb 2020 12:25

AW: Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
Zitat:

Zitat von Keldorn (Beitrag 1458111)
Delphi-Quellcode:
  FDConnection1.ExecSQL('create table Testname (id integer, name1 varchar(10), name2 varchar(25),name3 varchar(40))');
Danke, war einfach ;-).
interessanterweise wird die Tabelle in Access so mit der richtige Feldgröße angelegt.

Hast du mal kontrolliert, ob die Felder dann fixe oder variable Länge haben?

Keldorn 23. Feb 2020 13:14

AW: Erstellen einer AccessDB über Firedac, falsche Feldtypen und -längen
 
variable Länge mit den Größen, wie übergeben :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 Uhr.
Seite 1 von 2  1 2      

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