Autor Beitrag
Bartman
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.03.09 12:15 
Hallo

fange gerade an C# zu lernen und da hab ich ja nu leider auch paar fragen ;)

Ich will ein SQL Statement in einem Datagrid anzeigen lassen. MEin Code sieht bisher so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
mycommand = new SqlCommand(SQLSTATEMENT);
                mycommand.Connection = connection;  
                SqlDataAdapter da = new SqlDataAdapter(mycommand);
                DataSet ds = new DataSet();


kann mir wer weiterhelfen wie es mit data set weitergeht?

VG BArtman

Moderiert von user profile iconKha: Quote- durch C#-Tags ersetzt
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: Mi 11.03.09 12:30 
Hallo und :welcome:

user profile iconBartman hat folgendes geschrieben Zum zitierten Posting springen:
fange gerade an C# zu lernen

Und da willst Du ausgerechnet mit so etwas Komplexem wie Datenbanken beginnen? Bitte übernimm Dich nicht, sondern fange etwas einfacher an!

user profile iconBartman hat folgendes geschrieben Zum zitierten Posting springen:
kann mir wer weiterhelfen wie es mit data set weitergeht?

Dazu passt wirklich am besten OpenBook VC# Kap.25 ff. Aber bedenke, dass das erst in Kap.25 damit losgeht und sehr umfangreich ist (mehrere Kapitel).

Gruß Jürgen
Bartman Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.03.09 12:34 
Das hab ich mir schon fast gedacht, aber ich hab in 1 1/4 Jahren meine Abschlußprüfung und muss da was Programmieren.

