Laden...

Insert-Statement wird nicht in Accessdatenbank geschrieben

Erstellt von cSharpJunior vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.759 Views
C
cSharpJunior Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren
Insert-Statement wird nicht in Accessdatenbank geschrieben

Hi @ all,

ich mach grade eine Application in C# mit einer Access 2003 Datenbank und OleDb.

Die selects funktionieren super die inserts und updates dafür garnicht

Hier der select code:


            sqlStatement = "SELECT * FROM Tabelle1";
            connectionString = new OleDbConnection(pathToDatabase);
            connectionString.Open();
            dataAdapter = new OleDbDataAdapter();
            dataAdapter.SelectCommand = connectionString.CreateCommand();
            dataAdapter.SelectCommand.CommandText = sqlStatement;
            connectionString.Close();

Und hier der insert (update ist so gut wie identisch)


            sqlStatement = ""INSERT INTO Ausbilder ( Name, Vorname, Geburtsdatum, Date1, Date2, Gliederung, Telefon, Mobil, Email, Strasse, Hausnummer, Plz, Ort ) VALUES ('" + txtNameGrid.Text + "','" + txtVornameGrid.Text + "','" + dateTimeGeburtstagGrid.Text.ToString() + "','" + dateTimeBGLehrscheinGrid.Text.ToString() + "','" + dateTimeDrkLehrscheinGrid.Text +"','" + txtGliederungGrid.Text + "','" + txtTelefonGrid.Text + "','" + txtMobilGrid.Text + "','" + txtEmailGrid.Text + "','" + txtStrasseGrid.Text + "','" + txtHausnummerGrid.Text + "','" + txtPlzGrid.Text + "','" + txtOrtGrid.Text + "');");
            connectionString = new OleDbConnection(pathToDatabase);
            connectionString.Open();
            dataAdapter = new OleDbDataAdapter();
            dataAdapter.InsertCommand = connectionString.CreateCommand();
            dataAdapter.InsertCommand.CommandText = sqlStatement;
            connectionString.Close();

Das SQL-Command wir aus der Variable sqlStatement gelesen, in der Datenbank passiert bei insert und update jedoch garnix.

Das SQL-Command ist auch richtig formuliert, da wenn ich es direkt in Access ausführ wird es in die Datenbank geschrieben.

Weiß einer von euch eine Lösung?

L
416 Beiträge seit 2008
vor 12 Jahren

Der User den du zum connecten benutzt hat die Rechte für INSERT und UPDATE?

Generell: [Artikelserie] Parameter von SQL Befehlen

2.891 Beiträge seit 2004
vor 12 Jahren

Warum benennst du die OleDbConnection "connectionString"???
An welcher Stelle wird der Command ausgeführt? Denn in deinem geposteten Code definierst/konfigurierst du ja nur.

C
cSharpJunior Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

Der User den du zum connecten benutzt hat die Rechte für INSERT und UPDATE?

Generell:
>

Es ist garkein User definiert...
Ich hab auch noch keine Accessposts gefunden wo User und Passwort (natürlich gegen *** oder so ersetzt) definiert wurden...

Was meinst du mit Parameter von SQL Befehlen? Das Statement tut doch halt nicht aus der Anwendung sondern nur direkt im SQL Editor der Datenbank

C
cSharpJunior Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

An welcher Stelle wird der Command ausgeführt? Denn in deinem geposteten Code definierst/konfigurierst du ja nur.

An verschiedensten Stellen. Ich versteh deine Frage danach nicht ganz.

Der gepostete Code ist eigentlich in einer Methode und die Methode wird wiederum in verschiedenen anderen Methoden gerufen. Als Übergabeparameter ist der jeweilige SQL Befehl als String mit dabei.

2.891 Beiträge seit 2004
vor 12 Jahren

An verschiedensten Stellen. Ich versteh deine Frage danach nicht ganz.

Du machst die Connection auf, definierst den SQL-Befehl und machst die Connection wieder zu. Im geposteten Code wird nirgendwo der SQL-Befehl wirklich ausgeführt (jedenfalls ist es für mich nicht offensichtlich).
Deshalb die Frage, wo das bei dir passiert.

Der Select-Befehl funktioniert auch so, wie du ihn gepostet hast? Musst du da nicht auch noch ein Fill ausführen, damit die Daten geholt werden?

C
cSharpJunior Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

An verschiedensten Stellen. Ich versteh deine Frage danach nicht ganz.
Du machst die Connection auf, definierst den SQL-Befehl und machst die Connection wieder zu. Im geposteten Code wird nirgendwo der SQL-Befehl wirklich ausgeführt (jedenfalls ist es für mich nicht offensichtlich).
Deshalb die Frage, wo das bei dir passiert.

