Announcement

Collapse
No announcement yet.

Kein Update der Daten in einer Relation

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

  • Kein Update der Daten in einer Relation

    Hallo Leute,

    ich habe eine Applikation mit einer Form und einem DataSet. Auf dem DataSet befinden sich 2 verknüpfte Tabellen (1:n), das heißt es gibt noch eine Relation-Objekt. Die Daten der ersten Tabelle werden auf der Form in einem Grid dargestellt, das ist soweit ok. Jetzt möchte ich die Daten der 2. Tabelle in Textboxen darstellen, abhängig vom ausgewählten Datensatz im Grid, das ist auch soweit ok. Ich habe dabei die Textbox mit der Relation verbunden. Jetzt aber mein Problem wenn ich Daten in der Textbox ändere und dann ein DataAdapter.Update mache kommen die geänderten Daten nie in der Datenbank an. Ich habe jetzt vor dem Update das DataSet mal als XML (incl. DiffGram) gespeichert und siehe da, die geänderten Daten standen in der Tabelle aber der Datensatz war nicht als modifiziert gekennzeichnet (logisch, dass das Update die geänderten Daten nicht erkennt)
    Meine Frage wäre nun, wie ich die geänderten Daten in die Datenbank bekomme?

    cu Enrico

  • #2
    Hallo Leute,

    hat denn keiner eine Idee, vielleicht kann mir ja jemand wenigstens sagen, dass das Szenario bei ihm funktioniert.

    cu Enric

    Comment


    • #3
      Hallo,

      >...kommen die geänderten Daten nie in der Datenbank an.

      Bei dem folgenden Demo-Programm tritt das Problem <b>nicht</b> auf, dort wird die in der TextBox vorgenommene Änderung gespeichert:

      A) Vorbereitung in der MS SQL Server-Datenbank tempdb
      <pre>
      USE tempdb
      <b>GO</b>
      <br>
      <b>CREATE</b> <b>TABLE</b> MASTERTBL
      (
      m_id <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>IDENTITY</b> <b>PRIMARY</b> <b>KEY</b>,
      wert <b>VARCHAR</b>(9) <b>NOT</b> <b>NULL</b>
      )
      <b>GO</b>
      <br>
      <b>CREATE</b> <b>TABLE</b> DETAILTBL
      (
      d_id <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>IDENTITY</b> <b>PRIMARY</b> <b>KEY</b>,
      m_id <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>REFERENCES</b> MASTERTBL(m_id),
      detail <b>VARCHAR</b>(9) <b>NOT</b> <b>NULL</b>
      )
      <b>GO</b>
      <br>
      <b>INSERT</b> <b>INTO</b> MASTERTBL (wert) <b>VALUES</b> (<font color="#9933CC">'Master 1'</font>)
      <b>INSERT</b> <b>INTO</b> MASTERTBL (wert) <b>VALUES</b> (<font color="#9933CC">'Master 2'</font>)
      <b>INSERT</b> <b>INTO</b> MASTERTBL (wert) <b>VALUES</b> (<font color="#9933CC">'Master 3'</font>)
      <b>GO</b>
      <br>
      <b>INSERT</b> <b>INTO</b> DETAILTBL (m_id,detail) <b>VALUES</b> (1,<font color="#9933CC">'D1.1'</font>)
      <b>INSERT</b> <b>INTO</b> DETAILTBL (m_id,detail) <b>VALUES</b> (1,<font color="#9933CC">'D1.2'</font>)
      <b>INSERT</b> <b>INTO</b> DETAILTBL (m_id,detail) <b>VALUES</b> (1,<font color="#9933CC">'D1.3'</font>)
      <b>INSERT</b> <b>INTO</b> DETAILTBL (m_id,detail) <b>VALUES</b> (2,<font color="#9933CC">'D2.1'</font>)
      <b>INSERT</b> <b>INTO</b> DETAILTBL (m_id,detail) <b>VALUES</b> (2,<font color="#9933CC">'D2.2'</font>)
      <b>INSERT</b> <b>INTO</b> DETAILTBL (m_id,detail) <b>VALUES</b> (3,<font color="#9933CC">'D2.3'</font>)
      <b>GO</b>
      </pre>
      B) VS.NET 2003: Windows Forms-Anwendung
      <br>
      <br>
      a) Relation zwischen den Tabellen über den XML-Schema-Designer herstellen <br>
      b) Konfiguration im Eigenschafts-Editor:
      <pre>
      ...
      <font color="#003399"><i>// </i></font>
      <font color="#003399"><i>// dataViewMaster</i></font>
      <font color="#003399"><i>// </i></font>
      <b>this</b>.dataViewMaster.Table = <b>this</b>.dataSet11.MASTERTBL;
      <font color="#003399"><i>// </i></font>
      <font color="#003399"><i>// dataGrid1</i></font>
      <font color="#003399"><i>// </i></font>
      <b>this</b>.dataGrid1.DataMember = <font color="#9933CC">&quot;&quot;</font>;
      <b>this</b>.dataGrid1.DataSource = <b>this</b>.dataViewMaster;
      <b>this</b>.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
      <b>this</b>.dataGrid1.Location = <b>new</b> System.Drawing.Point(8, 8);
      <b>this</b>.dataGrid1.Name = <font color="#9933CC">&quot;dataGrid1&quot;</font>;
      <b>this</b>.dataGrid1.PreferredColumnWidth = 100;
      <b>this</b>.dataGrid1.Size = <b>new</b> System.Drawing.Size(296, 128);
      <b>this</b>.dataGrid1.TabIndex = 0;
      <font color="#003399"><i>// </i></font>
      <font color="#003399"><i>// textBox1</i></font>
      <font color="#003399"><i>// </i></font>
      <b>this</b>.textBox1.DataBindings.Add(<b>new</b> System.Windows.Forms.Binding(<font color="#9933CC">&quot;Text&quot;</font>,
      <b>this</b>.dataViewMaster, <font color="#9933CC">&quot;MASTERTBLDETAILTBL.detail&qu ot;</font>));
      <b>this</b>.textBox1.Location = <b>new</b> System.Drawing.Point(336, 64);
      <b>this</b>.textBox1.Name = <font color="#9933CC">&quot;textBox1&quot;</font>;
      <b>this</b>.textBox1.TabIndex = 2;
      <b>this</b>.textBox1.Text = <font color="#9933CC">&quot;textBox1&quot;</font>;
      <font color="#003399"><i>// </i></font>
      ...
      </pre>
      c) Aufrufen:
      <pre>
      <b>private</b> <b>void</b> buttonFill_Click(<b>object</b> sender, System.EventArgs e)
      {
      sqlConnection1.Open();
      <b>try</b>
      {
      dataSet11.EnforceConstraints = <b>false</b>;
      sqlDataAdapter2.Fill(dataSet11, dataSet11.MASTERTBL.TableName);
      sqlDataAdapter1.Fill(dataSet11, dataSet11.DETAILTBL.TableName);
      dataSet11.EnforceConstraints = <b>true</b>;
      }
      <b>finally</b>
      {
      sqlConnection1.Close();
      }
      }
      <br>
      <b>private</b> <b>void</b> buttonNext_Click(<b>object</b> sender, System.EventArgs e)
      {
      textBox1.DataBindings[<font color="#9933CC">&quot;Text&quot;</font>].BindingManagerBase.Position++;
      }
      <br>
      <b>private</b> <b>void</b> buttonUpdate_Click(<b>object</b> sender, System.EventArgs e)
      {
      textBox1.DataBindings[<font color="#9933CC">&quot;Text&quot;</font>].BindingManagerBase.EndCurrentEdit();
      sqlConnection1.Open();
      <b>try</b>
      {
      sqlDataAdapter2.Update(dataSet11, dataSet11.MASTERTBL.TableName);
      sqlDataAdapter1.Update(dataSet11, dataSet11.DETAILTBL.TableName);
      }
      <b>finally</b>
      {
      sqlConnection1.Close();
      }
      </pre>
      ADO.NET definiert genaue Regeln, zu welchen Zeitpunkten ein Wert aus der Benutzeroberfläche (angebundenes Control) in die DataSet-Ergebnismenge übernommen wird. Der Aufruf von <b>EndCurrentEdit</b> stellt sicher, dass diere Regeln garantiert eingehalten werden

      Comment


      • #4
        Hallo Herr Kosch,
        vielen Dank für das ausführliche Beispiel, es hat mir sehr geholfen und nun funktioniert die Sache auch. Eine Frage hätte ich aber trotzdem noch, warum setzen sie das DataView ein? Es würde doch auch gehen das DataGrid direkt an das DataSet zu binden. Gibt es da Nachteile, wenn man so vorgeht?

        viele Grüße
        Enrico Schuber

        Comment


        • #5
          Hallo,

          &gt;...warum setzen sie das DataView ein?

          nun ja, eigentlich gehört das DataView rein technisch gesehen immer dort hin. Das die "Abkürzung" ohne DataView auch geht, bedeutet ja nicht, dass man auf die Fähigkeiten des DataViews freiwillig verzichten sollte ;-)

          Allein die DataView-Eigenschaften <b>AllowDelete</b>, <b>AllowEdit</B>, <b>AllowNew</b> und <b>AddNew</b> sind in der Praxis sehr bequem. Dazu kommen dann noch die Methoden <b>Find</b>, <b>FindRows</b>, <b>Select</b> und <b>RowFilter</b>, die so ziemlich alle Anwendungsfälle abdecken

          Comment

          Working...
          X