Autor Beitrag
gordon65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: So 18.10.09 14:31 
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:


ausblenden volle Höhe 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 herstellen
                verbindung = new SqlConnection(verbindungsstr);
                verbindung.Open();

                // Daten aus Datenbank abfragen 
                befehl = verbindung.CreateCommand();
                befehl.CommandText = "SELECT * FROM bndlaender";
                leser = befehl.ExecuteReader();

               
                
                // Daten in Arrays kopieren

                aktDatensatz = -1;
                while (leser.Read())
                {
                    aktDatensatz++;
                    dbRang[aktDatensatz] = leser.GetInt32(0);
                    dbBundesland[aktDatensatz] = leser.GetString(1);
                    dbEinwohner[aktDatensatz] = leser.GetFloat(2);
                }

                // Daten des ersten Datensatzes in Label ausgeben
                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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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();

      // Daten aus Datenbank abfragen 
      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 beschrieben.

Jürgen
gordon65 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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:

ausblenden volle Höhe 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)
        {
            // Daten des vorigen aktDatensatzes in Label ausgeben
            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)
        {
            // Daten des nächsten aktDatensatzes in Label ausgeben
            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();

                    // Daten aus Datenbank abfragen 
                    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 ??:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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. 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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="user profile iconJü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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: So 18.10.09 19:04 
user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
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