Announcement

Collapse
No announcement yet.

TableAdapter und Insert, Update, Delete Methoden bei Join

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

  • TableAdapter und Insert, Update, Delete Methoden bei Join

    Moin,

    ich hab folgendes Problem, ich habe in einem DataSet einen TableAdapter mit einer Abfrage auf 2 Tabellen per Inner Join. Leider lassen sich scheinbar, für Abfragen, die einen Join beinhalten nicht die Insert, Update und Delete Methoden generieren.

    Ich wollte in einer Tabelle eigentlich per:

    this.Validate();
    this. BindingSource.EndEdit();
    this.TableAdapter.Update(this.DataSet.Tabelle);


    Einen neuen Datensatz einfügen bzw. einen bestehenden bearbeiten.
    Da dies nbicht funktioniert weil die Methode nicht zur Verfügung steht hab ich folgendes probieren wollen:

    TableAdapter.Insert(spalte1, spalte2, usw.);


    Leider gibt es die Methode Insert auch nicht, vermutlich aus dem gleichen Grund wie oben beschrieben.

    Kann mir da vielleicht jemand weiterhelfen, wie ich vorzugehen habe?

    Achja, verwendet wird der SQL Server 2005

    Gruß
    Deep

  • #2
    Hallo,

    in der Regel wird nur eine Tabelle aktualisiert. Daher kann das Problem in 2 Schritten gelöst werden:
    1. Zuerst wird der TableAdapter nur für den Zugriff auf 1 Tabelle konfiguriert.
    2. Erst danach wird beim TableAdapter die Eigenschaft CommandText geändert, indem die intern im TableAdapter verbaute SqlCommand-Instanz eine neue SQL-Anweisung in der Eigenschaft CommandText erhält. Die von einem JOIN zusammengemische Ergebnismenge wird dazu im Query Builder erstellt und getestet. Wird im Query Builder der Button OK angeklickt, fragt Visual Studio nach, ob basierend auf der neuen SELECT-Abfrage auch die Aktualisierungsanweisungen (d.h. InsertCommand, UpdateCommand und DeleteCommand) aktualisiert werden sollen. Diese Abfrage muss mit Nein beantwortet werden (siehe Abbildung)
    Attached Files

    Comment


    • #3
      Hallo,

      danke für den Tip, das klappt auch soweit. Allerdings, wird die 2te Tabelle im Join nicht gespeichert, er legt nur den Datensatz in Tabelle 1 an.

      Gruß
      Deep

      Edit: Hab da noch eine Zusatzfrage, wenn ich den Datensatz mit folgendem Code speicher:
      this.Validate();
      this. BindingSource.EndEdit();
      this.TableAdapter.Update(this.DataSet.Tabelle);

      Kann ich auch noch irgendwie eine Spalte manuell einen Wert zu weisen? Hier geht es um die Spalte die den Username enthalten soll, damit man sieht wer den Datensatz angelegt hat, wäre ja dumm wenn das der User selber eintragen müsste :-)
      Zuletzt editiert von Deeplink; 18.06.2007, 08:12.

      Comment


      • #4
        Hallo,

        Kann ich auch noch irgendwie eine Spalte manuell einen Wert zu weisen?
        Selbstverständlich, wobei die partielle Klasse des TableAdapter die "richtige" Stelle wäre:

        Code:
        namespace TableAdapterCS_DAL
        {
            partial class DataSetUsrTbl
            {
            }
        }
        
        
        namespace TableAdapterCS_DAL.DataSetUsrTblTableAdapters
        {
            public partial class UsrTblTableAdapter
            {
                public int Update(DataSetUsrTbl.UsrTblDataTable dataTable, string userName)
                {
                    if (userName.Length == 0)
                        userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 
                    this.Adapter.InsertCommand.Parameters["@benutzer"].Value = userName;
                    this.Adapter.UpdateCommand.Parameters["@benutzer"].Value = userName;
                    return this.Update(dataTable);
                }
            }
        }
        Allerdings, wird die 2te Tabelle im Join nicht gespeichert...
        Das ist ja auch der Sinn der Sache. Ein TableAdapter verpackt eine Tabelle, so dass bei einem Master-/Detail-Update immer 2 TableAdapter im Spiel sind. Anstelle des JOIN in der SELECT-Afrage mischt das DataSet über eine Expression (siehe Abbildung) die gewünschten Informationen aus der anderen Tabelle dazu.
        Attached Files

        Comment


        • #5
          Moin,

          hm, bei mir sind das mit dem DataSet ein wenig anders aus, im Anhang mal ein Screen. Bei mir steht in dem Expression Field nichts drin.

          Ich bin wie folgt vorgegangen:

          Ich habe die beiden Tabellen THauptkontoDetail und TDetailPoolingHandelVerguetung zu dem Dataset hinzugefügt. Anschließend habe ich dann den Select Command des THauptkontoDetailTableAdapter angepasst und dort die Tabelle TDetailPoolingHandelVergueting per Join hinzugefügt. Die anschließende Frage nach dem Anpassen der Update und Insert Commands habe ich mit Nein beantwortet.

          Die beiden Tabellen werden auch schön angezeigt, nur wenn ich nun einen Datensatz hinzufüge oder ändere werden nur die Spalten in der Tabelle THauptkontoDetail gespeichert, allerdings nicht die in der Tabelle TDetailPoolingHandelVerguetung. Ich war doch genau wie beschrieben vorgegangen oder nicht? ^^

          Gruß
          Deep

          Edit:
          this.tHauptkontoDetailTableAdapter.InsertCommand.P aramters["@user_created"].Value = userName;

          Funktioniert bei mir leider nicht da folgender Fehler kommt:

          HauptkontoUebersichtDataSetTableAdapters.THauptkon toDetailTableAdapter" enthält keine Definition für "InsertCommand".

          Wenn ich dem TableAdapter im Designer öffner ist der InsertCommand da aber definiert.
          Attached Files
          Zuletzt editiert von Deeplink; 19.06.2007, 09:57.

          Comment

          Working...
          X