Der Select-Befehl funktioniert auch so, wie du ihn gepostet hast? Musst du da nicht auch noch ein Fill ausführen, damit die Daten geholt werden?

Wird das Statement vom dataAdapter nicht ausgeführt?

Mit dem fill hast du schon recht.
Ich hab nach dem SELECT schon noch ein

dataAdapter.Fill(dataTable);

.
Aber der Fill ist ja nicht der Grund warum die Daten nicht in die Datenbank geschrieben werden.

2.891 Beiträge seit 2004
vor 12 Jahren

Mit dem fill hast du schon recht. Ich hab nach dem SELECT schon noch ein dataAdapter.Fill(dataTable);.
Aber der Fill ist ja nicht der Grund warum die Daten nicht in die Datenbank geschrieben werden.

Also erstens hast du somit nicht den kompletten relevanten Code gepostet. Dann brauchst du dich auch nicht wundern, wenn dir nicht richtig geholfen werden kann.
Zweitens brauchst du zum Ausführen vom Inser/Update einen entsprechenden Befehl äquivalent zum Fill beim Select. Hast du den nun oder nicht?

P.S.: Beachte bitte [Hinweis] Wie poste ich richtig? Punkt 2.3 (keine Full Quotes)

4.931 Beiträge seit 2008
vor 12 Jahren

Hallo,

du brauchst manuell gar keine INSERT bzw. UPDATE (und DELETE) - Commands erstellen.
Dies macht der DataAdapter automatisch, sobald du ein SELECT-Statement (SelectCommand) zugewiesen hast.
Nach Änderungen an der Tabelle (nachdem Fill() aufgerufen worden ist), einfach die DataAdapter.Update-Methode aufrufen.
Einzige Änderung wäre, daß du dann die DataAdapter-Variable als Member deiner Klasse anlegen solltest (anstatt lokal).

Generelles Stichwort dafür: DataBinding

C
cSharpJunior Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

du brauchst manuell gar keine INSERT bzw. UPDATE (und DELETE) - Commands erstellen.

D.h. ich mach alles mit

dataAdapter.Update(dataTable)

oder

dataAdapter.Insert(dataTable)

?

Generelles Stichwort dafür: DataBinding

Was passiert beim DataBinding? Werden die Daten an die dataTabels gebunden oder wo werden diese gebunden?

4.221 Beiträge seit 2005
vor 12 Jahren

Ein Schuss ins Blaue:

Verwendest Du vor dem Update/Insert allenfalls ein AcceptChanges auf der Tabelle oder dem DataSet ? Falls ja, dann nimm das raus... (typischer Anfängerfehler).

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

H
208 Beiträge seit 2008
vor 12 Jahren

Von mir noch ein anderer Schuß ins Blaue:
Ich lese nirgendwo etwas davon daß die "fehlgeschlagenen" Inserts und Updates irgendwelche Fehlermeldungen oder Exceptions auslösen.
D.h. es sieht so aus als ob alles funktioniert hat, die Daten sind danach nur nicht in der Datenbank zu finden.
Richtig?

Falls ja, könnte es sein daß das hier Dein Problem ist?
Datenbank wird nicht befüllt

C
cSharpJunior Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

Guten Morgen,

danke erstmal für die vielen Antworten.

@Programmierhans: Wenn die Methode AcceptChanges heißt mach ich das nicht. Ich verwende auch kein DataSet sondern ein DataTable

@haarrrgh: Dein Tipp wars leider auch nicht. Ich hab die DB zwar im Projektverzeichnis, aber dort wo die Files *.sln und *.suo liegen.

Hier nun nochmal mein ganzer Code ohne Abschnitte.
(Die Konstanten sind eigentlich mit Werten befüllt, die ich aber nicht posten möchte.)


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 accessToDatabase;
using System.Data.OleDb;

namespace ausbilderuebersicht
{
    public partial class From1 : Form
    {
        public From1()
        {
            InitializeComponent();
        }

        System.Data.DataTable dataTable = new System.Data.DataTable("Ausbilder");
        OleDbCommand commmandToDb;
        OleDbDataAdapter dataAdapter;
        OleDbConnection connectionString;
        SqlCommandBuilder commandBuilder;
        const string pathToDatabase = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=S:\src\ausbilderuebersicht\db1.mdb";
        const string gliederung1 = 
        const string gliederung2 = 
        const string gliederung3 = 
        const string gliederung4 = 
        const string gliederung5 = 
        const string gliederung6 = 
        const string gliederung7 = 
        const string gliederung8 = 
        const string gliederung9 = 
        const string gliederung10 =
        const string gliederung11 =
        const string lehrschein1 = 
        const string lehrschein2 = 
        const string lehrschein3 = 
        const string lehrschein4 = 
        const string lehrschein5 = 
        const string lehrschein6 = 
        const string lehrschein7 = 
        const string lehrschein8 = 
        const string lehrschein9 = 
        const string lehrschein10 =
        const string lehrschein11 =
        const string lehrschein12 =
        const string lehrschein13 =

