Announcement

Collapse
No announcement yet.

Eingegeben Daten im DataGrid an Datenbank übermitteln

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

  • Eingegeben Daten im DataGrid an Datenbank übermitteln

    Hallo,

    ich versuche verzweifelt den User Daten in ein Datagrid (das Hinzufügen von Daten habe ich erlaubt) eingeben zu lassen und diese zu speichern. Leider habe ich keinen Anhaltspunkt wie ich dies realisieren könnte. Ich hoffe jemand kann mir helfen und eventuell einen Beispielcode zur Verfügung stellen.
    Zu Testzwecken habe ich mein Programm selbst Daten in die datenbank schreiben lassen. Das funktioniert auch...

    using (SqlConnection connection = new SqlConnection(obj_connection.connection.Connection String))
    {
    connection.Open();

    SqlCommand command = connection.CreateCommand();
    SqlTransaction transaction;

    transaction = connection.BeginTransaction("SampleTransaction");

    command.Connection = connection;
    command.Transaction = transaction;

    command.CommandText = "INSERT INTO [buchholz] ([auftr_nr], [datum], [name_1]) VALUES (1, '01.02.2006', 'test1')";
    command.ExecuteNonQuery();
    transaction.Commit();
    }

  • #2
    Hallo,
    für das Zurückschreiben der Änderungen am DataSet (mit dem das DataGrid verbunden ist) ist der SqlDataAdapter zuständig. Wenn ein Datensatz geändert oder hinzugefügt wird, speichert das DataSet dies in einem Zustandfeld. Sobald die Methode <b>Update</b> des SqlDataAdapter aufgerufen wird, liest dieser alle Zustandsdaten aus, um dann je vorgefundenen Wert die konfigurierte interne SqlCommand-Instanz aufzurufen: <br>
    a) DataRowState.Added = InsertCommand vom DataAdapter <br>
    b) DataRowState.Deleted = DeleteCommand vom DataAdapter <br>
    c) DataRowState.Modified = UpdateCommand vom DataAdapter
    <code>
    SqlDataAdapterMaster.Update(dataSetMasterDetail1, "Master");
    SqlDataAdapterDetail.Update(dataSetMasterDetail1, "Detail");
    </code>
    Wenn der <i>Wizard</i> vom SqlDataAdapter innerhalb von Visual Studio aufgerufen wird, kümmert er sich in der Regel automatisch um alle Details. Allerdings gibt es je nach den in der Tabelle verwendeten Datentypen Sonderfälle, bei denen von Hand nachkorrigiert werden muss

    Comment


    • #3
      Hi...
      danke für die Antwort, ich hab zwar etwas länger gebraucht das zu verstehen (wenn ich es überhaupt schon vollständig verstenden hab).
      Mal aber noch ne Frage...nach langen hin und her suchen im I-Net hab ich eine Lösung gefunden:

      SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM buchholz", obj_connection.connection);
      SqlCommandBuilder sqlcb = new SqlCommandBuilder(adapter);

      if (ds_903_test.HasChanges() == true)
      {
      adapter.InsertCommand = sqlcb.GetInsertCommand();
      adapter.DeleteCommand = sqlcb.GetDeleteCommand();
      adapter.UpdateCommand = sqlcb.GetUpdateCommand();
      try
      {
      adapter.Update(ds_903_test.Tables["buchholz"]);
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.ToString());
      }
      dgv_Tabellen.Refresh();
      }

      Wo bestehen da die Vor-, bzw. Nachteile...??? Wenn du mir das noch erläutern könntest wäre ich dir sehr dankbar.

      Dann hab ich noch hoffentlich ein kleines Problem,

      ich habe eine Methode, die immer dann auftritt, wenn sich in meiner Combobox der Tabellennamen (in diesem Fall ist nur eine Tabelle vorhanden) ändert
      Quasi die:

      private void DatenbankTabelleIndexChange()
      {
      string s_query = "";
      tb_Sort.Text = "";

      s_query = "SELECT * FROM buchholz";
      SqlDataAdapter adapter = new SqlDataAdapter(s_query, obj_connection.connection);
      adapter.Fill(ds_903_test, "buchholz");
      dgv_Tabellen.DataSource = ds_903_test;
      dgv_Tabellen.DataMember = "buchholz";

      }

      Jetzt hab ich das Problem, dass er mir immer die Tabelle an der vorherigen Tabelle anhängt und die andere nicht löscht (in diesem Fall hab ich dann 2mal die Tabelle buchholz untereinander)...ich hab es schon mit refresh() und update() probiert. Entweder ich rufe die Methiden an der falschen stelle auf, oder es sind die falschen Methoden...leider habe ich dafür noch keine Lösung gefunden.

      Für jeden tollen Vorschlag bin ich gern zu haben *fg* danke.

      Gruss eure noch "unwissende" Stefi

      Comment


      • #4
        Hallo,
        der <i>SqlCommandBuilder</i> gehört in den "Gift-Schrank", da dort jedes Mal beim Aufruf die INSERT-, UPDATE- und DELETE-SQLs basierend auf der SELECT-Abfrage neu generiert werden. Dazu müssen die System-Tabellen der Datenbank abgefragt werden, was in der Regel zu einer nicht vernachlässigbaren Last führt. Viel besser ist es, die SQLs (genauer gesagt die internen SqlCommand-Instanzen) des SqlDataAdapters <b>einmalig</b> zur Entwicklungszeit vom Wizard des SqlDataAdapters zusammenstellen zu lassen. Dies hat den Vorteil, dass zur Laufzeit die SQLs sofort ausgeführt werden können. Außerdem baut Visual Studio dabei auch gleich ein <i>typisiertes DataSet</i> zusammen, so dass alle Tabellen und Spalten als Eigenschaften der automatisch generierten Hilfsklasse verfügbar sind (so dass auch IntelliSense diese beim Eintippen zur Auswahl anbietet).
        <br>
        &gt;..und die andere nicht löscht ..
        In diesem Fall muss vor dem erneuten Fill-Aufruf die DataSet-Instanz entweder über die Methode <b>Clear</b> vollständig gelöscht werden oder die konkrete (alte) DataTable-Instanz muss aus der <i>Tables</i>-Kollektion des DataSets entfernt werden

        Comment


        • #5
          Hi Andreas,

          dank dir für deine Hilfe...jetzt hab ich das soweit auch verstanden.
          Genauso wie das löschen der bereits vorhandenen Tabelle im DataGridView...

          Gruss Stefi

          Comment

          Working...
          X