Entwickler-Ecke

Datenbanken - Spaltennamen und Datentypen auslesen


dontello - Mi 16.03.11 14:03
Titel: Spaltennamen und Datentypen auslesen
Hallo,

wie kann ich aus einer MSSQL Datenbank Tabelle die Spaltennamen und Datentypen auslesen mit Hilfe der AdoTable Komponmenten?


mikhal - Mi 16.03.11 14:11

TAdoConnection.GetTabelNames um Tabellennamen einer Datenbank zu ermitteln
TAdoConnection.GetFieldNames um Feldnamen einer Tabelle zu ermitteln
TField.DataType um den Feldtyp zu ermitteln.

Grüße
Mikhal


dontello - Mi 16.03.11 14:21


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm4.Button2Click(Sender: TObject);
var
  Adoconn: TAdoConnection;
  liste: TStrings;
begin
  
    liste.Create;
    AdoConn.Create(nil);
    Adoconn.getfieldnames('tabellenname', liste);

end;

Bei dem Code bekomme ich einen Fehler. (Zugriffsverletzung)

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


mikhal - Mi 16.03.11 14:29

Wo ist der ConnectionString, mit dem du die TAdoConnection mit deinem SQl Server verbindest? Ich würde ausserdem nicht TStrings sondern TStringList verwenden.

Grüße
Mikhal


dontello - Mi 16.03.11 14:39

ist das so korrekt

Delphi-Quelltext
1:
2:
3:
4:
    AdoConn.Create();
    AdoConn.ConnectionString := 'Verbindungsstring';
    AdoConn.Open;
    Adoconn.getfieldnames('dat_bezirke', liste);


Moderiert von user profile iconNarses: Delphi-Tag repariert.


mikhal - Mi 16.03.11 14:43

leg dir mal ein Formular an, packe da eine TAdoConnection aus der Komponentenliste drauf, klicke doppelt auf das Komponentensymbol und stelle den ConnectionString zusammen (Provider auswählen, Datenbankauswählen, Benutzer eintragen, Passwort eintragen). Nach dem Bestätigen deiner Eingaben, solltest du im Dialog den fertigen ConnectionString vorfinden. Bevor du den aber einfach kopierst, teste erst mal, ob er korrekt ist, indem du die Property Connected der TAdoConnection im ObjectInspector auf True setzt.

Grüße
Mikhal


guinnes - Mi 16.03.11 15:05

user profile icondontello hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm4.Button2Click(Sender: TObject);
var
  Adoconn: TAdoConnection;
  liste: TStrings;
begin
  
    liste.Create;
    AdoConn.Create(nil);
    Adoconn.getfieldnames('tabellenname', liste);

end;

Bei dem Code bekomme ich einen Fehler. (Zugriffsverletzung)

Hast du schon mal gehört, daß man Objekte so erzeugt :


Delphi-Quelltext
1:
Liste := TStringlist.Create                    


mikhal - Mi 16.03.11 15:11

@Guiness: Habe ich gar nicht zur Kenntnis genommen...
Grüße
Mikhal


guinnes - Mi 16.03.11 15:33

user profile iconmikhal hat folgendes geschrieben Zum zitierten Posting springen:
@Guiness: Habe ich gar nicht zur Kenntnis genommen...
Das übersieht man auch wirklich leicht, ich habe auch 3 Mal gelesen :wink:


dontello - Mi 16.03.11 15:56


delphi
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm4.Button2Click(Sender: TObject);
var

  Adoconn: TAdoConnection;
  liste: TStringlist;
begin
  liste := TsTringlist.Create;

    liste.Create;
    AdoConn.Create(nil);
    AdoConn.ConnectionString := 'Verbindungsstring ist getestet';

    AdoConn.Open;
    Adoconn.getfieldnames('dat_bezirke', liste);

Irgendwie will es einfach nicht klappen.

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


guinnes - Mi 16.03.11 16:03

Kannst du uns erklären was der Schei... soll ?
Warum steht da immer noch das liste.Create; ?
Warum glaubst du, die AdoConnection wird grundsätzlich anders erzeugt als eine Stringliste ?
Ich rate dir dringend zu einem Grundlagenkurs [http://www.delphi-treff.de/tutorials/grundlagen/]


dontello - Mi 16.03.11 16:10

Sorry. Habs einfach überlesen hier die ganze Zeit.
Beim Debuggen bekomm ich beim ConnectionString noch ein Fehler. Über die Ado Komponente Verbindungstest funktioniert der Verbindungstest. Wenn ich auf Verbindung true gehe, gebe ich Paswort und User ein und kriege die Verbindung. Muss ich dem connection String den User + Benutzername noch irgendwie mitgeben?

Was muss ich bei AdoConn.Create(hier eintragen) ?


mikhal - Mi 16.03.11 17:59

Schau dir mal dieses Tutorial [http://www.delphi-treff.de/tutorials/datenbanken/flexible-ado-connection-zur-ansteuerung-einer-access-datenbank/einleitung/] an. Hier geht es zwar um die Anbindung von Access, aber das Prinzip ist bei SQL Server das gleiche.

Grüße
Mikhal


dontello - Do 17.03.11 15:37

Danke es klappt jetzt soweit.

Habe noch eine andere Frage bezüglich des Datentypes.

Ich habe den Datentyp jetzt als TFieldType vorliegen. Gibt es eine Möglichkeit mir den als String ausgeben zu lassen?


bummi - Do 17.03.11 16:50


Delphi-Quelltext
1:
2:
3:
uses Typinfo;

GetEnumName(TypeInfo(TFieldType), Ord(f.DataType))


dontello - Fr 18.03.11 10:51

Gibt es dafür ein gutes Beipiel im Netz oder kann hier jemand eins aufführen zum auslesen der Datentypen von Tabellenspalten?


bummi - Fr 18.03.11 11:21

zum Fertigbasteln...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  TFieldInfoRec=Record
      Name:String;
      Size:Integer;
      DataType:String;
  End;
  TFieldinfoArray=Array of TFieldInfoRec;

Function PGetFields(ds:Tdataset):TFieldinfoArray;
var
  i:Integer;
begin
  SetLength(Result,ds.FieldCount);
  for i := 0 to ds.FieldCount - 1  do
      begin
        Result[i].Name := ds.Fields[i].FieldName;
        Result[i].Size := ds.Fields[i].Size;
        Result[i].DataType := GetEnumName(TypeInfo(TFieldType), Ord(ds.Fields[i].DataType))
      end;
end;


dontello - Fr 18.03.11 14:16

Wie erfolgt dann eine Ausgabe der Daten?


delphi
1:
2:
3:
    fieldarray := GetFields(tabelle);

    edit1.Text := fieldarray[1].DataType;


So korrekt ?