        public int selectedRow = 0;

        private void Form1_Load(object sender, EventArgs e)
        {
            fillDropDownBoxes();
            customizeDataGridView1();
            access2Database("SELECT * FROM Ausbilder");
            fillDataTableAndSetColumnsVisibleFalse();
        }

        private void customizeDataGridView1()
        {
            DataColumn dgvName = new DataColumn("Name", System.Type.GetType("System.String"));
            DataColumn dgvVorname = new DataColumn("Vorname", System.Type.GetType("System.String"));
            DataColumn dgvGeburtsdatum = new DataColumn("Geburtsdatum", System.Type.GetType("System.DateTime"));
            DataColumn dgvBgLehrscheinBis = new DataColumn("BG Lehrschein bis", System.Type.GetType("System.DateTime"));
            DataColumn dgvLehrscheinBis = new DataColumn("Lehrschein bis", System.Type.GetType("System.DateTime"));
            DataColumn dgvGliederung = new DataColumn("Gliederung", System.Type.GetType("System.String"));
            DataColumn dgvTelefon = new DataColumn("Telefon", System.Type.GetType("System.String"));
            DataColumn dgvMobil = new DataColumn("Mobil", System.Type.GetType("System.String"));
            DataColumn dgvEmail = new DataColumn("Email", System.Type.GetType("System.String"));
            DataColumn dgvStrasse = new DataColumn("Strasse", System.Type.GetType("System.String"));
            DataColumn dgvHausnummer = new DataColumn("Hausnummer", System.Type.GetType("System.String"));
            DataColumn dgvPlz = new DataColumn("PLZ", System.Type.GetType("System.Int32"));
            DataColumn dgvOrt = new DataColumn("Ort", System.Type.GetType("System.String"));

            dataTable.Columns.Add(dgvName);
            dataTable.Columns.Add(dgvVorname);
            dataTable.Columns.Add(dgvGeburtsdatum);
            dataTable.Columns.Add(dgvBgLehrscheinBis);
            dataTable.Columns.Add(dgvLehrscheinBis);
            dataTable.Columns.Add(dgvGliederung);
            dataTable.Columns.Add(dgvTelefon);
            dataTable.Columns.Add(dgvMobil);
            dataTable.Columns.Add(dgvEmail);
            dataTable.Columns.Add(dgvStrasse);
            dataTable.Columns.Add(dgvHausnummer);
            dataTable.Columns.Add(dgvPlz);
            dataTable.Columns.Add(dgvOrt);

            dataGridView1.DataSource = dataTable;
            dataGridView1.Columns[0].Width = 110;
            dataGridView1.Columns[0].MinimumWidth = 100;
            dataGridView1.Columns[1].Width = 80;
            dataGridView1.Columns[1].MinimumWidth = 70;
            dataGridView1.Columns[2].Width = 80;
            dataGridView1.Columns[2].MinimumWidth = 70;
            dataGridView1.Columns[3].Width = 100;
            dataGridView1.Columns[3].MinimumWidth = 90;
            dataGridView1.Columns[4].Width = 110;
            dataGridView1.Columns[4].MinimumWidth = 100;
            dataGridView1.Columns[5].Width = 100;
            dataGridView1.Columns[5].MinimumWidth = 90;
            dataGridView1.Columns[6].Width = 90;
            dataGridView1.Columns[6].MinimumWidth = 80;
            dataGridView1.Columns[7].Width = 90;
            dataGridView1.Columns[7].MinimumWidth = 80;
            dataGridView1.Columns[8].Width = 160;
            dataGridView1.Columns[8].MinimumWidth = 140;
            dataGridView1.Columns[9].Width = 100;
            dataGridView1.Columns[9].MinimumWidth = 90;
            dataGridView1.Columns[10].Width = 75;
            dataGridView1.Columns[10].MinimumWidth = 65;
            dataGridView1.Columns[11].Width = 40;
            dataGridView1.Columns[11].MinimumWidth = 30;
            dataGridView1.Columns[12].Width = 100;
            dataGridView1.Columns[12].MinimumWidth = 90;
            dataGridView1.RowHeadersVisible = false;
            dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.ReadOnly = true;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        }

