Announcement

Collapse
No announcement yet.

MS SQL und Primary Keys

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MS SQL und Primary Keys

    Hallo,

    kann mir von euch zufällig jemand sagen wie ich in Delphi die Primary Keys einer Tabelle auslese (d.h. Auflistung aller Felder, die PK bzw. FK sind)?

    Vielen Dank für eure Hilfe schon mal im voraus.

    mfg
    Andreas Liebert

  • #2
    Hallo,

    am einfachsten geht das über die vorbereitete Systemprozedur <b>sp_pkeys</b>:

    <pre>
    EXEC sp_pkeys @table_name = 'customers'
    </pre&gt

    Comment


    • #3
      Danke schon mal für den Tipp Herr Kosch.
      Aber kann ich auch auf das Feld "COLUMN_NAME" von Delphi heraus zugreifen? Wenn ich folgenden Code ausführe, bekomme ich diese Fehlermeldung: Das Feld 'COLUMN_NAME' wurde nicht gefunden.

      Code:
      <PRE>
      function TFHaupt.IsKey(Feld: string): string;
      begin
      SQL_KEY.ParamByName('paTabelle').asString := Tabelle;
      if not SQL_KEY.Prepared then SQL_KEY.Prepare;
      SQL_KEY.Open;
      SQL_KEY.First;
      while not SQL_KEY.EOF do
      begin
      if pos(Feld, SQL_KEY.FieldByName('COLUMN_NAME').Value) > 0 then
      Result := 'ja'
      else
      Result := 'nein';
      SQL_KEY.Next;
      end;
      SQL_KEY.Close;
      end;
      </PRE>

      Der Fehler tritt bei der Zeile "if pos(..." auf. Ich hoffe sie können mir weiterhelfen.

      mfg
      Andreas Lieber

      Comment


      • #4
        Hallo,

        mit welchen Komponten wird gearbeitet? Wenn ADO verfügbar ist, steht der Weg über <b>OpenSchema</b> zur Verfügung:
        <pre>
        unit Unit1;

        interface

        uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls, DB, Grids, DBGrids, ADODB;

        type
        TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADODataSet1: TADODataSet;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        private
        { Private-Deklarationen }
        public
        { Public-Deklarationen }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.dfm}

        procedure TForm1.Button1Click(Sender: TObject);
        begin
        with ADOConnection1 do
        begin
        Connected := True;
        OpenSchema(siPrimaryKeys, EmptyParam, Emptyparam, ADODataSet1);
        ADODataSet1.Filter := 'TABLE_NAME = ''Employees''';
        ADODataSet1.Filtered := True;
        end;
        end;

        end.
        </pre>
        <pre>
        object Form1: TForm1
        Left = 222
        Top = 201
        Width = 870
        Height = 640
        Caption = 'Form1'
        Color = clBtnFace
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = []
        OldCreateOrder = False
        PixelsPerInch = 96
        TextHeight = 13
        object DBGrid1: TDBGrid
        Left = 40
        Top = 56
        Width = 529
        Height = 241
        DataSource = DataSource1
        TabOrder = 0
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = 'MS Sans Serif'
        TitleFont.Style = []
        end
        object Button1: TButton
        Left = 160
        Top = 24
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 1
        OnClick = Button1Click
        end
        object ADOConnection1: TADOConnection
        ConnectionString =
        'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In' +
        'fo=False;Initial Catalog=Northwind;Data Source=.'
        LoginPrompt = False
        Provider = 'SQLOLEDB.1'
        Left = 40
        Top = 24
        end
        object ADODataSet1: TADODataSet
        Connection = ADOConnection1
        Parameters = <>
        Left = 80
        Top = 24
        end
        object DataSource1: TDataSource
        DataSet = ADODataSet1
        Left = 120
        Top = 24
        end
        end
        </pre>

        Zum BDE-Problem:

        &gt;..Das Feld 'COLUMN_NAME' wurde nicht gefunden..

        Verbindet man die TQuery via TDataSource mit einem TDBGrid, ist nur die INTEGER-Spalte KEY_SEQ zu sehen, aber die anderen Zeichenspalten nicht. Die BDE kann keine UNICODE-Zeichenspalten anzeigen. Um dieses Problem zu lösen, muss eine temporäre Tabelle bemüht werden, die nur VARCHAR-Spalten (aber keine UNICODE-Spalten) verwendet:
        <pre>
        CREATE TABLE ##PKEYS (
        TABLE_QUALIFIER VARCHAR(100),
        TABLE_OWNER VARCHAR(100),
        TABLE_NAME VARCHAR(100),
        COLUMN_NAME VARCHAR(100),
        KEY_SEQ INTEGER,
        PK_NAME VARCHAR(100))
        </pre>
        Das Ergebnis von sp_pkeys wird nun in diese temporäre Tabelle umgeleitet:
        <pre>
        INSERT INTO ##PKEYS
        EXEC sp_pkeys @table_name = 'customers'
        </pre>
        Mit der BDE wird diese temporäre Tabelle via TQuery ganz normal ausgelesen:
        <pre>
        SELECT * FROM ##PKEYS
        </pre&gt

        Comment


        • #5
          Vielen Dank für die Hilfe, Herr Kosch.
          Das hat mir sehr weitergeholfen. Vor allem der Tipp, mit der temp. Tabelle.

          mfg
          Andreas Lieber

          Comment

          Working...
          X