Laden...

Daten aus Datagridview wieder in Access speichern

Erstellt von Nö61 vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.237 Views
N
Nö61 Themenstarter:in
3 Beiträge seit 2016
vor 8 Jahren
Daten aus Datagridview wieder in Access speichern

Hallo Zusammen

Ich lade mit folgendem Code eine Tabelle aus Access in ein Datagridview. Funktioniert gut.


public partial class Form1 : Form
    {
        private OleDbConnection con = new OleDbConnection();
        public DataTable dt = new DataTable();

        public Form1()
        {
            InitializeComponent();
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source = C:\\Users\\Niederhuber\\Documents\\Visual Studio 2013\\Projects\\Sportdiary\\Sporttagebuch_2016.accdb";
        }



   private void btnLaden_Click(object sender, EventArgs e)
        {
            try
            {
                //Verbindung mit DB herstellen
                con.Open();
                OleDbCommand comand = new OleDbCommand();
                comand.Connection = con;
                string query = "Select * from Sporttagebuch_new";
                comand.CommandText = query;

                OleDbDataAdapter da = new OleDbDataAdapter(comand);
                DataTable dt = new DataTable();
                da.Fill(dt);
                dgv.DataSource = dt;
                               
                // Verbindung beenden
                con.Close();

            }
            catch (Exception ex)
                {
                    MessageBox.Show("Error "+ ex);
                }
        }


Nachdem ich dann eine oder mehrere neue Zeilen in das DGV eingeben habe will ich den Inhalt des DGV wieder in der Access DB speichern. Das gelingt mir nicht. Ich bin totaler Anfänger (deshalb auch in diesem Forum) . Wäre gut für mich wenn die Lösungsvorschläge gut erläutert wären, damit ich sie dann auch verstehe 😃.

Danke schon mal im voraus für Eure Bemühungen

S
324 Beiträge seit 2007
vor 8 Jahren

Dazu müssten wir erst einmal wissen wie du das Speichern versuchst und welche Fehler du dabei bekommst.
In dem Code den du gepostet hast, kann man nur sehen wie du das Laden versuchst, jedoch nichts was mit dem Speichern zu tun hat.

Andere Frage zum Thema: Muss es zwingend Access sein?

1.696 Beiträge seit 2006
vor 8 Jahren

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

N
Nö61 Themenstarter:in
3 Beiträge seit 2016
vor 8 Jahren

Hallo
Danke erst mal für deine Antwort.
Wie gesagt blutiger Anfänger, deshalb einfach mal Access genommen da keine Ahnung keine Erfahrung. Hab aber jetzt schon festgestellt dass ich da wohl nich die leichteste Variante gewählt hab.
Nun das füllen des DGV aus der Access hat ja dann auch funktioniert. Nur das speicher, insert, updaten wie auch immer scheint nicht so einfach zu sein. Ich schick dir jetzt einfach den Code bzw das gestümpere das ich da so probiert hab. Klar ich hab nicht verstanden was ich das so rumprobiert hab. Ist für den Anfang nicht so das richtige.
Aber vielleicht kannst du mir ja helfen, gäbe ja dann noch ein paar einfachere Dinge mit der man dann erweitern könnte.


  private void btnsave_Click(object sender, EventArgs e)
        {
           

            try
            {
                //Verbindung mit DB herstellen
                con.Open();
               OleDbCommand comand = new OleDbCommand();
                comand.Connection = con;
                string query = "insert into * Sporttagebuch_new";
                comand.CommandText = query;
              
                string query = dt;
                comand.CommandText = query;
                OleDbDataAdapter adapter = new OleDbDataAdapter();
                adapter.InsertCommand = new OleDbCommand(dt);
                OleDbCommandBuilder custCB = new OleDbCommandBuilder(adapter);
                adapter.InsertCommand(dt);
                 
              
                // Verbindung beenden
              
                con.Close();

            }
            catch (Exception ex)
            {
                MessageBox.Show("Error " + ex);



Gruß....

S
324 Beiträge seit 2007
vor 8 Jahren

Ohne jetzt selbst im kopf zu haben wie ADO.NET mit OLEDB richtig benutzt wird sehe ich auf jeden Fall das sein INSERT Statement so nicht funktionieren kann:

insert into * Sporttagebuch_new

gibt es so nicht - und Sternchen in den Statements sollte man sowieso grundsätzlich immer vermeiden 😉

Korrekt ist die Syntax wie folgt (abhängig vom verwendeten RDBMS):

INSERT INTO [TABELLE] (FELD1,FELD2,FELD3) VALUES ('wert1','wert2','wert3')

Wobei man die Werte aufgrund von SQL Injection aber auch nicht direkt in das Statement mit reinschreiben sollte, sondern auf SQL-Parameter zurückgreifen soll.
[Artikelserie] SQL: Parameter von Befehlen

Eine Sinnvolle alternative zu Access wäre z.b. SQLite welches du auch mit dem Entity Framework nutzen kannst, welches dir einen Objektorientierten Zugriff auf die Datenbank ermöglicht.
Für kleinere Projekte nutze ich in letzter zeit auch diese lib: https://github.com/praeclarum/sqlite-net
Wäre für dich am Anfang vielleicht gar nicht so schlecht - schau dir dort mal die Beispiele an 😃

Mein Azubi hat damals als er neu anfing viel NDatabase (http://ndatabase.wix.com/home) benutzt - dort war der zugriff auch sehr einfach - aber das Format der DB ist kein Standard wie SQLite, von daher kann man die Daten außerhalb seiner eigenen Anwendung nur mit LinqPad anschauen 😕

N
Nö61 Themenstarter:in
3 Beiträge seit 2016
vor 8 Jahren

Hab doch noch eine Möglichkeit gefunden in Access. Und Danke für die Tipps,werde ich mir anschauen.
So funktioniert es jetzt mit Access:



       private void btnNew_Click(object sender, EventArgs e)
        {
            try
            {
                panel.Enabled =true;
                txtDatum.Focus();
                this.appData.DB_Sportdiary_2016.AddDB_Sportdiary_2016Row(this.appData.DB_Sportdiary_2016.NewDB_Sportdiary_2016Row());
                dBSportdiary2016BindingSource.MoveLast();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                dBSportdiary2016BindingSource.ResetBindings(false);
            }
        }
        // ausgewählte Zeile editieren
        private void btnEdit_Click(object sender, EventArgs e)
        {
            panel.Enabled = (true);
            txtDatum.Focus();

        }
        //Zeile aus Db löschen
        private void btnCancel_Click(object sender, EventArgs e)
        {
            panel.Enabled = false;
            dBSportdiary2016BindingSource.ResetBindings(false);
            if( MessageBox.Show("Sind Sie sicher dass sie diesen Eintrag löschen wollen?", " Message", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                dBSportdiary2016BindingSource.RemoveCurrent();

        }
        //Zeile in DB speichern
        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                dBSportdiary2016BindingSource.EndEdit();
                dB_Sportdiary_2016TableAdapter.Update(this.appData.DB_Sportdiary_2016);
                panel.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                dBSportdiary2016BindingSource.ResetBindings(false);
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: Diese Codezeile lädt Daten in die Tabelle "appData.DB_Sportdiary_2016". Sie können sie bei Bedarf verschieben oder entfernen.
            this.dB_Sportdiary_2016TableAdapter.Fill(this.appData.DB_Sportdiary_2016);
            dBSportdiary2016BindingSource.DataSource = this.appData.DB_Sportdiary_2016;
            panel.Enabled = true;


Gruß