Autor Beitrag
Phrixotrichus
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 20.05.11 01:43 
Hallo liebes Forum :)

Ich mache zur Zeit meine ersten Gehversuche mit C# und habe in VS2010 ein WPF Projekt begonnen und stecke nun leider schon nach kurzer Zeit ziemlich fest.

Vielleicht kann mir Neuling ja ein Profi hier helfen :)

Mein Problem liegt darin, daß ich mit meiner SQL bzw sql-Reader implementierung zwar Tabellen auf meinem SQL-Server erstellen und befüllen kann, aber nicht auslesen.
Ich bekomme immer den Fehler daß im Reader aktuell kein query vorhanden wäre, oder aber versucht würde zu lesen obwohl der reader bereits geclosed wäre.


Meine Connection-Klasse
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
class Connection
    {
       

        public MySqlConnection Connect (string host, string user, string password, string database)
        {        
            MySqlConnection conn = new MySqlConnection(); 
          //  this.con.ConnectionString = "server="+host+";database="+database+";UID="+user+";PASSWORD="+password+";";
            conn.ConnectionString = "server=localhost;database=hs;UID=root;PASSWORD=&dannkhs1!;";
            return conn;
        }



Meine SQL-Handling-Klasse:
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:
  class Anfragen
    {

................
................
................
// Insert und reate funktionieren, daher erspare ich sie euch ;)



        public MySqlDataReader select(string com, MySqlConnection c1)
        {
            MySqlConnection con = c1;
            try
            {
                MySqlCommand command = con.CreateCommand();
                command.CommandText = com;
                con.Open();
                MySqlDataReader reader = command.ExecuteReader();
                return reader;
            }
            catch (Exception e)
            {
                // Anweisungen
                MySqlDataReader reader = null;
                MessageBox.Show("funzt nicht :(");
                return reader;
            }
        }

    }


}



Und mein Aufruf für die SQL-Befehle

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:
 private void button4_Click(object sender, RoutedEventArgs e)
        {
         
            userMain = textBox1.Text;
            passwordMain = passwordBox1.Password;
            Connection con = new Connection();
            Anfragen anf = new Anfragen();
            MySqlConnection sqlCon = con.Connect(ip, user, password, database);
            cmd = "CREATE  TABLE IF NOT EXISTS  `hs`.`new` (  `idnew` INT NOT NULL ,  PRIMARY KEY (`idnew`) );";
            anf.Create(cmd, sqlCon);

            cmd =   "INSERT INTO `hs`.`new` (`idnew`) VALUES (1);" +

                    "INSERT INTO `hs`.`new` (`idnew`) VALUES (2);" +


                    "INSERT INTO `hs`.`new` (`idnew`) VALUES (3);" +

                    "INSERT INTO `hs`.`new` (`idnew`) VALUES (4);";

            anf.insert(cmd, sqlCon);

            cmd = "SELECT * FROM new;";

            MySqlDataReader reader = anf.select(cmd, sqlCon);

            while (reader.Read())
            {
                MessageBox.Show(reader[2].ToString());

            }
            sqlCon.Close();
        }



Ich war mir nicht ganz sicher ob der Beitrag ins SQl oder ins WPF Forum gehört. Falls ich mich falsch entschieden habe verschiebt ihn bitte ins korrekte Unterforum, merci :)

mfg,
Phrix

Moderiert von user profile iconKha: "csharp"- durch cs-Tags ersetzt
Moderiert von user profile iconKha: Topic aus WPF / Silverlight verschoben am Fr 20.05.2011 um 16:29
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Fr 20.05.11 21:13 
Hallo Phri...:)

ich habe eben mal eine eigene Abfrage auf eine Testtabelle in meinem SQL-Server erstellt und so den Reader getestet. Mit folg. Code lief es fehlerfrei:

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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = @"Data Source=NONAME\Sqlexpress;Initial Catalog=TestDatabase;Integrated Security=True";
            SqlCommand command = conn.CreateCommand();
            command.CommandText = "Select * From dbo.test";
            conn.Open();
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                Console.WriteLine(reader["Nachname"]);
            }
            reader.Close();
            conn.Close();
            Console.Read();

        }
    }
}


Mir ist aufgefallen, dass Du Klassen vom Typ "MySQL..." verwendest, bei mir sind es "SQL..." aus der Bibi "System.Data.SQLClient".

Deinen Code habe ich nicht weiter geprüft. Wenn Du den Fehler selber nicht findest helfe ich aber gerne nochmal.

Zur Info:
Meine Datenbank im SQL-Server ist wie folgt aufgebaut:
Datenbank="TestDatabase"
Tabelle="dbo.Test"
Spalten: ID, Vorname, Nachname

Viele Grüße
Frank
lalan4p
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 25.05.11 21:08 
Indem du in deiner select-Funktion den DataReader zurückgibst, verlässt du den Gültigkeitsberei von MySqlConnection con. Da du diese nur in der Funktion instanziert hast, ist sie auch nur dort zugänglich. Ein DataReader braucht aber zum Auslesen eine offene Connection.
Besser wäre den DataReader bereits in dem Try-Block auszulesen.
Phrixotrichus Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 27.05.11 01:02 
Danke für die Tipps. So langsam blicke ich ein wenig durch und nun läuft es auch ;)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 27.05.11 10:52 
Der Beitrag von lalan4p ist aber (bezogen auf C# bzw. .NET) völliger Quatsch.
Alle Klassen (Referenztypen) sind auch nach einem Funktionsblock weiterhin gültig und ansprechbar, solange man eine Referenz davon hat.

Nichtsdestotrotz sollte man für die ADO.NET-Programmierung die Connections so kurz wie möglich öffnen (Stichwort: Connection Pooling).