Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Insert ? Ado.net c#
gordon65 - So 18.10.09 14:31
Titel: Insert ? Ado.net c#
Also ich will in einer Datenbank etwas einfügen.
Ich hab zwar schon einige tuturials im internet mir angesehen aber überall machen die des irgendwie anderster ... ich ckecke das net:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient;
namespace SQLDatenbankbetrachter { public partial class Form1 : Form { const string verbindungsstr = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Beispiele\\Kap14\\Laender.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; SqlConnection verbindung = null; SqlCommand befehl = null; SqlCommand befehl2 = null; SqlDataReader leser = null;
int[] dbRang; string[] dbBundesland; float[] dbEinwohner; int aktDatensatz = -1;
public Form1() { InitializeComponent();
dbRang = new int[16]; dbBundesland = new string[16]; dbEinwohner = new float[16];
try { verbindung = new SqlConnection(verbindungsstr); verbindung.Open();
befehl = verbindung.CreateCommand(); befehl.CommandText = "SELECT * FROM bndlaender"; leser = befehl.ExecuteReader();
aktDatensatz = -1; while (leser.Read()) { aktDatensatz++; dbRang[aktDatensatz] = leser.GetInt32(0); dbBundesland[aktDatensatz] = leser.GetString(1); dbEinwohner[aktDatensatz] = leser.GetFloat(2); }
aktDatensatz = 0; label4.Text = dbRang[0].ToString(); label5.Text = dbBundesland[0]; label6.Text = dbEinwohner[0].ToString(); } catch (SqlException e) { MessageBox.Show(e.Message, "Datenbankfehler"); } catch (Exception e) { MessageBox.Show(e.Message, "Datenbankfehler"); } finally { if (leser != null) leser.Close(); if (verbindung != null) verbindung.Close(); } } |
also das ist der bedrachter
und mein Insert Befehl müsste so ausschauen:
INSERT INTO bndlaender (Rang, Bundesland, Einwohner) VALUES (1,'Nordrhein-Westfalen',18.10)
oder ???
und wie füg ich das jetzt im code ein ??
JüTho - So 18.10.09 16:02
Hallo,
dein Hauptfehler besteht darin, dass die Verbindung und das Laden Teil des Konstruktors ist. So etwas sollte nur auf Anforderung passieren. Damit zusammen hängen Probleme mit dem Geltungsbereich der DbConnection u.ä. Ändere das etwa wie folgt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void ButtonRead_Click(sender object, EventArgs e) { using( SqlConnection conn = new SqlConnection(verbindungsstr) ) { conn.Open();
SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "SELECT * FROM bndlaender"; SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read() ) { ... } } } |
In gleicher Weise kannst du in einem ButtonWrite-Click auch einen INSERT-Befehl verwenden; dann muss das nur auf
cmd.ExecuteNonQuery geändert werden.
Übrigens sollte ein SQL-Befehl niemals als langer String einschließlich variabler Feldinhalte erzeugt werden. Nutze stattdessen unbedingt Parameter, wie unter
[Artikelserie] Parameter von SQL Befehlen [
http://www.mycsharp.de/wbb2/thread.php?threadid=66704] beschrieben.
Jürgen
gordon65 - So 18.10.09 17:10
Ich habe es gemacht wie du es gesagt hast (noch ohne den einfügen)
dann gibt er mir aber folgenden Fehler zurück:
Der Objektverweis wurde nicht auf eine objektinstanz festgelegt.
Hier ist der code .. ich hab wohl irgendein fehler gemacht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient;
namespace SQLDatenbankbetrachter { public partial class Form1 : Form { const string verbindungsstr = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Beispiele\\Laender.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; SqlConnection verbindung = null; SqlCommand befehl = null; SqlDataReader leser = null;
int[] dbRang; string[] dbBundesland; float[] dbEinwohner; int aktDatensatz = -1;
public Form1() { InitializeComponent();
dbRang = new int[16]; dbBundesland = new string[16]; dbEinwohner = new float[16]; }
private void button1_Click(object sender, EventArgs e) { if (aktDatensatz > 0) aktDatensatz--; label4.Text = dbRang[aktDatensatz].ToString(); label5.Text = dbBundesland[aktDatensatz]; label6.Text = dbEinwohner[aktDatensatz].ToString(); }
private void button2_Click(object sender, EventArgs e) { if (aktDatensatz < 15) aktDatensatz++; label4.Text = dbRang[aktDatensatz].ToString(); label5.Text = dbBundesland[aktDatensatz]; label6.Text = dbEinwohner[aktDatensatz].ToString(); }
private void button3_Click(object sender, EventArgs e) { try { using (SqlConnection conn = new SqlConnection(verbindungsstr)) { conn.Open();
SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "SELECT * FROM bndlaender"; SqlDataReader reader = cmd.ExecuteReader();
aktDatensatz = -1; while (leser.Read()) { aktDatensatz++; dbRang[aktDatensatz] = leser.GetInt32(0); dbBundesland[aktDatensatz] = leser.GetString(1); dbEinwohner[aktDatensatz] = leser.GetFloat(2); } } } catch (SqlException ex) { MessageBox.Show(ex.Message, "Datenbankfehler"); } catch (Exception ex2) { MessageBox.Show(ex2.Message, "Datenbankfehler"); } finally { if (leser != null) leser.Close(); if (verbindung != null) verbindung.Close(); } } } } |
und würde der Befehl zum einfügen gehen ??:
C#-Quelltext
1: 2: 3:
| SqlCommnd cmd = ConnectionState.CreateCommand(); cmd.CommandText = "INSERT INTO bndlaender (Rang, Bundesland, Einwohner) VALUES (1,'Nordrhein-Westfalen',18.10)"; SqlDataReader writer = cmd.ExecuteNonQuery; |
JüTho - So 18.10.09 17:57
Zitat: |
dann gibt er mir aber folgenden Fehler zurück:
Der Objektverweis wurde nicht auf eine objektinstanz festgelegt. |
Ich habe den DataReader
reader genannt und initialisiert; du hast danach den DataReader
leser benutzt, der nicht initialisiert worden ist.
ExecuteNonQuery wird so, wie du es benutzen willst, zu einem Compiler-Fehler führen. Der Grund steht in der
SDK-Doku/MSDN und verweist auf einen falschen Rückgabewert.
Wieso sind die Einwohner als
float deklariert? Ich dachte, es würde sich um Menschen handeln und nicht um Fleischstücke. :mrgreen:
Ich ziehe
englische Namen vor gemäß
MSDN: NET Richtlinien für Namen [
http://msdn.microsoft.com/de-de/library/ms229002%28VS.80%29.aspx]. Das ist immer noch schöner als ein denglischer Mischmasch wie buttonSpeichern_Click oder dbRang[aktDatensatz].ToString().
Übrigens sollten Bezeichner wie label4 oder TextBox328 verboten werden; da weißt nach spätestens 14 Tagen auch du nicht mehr, wofür die gedacht sind.
Ich weiß ja nicht, was du noch alles mit den Daten machen willst. Aber grundsätzlich scheint dafür eine
DataTable besser geeignet zu sein als eine Sammlung mehrerer Arrays. Wenn du dazu
BindingSource und
DataBinding benutzt, sparst du dir das manuelle Navigieren mit aktDatensatz.
Gruß Jürgen
gordon65 - So 18.10.09 18:31
das will ich ja alles nicht verwenden ... das brauch ich ja auch in 10 tagen nicht mehr lesen können ... ich will das auf einen einfachen beispiel ausprobieren und dann an meinen richtigen programm anwenden ... da spielen namen im mom keine wichtige rolle
wie soll ich das verstehen ???
[quote="
JüTho"(581707)]
Zitat: |
Der Grund steht in der SDK-Doku/MSDN und verweist auf einen falschen Rückgabewert.
|
Soll ich MSDN wegen mein problem "befragen" oder wie soll ich das verstehen ... ich sollte auch noch erwähnen das ich noch anfänger bin und mit der Fachsprach nicht so zurecht komme.
am liebsten sind mir einfach beispiele ... (das programm da oben ist auch ein ganz einfaches beispiel damit ich es besser verstehe)
also kannst du mir ein ganz kurzes beispiel geben ....( nur der wichtiste teil) sonst verstehe ich das wieder nicht
JüTho - So 18.10.09 19:04
gordon65 hat folgendes geschrieben : |
das will ich ja alles nicht verwenden ... das brauch ich ja auch in 10 tagen nicht mehr lesen können ... ich will das auf einen einfachen beispiel ausprobieren und dann an meinen richtigen programm anwenden ... da spielen namen im mom keine wichtige rolle |
Wenn dir das bewusst ist, soll es mir recht sein.
gordon65 hat folgendes geschrieben : |
wie soll ich das verstehen ???
Soll ich MSDN wegen mein problem "befragen" oder wie soll ich das verstehen ... |
Ja, so habe ich es gemeint. Die Doku ist so ausführlich (mit vielen Hinweisen und Beispielen), dass es besser ist, wenn du selbst lernst, dort zu blättern, als wenn du bei jedem neuen Problem nach Beispielen fragst, die dort schon haufenweise zu finden sind.
gordon65 hat folgendes geschrieben : |
ich sollte auch noch erwähnen das ich noch anfänger bin und mit der Fachsprach nicht so zurecht komme. |
Dann gilt das erst recht.
Du hast mindestens folgende Möglichkeiten:
gordon65 hat folgendes geschrieben : |
am liebsten sind mir einfach beispiele ... (das programm da oben ist auch ein ganz einfaches beispiel damit ich es besser verstehe)
also kannst du mir ein ganz kurzes beispiel geben ....( nur der wichtiste teil) sonst verstehe ich das wieder nicht |
Aus obigen Gründen möchte ich das nicht. Ich beschränke mich nur auf ExecuteNonQuery:
MSDN hat folgendes geschrieben: |
Rückgabewert: Die Anzahl der betroffenen Zeilen. |
Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!