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
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?
Mein Blog: http://www.frickelblog.de
Schau dir das mal an Binden von Daten an das DataGridView
**:::
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ß....
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 😕
Mein Blog: http://www.frickelblog.de
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ß