        private void fillDropDownBoxes()
        {
            cbGliederungT2.Items.Add(gliederung1);
            cbGliederungT2.Items.Add(gliederung2);
            cbGliederungT2.Items.Add(gliederung3);
            cbGliederungT2.Items.Add(gliederung4);
            cbGliederungT2.Items.Add(gliederung5);
            cbGliederungT2.Items.Add(gliederung6);
            cbGliederungT2.Items.Add(gliederung7);
            cbGliederungT2.Items.Add(gliederung8);
            cbGliederungT2.Items.Add(gliederung9);
            cbGliederungT2.Items.Add(gliederung10);
            cbGliederungT2.Items.Add(gliederung11);
            cbGliederungT2.SelectedItem = gliederung10;

            cbGliederungSucheName.Items.Add(gliederung1);
            cbGliederungSucheName.Items.Add(gliederung2);
            cbGliederungSucheName.Items.Add(gliederung3);
            cbGliederungSucheName.Items.Add(gliederung4);
            cbGliederungSucheName.Items.Add(gliederung5);
            cbGliederungSucheName.Items.Add(gliederung6);
            cbGliederungSucheName.Items.Add(gliederung7);
            cbGliederungSucheName.Items.Add(gliederung8);
            cbGliederungSucheName.Items.Add(gliederung9);
            cbGliederungSucheName.Items.Add(gliederung10);
            cbGliederungSucheName.Items.Add(gliederung11);
            cbGliederungSucheName.SelectedItem = gliederung10;

            cbLehrscheinT3.Items.Add(lehrschein1);
            cbLehrscheinT3.Items.Add(lehrschein2);
            cbLehrscheinT3.Items.Add(lehrschein3);
            cbLehrscheinT3.Items.Add(lehrschein4);
            cbLehrscheinT3.Items.Add(lehrschein5);
            cbLehrscheinT3.Items.Add(lehrschein6);
            cbLehrscheinT3.Items.Add(lehrschein7);
            cbLehrscheinT3.Items.Add(lehrschein8);
            cbLehrscheinT3.Items.Add(lehrschein9);
            cbLehrscheinT3.Items.Add(lehrschein10);
            cbLehrscheinT3.Items.Add(lehrschein11);
            cbLehrscheinT3.Items.Add(lehrschein12);
            cbLehrscheinT3.Items.Add(lehrschein13);
            cbLehrscheinT3.SelectedItem = lehrschein13;
        }

        public void access2Database(string sqlStatement)
        {
            connectionString = new OleDbConnection(pathToDatabase);
            connectionString.Open();
            //commmandToDb = new OleDbCommand(sqlStatement, connectionString);
            dataAdapter = new OleDbDataAdapter();
            dataAdapter.SelectCommand = connectionString.CreateCommand();
            dataAdapter.SelectCommand.CommandText = sqlStatement;
            connectionString.Close();
        }

        public void connectionToDatabase(string sqlStatement)
        {
            connectionString = new OleDbConnection(pathToDatabase);
            connectionString.Open();
            //commmandToDb = new OleDbCommand(sqlStatement, connectionString);
            dataAdapter = new OleDbDataAdapter();
            dataAdapter.InsertCommand = connectionString.CreateCommand();
            dataAdapter.InsertCommand.CommandText = sqlStatement;
            connectionString.Close();
        }


        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            selectedRow = Convert.ToInt32(dataGridView1.SelectedRows[0].Index);
            txtNameGrid.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
            txtVornameGrid.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
            dateTimeGeburtstagGrid.Value = Convert.ToDateTime(dataGridView1.CurrentRow.Cells[2].Value);
            dateTimeBGLehrscheinGrid.Value = Convert.ToDateTime(dataGridView1.CurrentRow.Cells[3].Value);
            dateTimeLehrscheinGrid.Value = Convert.ToDateTime(dataGridView1.CurrentRow.Cells[4].Value);
            txtGliederungGrid.Text = dataGridView1.CurrentRow.Cells[5].Value.ToString();
            txtTelefonGrid.Text = dataGridView1.CurrentRow.Cells[6].Value.ToString();
            txtMobilGrid.Text = dataGridView1.CurrentRow.Cells[7].Value.ToString();
            txtEmailGrid.Text = dataGridView1.CurrentRow.Cells[8].Value.ToString();
            txtStrasseGrid.Text = dataGridView1.CurrentRow.Cells[9].Value.ToString();
            txtHausnummerGrid.Text = dataGridView1.CurrentRow.Cells[10].Value.ToString();
            txtPlzGrid.Text = dataGridView1.CurrentRow.Cells[11].Value.ToString();
            txtOrtGrid.Text = dataGridView1.CurrentRow.Cells[12].Value.ToString();
        }

