verwendetes Datenbanksystem: <ACCESS>
Hallo,
bin absoluter C# Anfänger. Zum üben habe ich mir vorgenommen ein kleines Projekt zu schreiben in dem ich Domains und die Zugänge verwalten kann.
Habe mir mit Access eine leere DB angelegt. Auf der Form haben ich ein DBListeView welches ich auch erfolgreich mit der vorhandenen Access-DB verbunden habe.
Auf der Form habe ich etliche Textfelder, ich möchte die Werte der Felder in die DB schreiben. Wie gehe ich jetzt vor?
Welche Komponente etc. muss ich nutzen?
Danke und Gruss
UnoDosTres
Siehe 🛈 OpenBook VC# Kap.26. Bedenke aber, dass es sich um Kap.26 handelt, also viele Kenntnisse schon vorgesetzt werden!
Für DB-Zugriffe müssen immer die passenden Klassen verwendet werden: Sql* für MS-SQL Server, Fb* für Firebird oder MySql* für MySql; für Access gelten OleDb*.
Jürgen
Leider hilft mir das nur sehr bedingt weiter. (jedenfalls bei diesem konkreten Problem)
Ich habe auch im Internet einiges gefunden, jedoch bezieht sich das immer auf das Scenario wenn man die Datenbank noch gar nicht verbunden hat.
Es wird dann ein neues DataSet erzeugt etc...
Ich habe die Datenbank aber über den Assisten eingebunden. Das ListView zeigt diese ja auch korrekt an.
Habe in der Hilfe folgendes Gefunden:
try
{
this.Validate();
this.customersBindingSource.EndEdit();
this.customersTableAdapter.Update(this.northwindDataSet.Customers);
MessageBox.Show("Update successful");
}
catch (System.Exception ex)
{
MessageBox.Show("Update failed");
}
Was ist nicht verstehe ist, wo gebe ich die Daten an die gespeichert werden sollen?
Ich muss doch irgenwie/irgendwo einen INSERT o.ä. machen und ihm dann sagen welche Daten er wohin schreiben soll. ?(
Hallo UnoDosTres,
Ich persönlich finde mit dem Assistenten einbinden geht evtl. leichter und schneller aber gerade zum lernen ist es sinnvoll per Hand eine Verbindung zur Db Herzustellen. Ich versuch dir das mal an nem Beispiel zu zeigen:
OleDbConnection cs;
OleDbCommand cd = new OleDbCommand();
OleDbDataAdapter da = new OleDbDataAdapter();
DataSet ds = new DataSet();
public void db_verbinden(string conStr, string db_name)
{
if (File.Exists(db_name))
{
cs = new OleDbConnection();
cs.ConnectionString = conStr;
}
else
{
error = "Datenbank konnt nicht gefunden werden.";
MessageBox.Show(error);
}
}
So muss der Connectionstring (conStr) in etwa aussehen:
conStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DEINEDB.mdb";
Ein Insert würde dann so aussehen:
public DataTable insert(string sql_cmd)
{
try
{
ds.Dispose();
cd.Dispose();
cd = new OleDbCommand(sql_cmd, cs);
ds = new DataSet();
cs.Open();
cd.ExecuteNonQuery();
da.Fill(ds);
cs.Close();
return ds.Tables[0];
}
catch (OleDbException e)
{
MessageBox.Show(e.ToString());
return ds.Tables[0];
}
}
Der sql_cmd wäre dann halt dein INSERT Befehl.
Hoffe ich konnte helfen.
Gruß
roeb
BizTalk Open Space: http://biztalkopenspace.de/2010/
DNUG Chemnitz: http://dotnet-chemnitz.de
Blog: http://sqlpractice.wordpress.com
Danke für die Ausfürliche Hilfe,
leider ist es genau das was ich eigendlich nicht möchte. Ich möchte gerne den Aisstenten benutzen - Das ist ja der "casus knacktus"
Nur ich finde nichts an Beispielen die mir aufzeigen wie ich dann weiter vorgehen muss. Keine Ahnung vieleicht suche ich ja an der falschen Stelle, oder nach den Falschen Stichworten, aber weger google noch die Hilfe hat mich weitergebracht.
Hab es leider noch nie mit dem Assi gemacht, aber hab was in der MSDN gefunden, evtl hilft es dir ja. Musst dich mal durchwühlen.
BizTalk Open Space: http://biztalkopenspace.de/2010/
DNUG Chemnitz: http://dotnet-chemnitz.de
Blog: http://sqlpractice.wordpress.com
Original von UnoDosTres
Ich habe die Datenbank aber über den Assisten eingebunden. Das ListView zeigt diese ja auch korrekt an...Was ist nicht verstehe ist, wo gebe ich die Daten an die gespeichert werden sollen?
Ich muss doch irgenwie/irgendwo einen INSERT o.ä. machen und ihm dann sagen welche Daten er wohin schreiben soll. ?(
Das ist eines der Probleme, wenn man den Assistenten mit TableAdapter verwendet: Man sieht nicht, was gemacht wird, und kann kaum prüfen, was ausgeführt werden soll und was nicht klappt.
Der INSERT-Befehl dürfte vom TableAdapter automatisch erstellt worden sein und steht (vermutlich) in der Designer.cs des DataSet. Der Update-Befehl prüft bei allen Rows der DataTable den **RowState **und entscheidet danach, ob der Datensatz unverändert ist oder per Insert/Update/Delete an die Datenbank zu übergeben ist.
Unabdingbare Voraussetzung dafür (die oft übersehen wird, noch ein Problem beim Assistenten): Die Tabelle benötigt einen PrimaryKey; dieser muss im SelectCommand benutzt werden. Nur damit kann der TableAdapter die "Speichern"-Befehle erstellen.
Ich hoffe, das macht die Probleme etwas klarer. Aber auch ich rate davon ab, sich auf den Assistenten zu beschränken. Für einen Anfänger kann er (durch Lektüre des Quelltexts) die Hintergründe erläutern; aber Lernen geht "ohne" besser. Jürgen
Hm...ja ich denke ich werde das ganze manuel versuchen.
Trotzdem schon komisch das es diese Funktion gibt und man damit solche Probleme bekommt. 🤔
Original von UnoDosTres
Trotzdem schon komisch das es diese Funktion gibt und man damit solche Probleme bekommt. 🤔
Microsoft und seine Assistenten müsstest du doch kennen von deinem Betriebssystem 😉
BizTalk Open Space: http://biztalkopenspace.de/2010/
DNUG Chemnitz: http://dotnet-chemnitz.de
Blog: http://sqlpractice.wordpress.com
Hallo,
ich werde die DB jetzt per Hand einbinden. Allerdings habe ich ein Problem mit dem relativen Pfad:
string datei = Application.StartupPath + "\\domains.mdb";
InitializeComponent();
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=datei;");
OleDbCommand cmd = new OleDbCommand("SELECT * FROM dom ORDER BY ID", conn);
da = new OleDbDataAdapter(cmd);
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
ds = new DataSet();
da.Fill(ds, "dom");
grid1.DataSource = ds;
grid1.DataMember = "dom";
Wenn ich das Programm ausführe stürzt es ab und er sagt "datei nicht gefunden"
Wie binde ich den String "Datei" korrekt ein?
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + datei + ";");
so müsste es gehen 🙂
Supi, die Fehlermedlung kommt nicht mehr. Allerdings wird der Inhalt der Datenbank auch nicht angezeigt. Das Grid bleibt einfach leer.
ds = new DataSet();
conn.Open();
da.Fill(ds, "dom");
conn.Close();
grid1.DataSource = ds;
Jetzt müsste es gehen.
BizTalk Open Space: http://biztalkopenspace.de/2010/
DNUG Chemnitz: http://dotnet-chemnitz.de
Blog: http://sqlpractice.wordpress.com
Hi,
das klappt leider auch nicht. Das Grid bleibt einfach leer, auch die Tabellennamen werden nicht angezeigt.
Hier mal der komplette Code:
string datei = Application.StartupPath + "\\domains.mdb";
InitializeComponent();
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + datei + ";");
OleDbCommand cmd = new OleDbCommand("SELECT * FROM dom ORDER BY ID", conn);
da = new OleDbDataAdapter(cmd);
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
/*ds = new DataSet();
da.Fill(ds, "dom");
grid1.DataSource = ds;
grid1.DataMember = "dom";*/
ds = new DataSet();
conn.Open();
da.Fill(ds, "dom");
conn.Close();
grid1.DataSource = ds;
Leider besteht das Problem immernoch, Das Grid bleibt einfach Leer. Kann mir evtl jemand einen Tipp geben? Ich weiss nicht wo der Fehler liegen könnte.
Hallo,
leider bin ich nicht weitergekommen.
Habe mir via
MessageBox.Show(conn.DataSource.ToString());
Den Pfad der DB ausgeben lassen und dieser ist Korrekt.
Also muss es ja an dem Grid liegen (?) Muss ich da noch irgend etwas bestimmtes Einstellen?
Hallo,
binde dein Grid mal an das Table-Property im Dataset und nicht an das ganze Dataset.
"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein
Das DataSet hat nur eine Eigenschaft die "TABLES" heisst. Meinst du das?
Das jedenfalls klappt auch nicht.
?(
Bin immer noch bei Null.
private void Form1_Load(object sender, EventArgs e)
{
string datei = Application.StartupPath + "\\domains.mdb";
InitializeComponent();
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + datei + ";");
OleDbCommand cmd = new OleDbCommand("SELECT * FROM dom ORDER BY ID", conn);
conn.Open();
da = new OleDbDataAdapter(cmd);
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
ds = new DataSet();
da.Fill(ds, "dom");
grid1.DataSource = ds.Tables[0];
conn.Close();
//MessageBox.Show(conn.DataSource.ToString());
}
Langsamm verzweifel ich. Ist das wenigstens ansatzweise richtig was ich hier mache?
Sind im Objekt ds.Tables[0] unter Rows Datensätze vorhanden?
lg
LG
"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein
OK. Ich habe es jetzt hinbekommen. schwitz
Irgendwie war der ganze Code den ich da fabriziert hatte wohl total für den A****
🙂
Habe es jetzt so gelöst:
string datei = Application.StartupPath + "\\domains.mdb";
string conString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + datei + ";";
OleDbConnection conn;
OleDbCommand command = new OleDbCommand();
OleDbDataAdapter adapter = new OleDbDataAdapter();
// Verbindung ersteelen und Öffnen
conn = new OleDbConnection(conString);
command = conn.CreateCommand();
// DataSet erstellen
DataSet ds = new DataSet();
//DataSet clearen
grid1.DataSource = null;
ds = new DataSet();
conn.Open();
command.CommandText = "SELECT * FROM dom ORDER BY ID";
adapter = new OleDbDataAdapter(command);
adapter.Fill(ds);
// close the connection
conn.Close();
grid1.DataSource = ds.Tables[0];