none
eindeutige Spaltenbezeichnungen... RRS feed

  • Frage

  • Hallo,
    folgendes Statement zum füllen einer DataTable benutze ich :

    cStatement = "SELECT TOP 10 PKArtikel, dbArtikel.Artikelnummer, dbArtikel.Bezeichnung, dbArtikel.VkPreisBrutto, dbWarenGruppen.Warengruppe, dbWarengruppen.Bezeichnung
    FROM dbArtikel  LEFT OUTER JOIN dbWarenGruppen as dbWarengruppen ON ( dbWarenGruppen.PKWarenGruppen = dbArtikel.PKWarenGruppen )  "
     
    oAdapter = New SqlDataAdapter(cStatement, frmMainWindow.odbServer.oConn)
    oAdapter.SelectCommand.CommandTimeout = 0
    oAdapter.MissingMappingAction = MissingMappingAction.Passthrough
    oAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
    oDataTable.PrimaryKey = New DataColumn() {oDataTable.Columns(cPKSpalte)}
    oDataTable.Clear()
    oAdapter.Fill(oDataTable)

    For iFor = 0 To oDataTable.Columns.Count - 1
     oCol = oDataTable.Columns(iFor)

             debout32(oCol.ColumnName)
             debout32(oCol.Table.TableName)

    Next

    Funktioniert auch alles Super...

    Aber bei oCol.Table.TableName kommt auch bei der Spalte
    dbWarengruppen.WarenGruppe oder dbWarenGruppen.Bezeichnung
    die gleiche Table heraus "dbArtikel".

    Gibt es ein "Fillschema" was mir in den generierten Columns auch den
    Tablenamen mitliefert ?

    Dank euch,
    Mario

    Freitag, 6. Mai 2011 12:44

Antworten

  • Hallo Mario,

    da sitzt Du einem Mißverständnis auf.
    Eine SQL Abfrage braucht keine Spaltenbezeichnungen und eindeutig müssen sie schon mal gar nicht sein.
    Und ein Bezug zu einer Tabelle besteht in einer Abfrage ebenfalls nicht mehr.

    Alle DataAdapter verwenden für die Zuordnung der Abfrage(n) die TableMappings-Eigenschaft,
    worüber die DataTable(s) durchnummeriert einen anderen Namen erhalten.
    Jedes DataTableMapping hat wiederum eine ColumnMappings-Eigenschaft 
    worüber die DataColumns ihren Namen erhalten.

    Hat man diese Eigenschaften nicht explizit festgelegt (und ist MissingMappingAction entsprechend gesetzt)
    ermitteln die DataAdapter die Informationen aus der SchemaTable der Abfrage. Siehe auch:
    DataAdapter DataTable- und DataColumn-Zuordnungen (ADO.NET)

    Spaltennamen (DataColumn) mit einem "." sollte man tunlichst vermeiden, da Punkte
    auch als Trenner bei der Datenbindung uam. verwendet wird.
    Und da fällt gelegentlich schon mal was auf die Nase ;-(

    Wobei der SQL Server Provider relativ detaillierte Informationen bei AddWithKey liefert
    (tun aber längst nicht alle Provider).

    Soweit zur Behandlung durch ADO.NET.

    Sinvoller wäre in Deinem Falle zwei DataTAble zu verwenden, anstatt mit einem (LEFT) JOIN
    duplizierte Informationen über alle Zeilen mitzuschleppen. Das erhöht nur die Datenmenge.

    So wäre denkbar alle Warengruppen (ich gehe davon aus es gibt nur einige wenige) zusammen mit dem Artikel Abzurufen

    SELECT TOP (10) PKArtikel, dbArtikel.Artikelnummer, dbArtikel.Bezeichnung, dbArtikel.VkPreisBrutto, dbArtikel.PKWarenGruppen
    FROM dbArtikel
    ORDER BY PKArtikel; -- TOP ohne ORDER BY tut man nicht!
    
    SELECT PKWarenGruppen, Warengruppe, Bezeichnung
    FROM dbWarengruppen;
    
    
    

    (das geht auch in einer Abfrrage) Oder wenn Du es genauer haben willst:

    -- die eingeschränkte Version
    SELECT PKWarenGruppen, Warengruppe, Bezeichnung
    FROM dbWarengruppen
    WHERE PKWarengruppen IN (SELECT TOP (10)
    	dbArtikel.PKWarenGruppen 
    	FROM dbArtikel
    	WHERE dbArtikel.PKWarenGruppen IS NOT NULL
    	ORDER BY dbArtikel.PKArtikel);
    
    
    

    Wenn Du ein DataSet damit füllst hast Du zwei DataTable, die über eine DataRelation
    in Beziehung setzen kannst. Das kann auch zur Integritätsprüfung verwendet werden,
    wenn man einen Fremdschlüssel draus macht, siehe  Einführung in DataRelation-Objekte

    Wenn man davon ausgehen kann, dass sich die Warengruppen nur selten ändern,
    kannst Du die Warengruppen einmalig abrufen und später immer nur die angefragten Artikel.

    Gruß Elmar

    Freitag, 6. Mai 2011 18:02