DataGridView Updaten mit C# und MySQL

shel

Grünschnabel
Hallo zusammen,

habe in "Microsoft Visual C# 2008 Express Edition" ein DataGridView, in welchem ich Werte von einer MySQL-Datenbank (per ODBC) anzeigen lassen kann. Funktioniert. (siehe Code-Snippet unten...)

Nun möchte ich in diesem Formular per btn_update(_Click) Änderungen, welche ich im DataGridView mache, in der Datenbank (MySQL) in der entsprechenden Tabelle updaten. Habe schon verschiedene Foren und Howtos durchstöbert aber konnte es leider noch nicht zum Laufen bringen. Habe daher den Code in "btn_update_Click" wieder deletet.

Kann mir hier jemand weiterhelfen?

Besten Dank

shel



************************



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Data.Common;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.ProviderBase;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace dgv_Update
{
public partial class Form1 : Form
{
private System.Data.Odbc.OdbcCommand OdbcCom;
private string ConStr;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
ConStr = "DRIVER={MySQL ODBC 5.1 Driver};SERVER="
+ "127.0.0.1"
+ ";PORT="
+ "3306"
+ ";DATABASE="
+ "db_People"
+ ";UID="
+ "root"
+ ";PWD="
+ ""
+ ";OPTION=3";
OdbcConnection Conn = new OdbcConnection(ConStr);
Conn.Open();
OdbcCom = Conn.CreateCommand();

string SelectQuery = "SELECT * FROM tbl_Place";

OdbcDataAdapter DA = new OdbcDataAdapter(SelectQuery, Conn);

DataSet DS = new DataSet();

DA.Fill(DS, "MyTable");

BindingSource bindingSource1 = new BindingSource();
bindingSource1.DataSource = DS.Tables[0];

BindingNavigator bindingNavigator1 = new BindingNavigator();

bindingNavigator1.BindingSource = bindingSource1;

dataGridView1.DataSource = bindingSource1.DataSource;
}

private void btn_update_Click(object sender, EventArgs e)
{
//Code, um die gemachten Änderungen im DataGridView1 in der MySQL-Tabelle upzudaten
}

}
}
 
Schau dir mal die Hilfe des OdbcDataAdapters an.
Dieser hat noch drei Eigenschaften für InsertCommand, UpdateCommand und DeleteCommand.
Dort kannst du die entsprechenden SQL Statments setzen.

Anschliessend per OdbcDataAdapter.update die Daten zurück in die Datenbank schreiben.

Das Dataset oder die Datatable verwaltet selbstständig die vorgenommenen Änderungen.
Mit .GetChanges kannst du zum Beispiel die Änderungen manuell abrufen.
 
Hallo mage,

besten Dank für deine Tipps.
Habe nun den Code im btn_update(_Click) mit folgenden beiden Zeilen erweitert:

bindingSource1.EndEdit();
DA.Update(DS, "MyTable");

Jedoch leider immer noch ohne Erfolg. Erhalte jedoch keine Syntaxfehler, das Programm kann aber die Änderungen im DataGridView einfach immer noch nicht in der Datenbank machen!

Kannst du mir allenfalls nochmals bitte helfen.

Besten Dank

shel
 
Nur das Update aufzurufen reicht nicht aus.
Das Programm muss auch wissen, wie es die Daten abgleichen kann.

Dazu müssen die Commands-SQL Strings gesetzt werden, Da.InsertCommand, Da.UpdateCommand und DA.DeleteCommand.

Ggf. reicht es aus diese automatisch erzeugen zu lassen.
Hierbei ist es aber zwinged erforderlich, dass die Spaltebezeichnungen mit der in der DB Übereinstimmen.

OleDbCommandBuilder builder = new OleDbCommandBuilder(DA);
 
Hallo mage,

habe deine Code-Teile versucht in meinem Code einzubauen. Jedoch leider immer noch ohne Erfolg. Syntax-Fehler, fehlende Parameter, ...

Kannst du bitte deine gemachten Angaben direkt in meinem (gesamten) Code einbauen. So müsste es dann funktionieren. Denn ich weiss auch nicht genau, wo ich deine Code-Teile in meinem Projekt exakt einbauen muss?

Besten Dank

shel
 
Hallo mage,

diese Site habe ich schon mehrmals besucht und ausgetestet.

Ich möchte nicht nur einen Record auf einmal updaten sondern alle gemachten Änderungen (also meistens mehrere Zeilen und Zellen) im DataGridView1 auf einmal in der Datenbank (Tabelle) ändern per btn_update.

Kannst du mir hier nochmal bitte weiterhelfen.

Gruss

shel
 
Der DataAdapter geht beim Update alle Zeilen in der Datatable durch und prüft ob Änderungen vorgenommen wurden (row.RowState).
Wurde eine Änderung festgestellt überträgt er diese in die Datenbank.
Vorraussetzung dafür ist, er muss wissen wie die Änderungen zu übertragen sind.

Es gibt drei Verschiedene Möglichkeiten:
-Zeile ist Neu -> Zeile muss angefügt werden (Insert) -> benötigt DataAdapter.InsertCommand
-Zeile wurde geändert -> Zeile muss aktualisiert werden (Update) -> benötigt DataAdapter.UpdateCommand
- Zeile wurde gelöscht -> Zeile muss gelöscht werden (Delete) -> DataAdapter.DeleteCommand

Damit der DataAdapter dies kann musst du die entsprechendend Commands setzen.

In diesem Buchartikel ist alles ganz ausführlich erklärt:
http://openbook.galileocomputing.de/visual_csharp/visual_csharp_29_002.htm
Vielleicht hilft es dir für das Verständnis auch die vorhergehenden Kaptiel zu lesen.

Leider kann ich dir nicht weiter helfen ohne deine Datanbankstruktur zu kennen, ausserdem kenne ich mich mit mysql leidig wenig aus, da ich mit dem MS Sql Server arbeite. Die Konzepte sind aber recht ähnlich.
 
Hallo mage

hier der SQL-Code, um zuerst die Datenbank und dann die Tabelle in MySQL zu erstellen:

CREATE DATABASE 'db_People';
USE 'db_People';

CREATE TABLE 'tbl_Place' (
'id_Place' INT(11) NOT NULL AUTO_INCREMENT,
'NP' INT(11) NOT NULL,
'Name_Place' VARCHAR(45) NOT NULL,
PRIMARY KEY ('id_Place')
);

Wenn du mit dem den Code in btn_update(_Click) zusammenbringt, ist das ideal.

Zwischenzeitlich werde ich deine Tipps im Buch Galileo-Computing studieren bzw. testen.

Gruss

shel
 

Neue Beiträge

Zurück