        private void fillDataTableAndSetColumnsVisibleFalse()
        {
            dataTable.Clear();
            dataAdapter.Fill(dataTable);
            dataGridView1.Columns["ID"].Visible = false;
            dataGridView1.Columns["Geloescht"].Visible = false;
        }

        private void btDatensatzSpeichern_Click(object sender, EventArgs e)
        {
            dataTable.Rows[selectedRow][0] = txtNameGrid.Text;
            dataTable.Rows[selectedRow][1] = txtVornameGrid.Text;
            dataTable.Rows[selectedRow][2] = dateTimeGeburtstagGrid.Text;
            dataTable.Rows[selectedRow][3] = dateTimeBGLehrscheinGrid.Text;
            dataTable.Rows[selectedRow][4] = dateTimeLehrscheinGrid.Text;
            dataTable.Rows[selectedRow][5] = txtGliederungGrid.Text;
            dataTable.Rows[selectedRow][6] = txtTelefonGrid.Text;
            dataTable.Rows[selectedRow][7] = txtMobilGrid.Text;
            dataTable.Rows[selectedRow][8] = txtEmailGrid.Text;
            dataTable.Rows[selectedRow][9] = txtStrasseGrid.Text;
            dataTable.Rows[selectedRow][10] = txtHausnummerGrid.Text;
            dataTable.Rows[selectedRow][11] = txtPlzGrid.Text;
            dataTable.Rows[selectedRow][12] = txtOrtGrid.Text;

//bei dem INSERT wird kein Fehler oder sonst was ausgegeben. Das Programm läuft durch aber in der Datenbank passiert nichts.
            connectionToDatabase("INSERT INTO Ausbilder ( Name, Vorname, Geburtsdatum, [BG Lehrschein bis], [Lehrschein bis], Gliederung, Telefon, Mobil, Email, Strasse, Hausnummer, Plz, Ort ) VALUES ('" + txtNameGrid.Text + "','" + txtVornameGrid.Text + "','" + dateTimeGeburtstagGrid.Text.ToString() + "','" + dateTimeBGLehrscheinGrid.Text.ToString() + "','" + dateTimeLehrscheinGrid.Text +"','" + txtGliederungGrid.Text + "','" + txtTelefonGrid.Text + "','" + txtMobilGrid.Text + "','" + txtEmailGrid.Text + "','" + txtStrasseGrid.Text + "','" + txtHausnummerGrid.Text + "','" + txtPlzGrid.Text + "','" + txtOrtGrid.Text + "');");

//Wenn ich den dataAdapter so aufrufe fliegt eine InvalidPerationException            
//dataAdapter.Update(dataTable);
        }  

    }
}

F
10.010 Beiträge seit 2004
vor 12 Jahren

Nach dem Hinweis von Lennart und den Ausführungen der anderen ist der Code eher eine Frechheit.

Du frickelst weiterhin deine Parameter in den SqlString und ausführen tust du den Befehl auch nicht ( ExecuteNonQuery ? ).

Du solltest mal erst die Grundlagen erlesen und dann so etwas durchführen.

[Hinweis] Wie poste ich richtig?
Solltest du dir auch noch einmal genauer durchlesen.

C
cSharpJunior Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

Sorry das ich mit 15 als Schüler der weder in der Schule noch sonst wo außer im www Hilfe bekommt versucht sich was bei zu bringen in seiner Freizeit.

Aber ich werde einfach weiter probieren...irgendwann wirds schon tun...

F
10.010 Beiträge seit 2004
vor 12 Jahren

Du sollst nicht probieren sondern lesen was man dir als Hilfe schreibt.

  1. Benutze Parameter
  2. Wie schon mehrfach geschrieben musst du den Befehl aus ausführen.
  3. All das steht in Einleitungen zu ADO.NET auch drin.
H
208 Beiträge seit 2008
vor 12 Jahren

@haarrrgh: Dein Tipp wars leider auch nicht. Ich hab die DB zwar im Projektverzeichnis, aber dort wo die Files *.sln und *.suo liegen.

Hm...ich finde, das klingt sehr wohl nach meinem Tipp.

Mach erstmal das was FZelle geschrieben hat (vor allem Punkt 2 😉 ).

Wenn Du das gemacht hast und dann genau den Fall hast den ich in meinem letzten Beitrag beschrieben habe (Programm wird ohne Fehlermeldungen/Exceptions ausgeführt, aber die Daten sind nicht in der Datenbank), lies Dir nochmal den Link durch den ich gepostet hatte.