Er verbindet sich zu der Datenbank, blos bekomme ich die Ausgabe mit dem Datagrid nicht hin :(

Werde mir mal das Openbook auch anschauen, arbeite selber mit dem Buch "Softwareentwicklung mit C# 2.0".

VG Bartman
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: Mi 11.03.09 12:47 
Naja, mit schlechtem Gewissen will ich mal nicht so sein:
ausblenden C#-Quelltext
1:
2:
3:
4:
da.Fill(ds, "MainTable");
DataGridView dgv = new DataGridView();
dgv.AutoGenerateColumns = true;
dgv.DataSource = ds.Tables["MainTable"];

So geht eine "Minimalversion" des o.g. Code weiter.

Beachte, dass ich nicht das DataGrid verwende; das würde mit DataSource (auf das DataSet) und DataMember (für die DataTable) auch gehen. Das DataGridView ist moderner und umfangreicher (in vielerlei Hinsicht auch komplizierter).

Gruß Jürgen

PS. Code bitte nicht als Zitat, sondern als C# (mit dem Plus-Button) kennzeichnen.
Bartman Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.03.09 12:55 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:


PS. Code bitte nicht als Zitat, sondern als C# (mit dem Plus-Button) kennzeichnen.


tschuldige, beachte ich.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if (connection != null)
mycommand = new SqlCommand("SQLSTATEMENT");
                mycommand.Connection = connection;  
                SqlDataAdapter da = new SqlDataAdapter(mycommand);
                DataSet ds = new DataSet();
                da.Fill(ds, "data1");
                DataGridView dgv = new DataGridView();
                dgv.AutoGenerateColumns = true;
                dgv.DataSource = ds.Tables["ergebnis"];


so sieht es im moment aus.

Habe mit einer Form angefangen in C#, oder ist ein anderer Weg einfacher und/oder effizienter es zu lernen?

VG Bartman
Bartman Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.03.09 13:50 
brauch nur noch die ausgabe, blos da hängt es gerade, vergleiche es gerade mit sachen von meiner Schule(JAVA) aebr find nicht den weg zur Lösung....:(
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: Mi 11.03.09 14:01 
Hallo,

das DataGridView muss natürlich Bestandteil des Formulars sein. Einfacher wird es sein, wenn Du es mit dem Designer einbaust und nur die Zuweisung von DataSource hinter das da.Fill setzt. (Konkret fehlt myForm.Controls.Add(dgv).) Auch das DataSet sollte nicht im EventHandler zum Laden der Daten erzeugt werden, sondern dauerhaft im Form-Load.

Eine gravierende Änderung musst Du aber noch vornehmen. Unter NET ist eine DbConnection immer nur kurzfristig gültig und nicht dauerhaft während der gesamten Anwendung. Eine kurze Anleitung, wie es aussehen sollte, findest Du unter MySQL-Datenbanken in C# einbinden.

user profile iconBartman hat folgendes geschrieben Zum zitierten Posting springen:
brauch nur noch die ausgabe, blos da hängt es gerade

Meinst Du mit "Ausgabe", dass das DGV noch nicht sichtbar ist, oder fehlt eine andere Art der Ausgabe?

Gruß Jürgen

PS. DB-Verarbeitung mit Formular ist m.E. schon das richtige Vorgehen. Eingabe und Ausgabe von Daten in einer Console-Anwendung sind wohl viel umständlicher.
Bartman Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.03.09 15:24 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

das DataGridView muss natürlich Bestandteil des Formulars sein. Einfacher wird es sein, wenn Du es mit dem Designer einbaust und nur die Zuweisung von DataSource hinter das da.Fill setzt. (Konkret fehlt myForm.Controls.Add(dgv).) Auch das DataSet sollte nicht im EventHandler zum Laden der Daten erzeugt werden, sondern dauerhaft im Form-Load.

Eine gravierende Änderung musst Du aber noch vornehmen. Unter NET ist eine DbConnection immer nur kurzfristig gültig und nicht dauerhaft während der gesamten Anwendung. Eine kurze Anleitung, wie es aussehen sollte, findest Du unter MySQL-Datenbanken in C# einbinden.

user profile iconBartman hat folgendes geschrieben Zum zitierten Posting springen:
brauch nur noch die ausgabe, blos da hängt es gerade

Meinst Du mit "Ausgabe", dass das DGV noch nicht sichtbar ist, oder fehlt eine andere Art der Ausgabe?

Gruß Jürgen

PS. DB-Verarbeitung mit Formular ist m.E. schon das richtige Vorgehen. Eingabe und Ausgabe von Daten in einer Console-Anwendung sind wohl viel umständlicher.


das Datagrid ist einegbaut, heisst "ergebnis".

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:
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private SqlConnection connection;
        private SqlCommand mycommand;
        private SqlDataAdapter da;
        

        public Form1()
        {
            InitializeComponent();
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void verbinden_Click(object sender, EventArgs e)
        {
            //SQL Connection 
            string strCon = "SERVER=****;" +
                            "DATABASE=****;" +
                            "UID=****;" +
                            "PASSWORD=****;";

            //Verbindung aufbauen
            try
            {
                if (connection == null || connection.State != ConnectionState.Open)
                {
                    connection = new SqlConnection(strCon);
                    connection.Open();
                }


                //connection.Close();
                check.Text = connection.State.ToString(); // "Open";
                

            }
            catch(Exception ex)
            {
            MessageBox.Show(ex.Message);
           
            }
           
            }

        private void trennen_Click(object sender, EventArgs e)
        {   
            //Verbindung trennen 
            connection.Close();
            check.Text = "Close";
            MessageBox.Show("Connection Closed");

        }

        private void zerfassen_Click(object sender, EventArgs e)
        {

            if (connection == null)
               MessageBox.Show("No Connection");

            try
            {
                if (connection != null)
                mycommand = new SqlCommand("SQLSTATEMENT");
                mycommand.Connection = connection;
                SqlDataAdapter da = new SqlDataAdapter(mycommand);
                DataSet ds = new DataSet();
                da.Fill(ds, "ergebnis");
                DataGridView dgv = new DataGridView();
                dgv.AutoGenerateColumns = true;
                dgv.DataSource = ds.Tables["ergebnis"];
                SqlCommand cmd = connection.CreateCommand();
                cmd.CommandText = "PRINT'Informationsmeldung'";
                cmd.ExecuteNonQuery();
                connection.Close();
                Console.WriteLine(connection);
                Console.ReadLine();
            }
            
            catch(Exception es)
            {
                 MessageBox.Show(es.Message);
            }


das ist der ganze code.

Wenn ich auf den Button, Verbinden klicke baut er die Verbindung auf, trennen ebenso. Aber es scheint wirklichd as problöem zu sein das er es nicht dauerhaft hält. Ich verbinde es, klicke auf erfassen passiert nichts, 2. Klick auf erfassen sagt er das keine Verbindung vorhanden ist.
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: Mi 11.03.09 17:35 
Hallo,

die Gesamtkonstruktion gefällt mir überhaupt nicht; deshalb will ich über konkrete Änderungsvorschläge zu Deinem Code nicht nachdenken.

1. Nach "if (connection != null)" fehlen höchstwahrscheinlich Klammern {...}.

2. Alle drei Sql-Variablen gehören nur nach zerfassen_Click in der Art, wie ich es in meinem Link vorgemacht habe. Auch die Deklaration hat nichts im Formular zu suchen!

3. verbinden_Click und trennen_Click können ersatzlos gestrichen werden, weil das zwangsläufig Bestandteil von zerfassen_Click ist. (Übrigens sorgt der DbDataAdapter automatisch für Open und Close. Nur wenn wie bei Deinem PRINT-Befehl mehrere DbCommands verbunden werden, ist ein manuelles Öffnen und Schließen sinnvoll.)

4. Lediglich die string-Variable strCon kann und darf "global" im Formular zur Verfügung gestellt werden. (In der Praxis darf das Passwort natürlich nicht im Code verankert werden, da gibt es viele Alternativen. Aber zurzeit ist das eine akzeptable Notlösung.)

5. Vor allem DataGridView, aber auch DataSet gehören mit Deklaration und Konstruktor-Aufruf ins Formular, dazu fehlt immer noch this.Controls.Add(dgv).

6. mycommand braucht einen richtigen SQL-Befehl wie "SELECT ID, Name FROM Adressen". Wenn SQLSTATEMENT als Platzhalter dafür steht, dann ersetze das am besten durch eine string-Variable, damit das deutlicher wird.

7. Ist "PRINT" ein SQL-Befehl, den MS-SQL versteht? Dann ist es OK, andernfalls nicht verständlich.

8. Von der Variablen "ergebnis" eines DataGrid oder DataGridView (bitte entscheide Dich, was Du benutzen willst, meine Empfehlung ist DataGridView) sehe ich nichts. Bei Dir ist es der Name der Tabelle (und zwar nicht die Bezeichnung einer Variablen, sondern wirklich der Tabellenname).

Nebenbei: Bei DB-Exceptions liefert ex.ToString() in der Regel bessere Informationen als ex.Message. Console-Ausgaben passen eigentlich nicht in eine WinForms-Anwendung; dafür sollte eher eine MultiLine-TextBox verwendet werden. Und Du solltest auch NET: Richtlinien für Namen bei Gelegenheit durchlesen und beachten; der denglische Mischmasch "zerfassen_Click" ist doch sehr schrecklich.

Trotzdem viel Erfolg! Jürgen