Laden...

Datareader aus Funktion übergeben und dann schließen

Erstellt von jay_ar_m vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.599 Views
J
jay_ar_m Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren
Datareader aus Funktion übergeben und dann schließen

Hallo,
wie man an der Frage erkennt, bin ich noch neu in der C# (und aspx) Programmierung.
Meine Idee ist, dass ich SQL-Abfragen folgender Maßen in einer Funktion ausführe, und das Ergebnis dann direkt z.B: an eine GridView binden kann.
Leider kann ich dann den Datareader nicht schließen, was bei ersten Versuchen auf dem Server zu Problemen geführt hat.
Ist es möglich die Datenbankabfrage so in eine Funktion auszulagern?
Vielen Dank im voraus
Joe

 // --------------------------------------------------------------------------------------
        // Beispiel Aufruf in der aspx datei
        // -------------------------------------------------------------------------------------- 
                ASPxGridViewOptionen.DataSource = clsDBACCESS.F_DB_Select("Select * from Table Test");
                ASPxGridViewOptionen.DataBind();

        // --------------------------------------------------------------------------------------
        // DB Select in Klasse clsDBACCESS - > gibt bei Erfolg FbDataReader zurück
        // -------------------------------------------------------------------------------------- 
        public static FbDataReader F_DB_Select(string strSqlSelect)
        {
            FbConnection myConnection1 = null;
            FbDataReader DR = null;
            try
            {
                // DB connect
                myConnection1 = new FbConnection(connectionString);
                myConnection1.Open();
                FbTransaction myTransaction = myConnection1.BeginTransaction();
                FbCommand myFbCommand = new FbCommand();
                // Sql-String übergeben
                myFbCommand.CommandText = strSqlSelect;
                // ausführen vorbereiten
                myFbCommand.Connection = myConnection1;
                myFbCommand.Transaction = myTransaction;
                // DB zugriff ausführen 
                DR = myFbCommand.ExecuteReader();

                return (DR);
                //myConnection1.Close();
            }
            catch (Exception ex)
            {
                clsHelper.Log(ex.ToString());
                if (myConnection1 != null) myConnection1.Close();
                return (DR);
            }
        }
F
10.010 Beiträge seit 2004
vor 11 Jahren
  1. Beim lesen benötigst du keine Transaction.
  2. Schon mal geschaut was ExecuteReader alles für Überladungen hat?
D
615 Beiträge seit 2009
vor 11 Jahren

Hallo jay_ar_m

Ich nehme mal an du benutzt FireBird (=> FbConnection)

Ich würde Dir raten ein OR Mapper zu benutzen z.B das Entity Framework.

Hier ein Tutorial zu FireBird CRUD Operations: Firebird CRUD

Dennoch würde ich meinem Rat folgen 😉 Hier findest du Firebird .Net Provider

Beste Grüsse

Diräkt

J
jay_ar_m Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

Erst mal danke für die schnelle Antwort.
Ich habe mal die Transaction rausgeschmissen -> funktioniert -> danke

Bei der Geschichte mit der Überladung bräuchte ich nochmal Hilfe. Ist das vielleicht etwas mit Behavior?

Joe

PS: ich habe übrigens eine Firebird-Datenbankanbindung


// --------------------------------------------------------------------------------------
        // DB Select - > gibt bei Erfolg FbDataReader zurück
        // -------------------------------------------------------------------------------------- 
        public static FbDataReader F_DB_Select(string strSqlSelect)
        {
            FbConnection myConnection1 = null;
            FbDataReader DR = null;
            try
            {
                // DB connect
                myConnection1 = new FbConnection(connectionString);
                myConnection1.Open();
                FbCommand myFbCommand = new FbCommand();
                // Sql-String übergeben
                myFbCommand.CommandText = strSqlSelect;
                // ausführen vorbereiten
                myFbCommand.Connection = myConnection1;
                // DB zugriff ausführen 
                DR = myFbCommand.ExecuteReader();

                return (DR);
                //myConnection1.Close();
            }
            catch (Exception ex)
            {
                clsHelper.Log(ex.ToString());
                if (myConnection1 != null) myConnection1.Close();
                return (DR);
            }
        }
D
615 Beiträge seit 2009
vor 11 Jahren

Hallo jay_ar_m

Was eine Überladung ist, gehört zu den Grundkentnissen die hier verlangt werden.



public double Fläche(double seite1, double seite2)
{
return seite1*seite2;
}

public double Fläche(int seite1, int seite2)
{
return seite1*seite2;
}


Das ist mit Überladung gemeint. Wenn auch nicht ein sehr sinnvolles Beispiel 😃
(Nun solltest du wissen, was FZelle meinte)

Beste Grüsse

Diräkt

J
jay_ar_m Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

Hallo,

ich habe mich vielleicht falsch ausgedrückt.
Ich weiß schon was Überladung bedeutet, nur weiß ich nicht mit was ich die Funktion überladen soll. Da wäre ein Beispiel nett.

Joe

D
615 Beiträge seit 2009
vor 11 Jahren

Hallo jay_ar_m

Auf MSDN hats ein perfekts Beispiel dazu:

SqlCommand.ExecuteReader-Methode (CommandBehavior)


private static void CreateCommand(string queryString,
    string connectionString)
{
    using (SqlConnection connection = new SqlConnection(
               connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        connection.Open();
        SqlDataReader reader =
            command.ExecuteReader(CommandBehavior.CloseConnection);
        while (reader.Read())
        {
            Console.WriteLine(String.Format("{0}", reader[0]));
        }
    }
}

Ich denke, das sollte genau sein was du suchst 😉

Beste Grüsse

Diräkt

J
jay_ar_m Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

Danke Diräkt,

das werde ich sofort testen, wenn ich wieder vor dem "richtigen" Rechner sitze.

Joe

F
10.010 Beiträge seit 2004
vor 11 Jahren

Du solltest dir auch gleich die Überladungen zum Command anschauen, dann musst du nicht so viel code schreiben.

J
jay_ar_m Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

Vielen Dank für die Antworten. Es klappt perfekt.

anbei nochmal der komplette Code:

Joe

// --------------------------------------------------------------------------------------
        // DB Select - > gibt bei Erfolg FbDataReader zurück
        // -------------------------------------------------------------------------------------- 
        public static FbDataReader F_DB_Select(string strSqlSelect)
        {
            FbConnection myConnection1 = null;
            FbDataReader DR = null;
            try
            {
                // DB connect
                myConnection1 = new FbConnection(connectionString);
                myConnection1.Open();
                // Sql-String übergeben
                FbCommand myFbCommand = new FbCommand(strSqlSelect);
                // ausführen vorbereiten
                myFbCommand.Connection = myConnection1;
                // DB zugriff ausführen mit CommandBehavior
                DR = myFbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

                return (DR);
            }
            catch (Exception ex)
            {
                clsHelper.Log(ex.ToString());
                if (myConnection1 != null) myConnection1.Close();
                return (DR);
            }
        }
F
10.010 Beiträge seit 2004
vor 11 Jahren

Evtl solltest Du dir nochmal die Überladungen anschauen.
Das con.Close sollte ausserdem in das Finally, das es im Catch ist, ist doch bestimmt ein versehen, genauso wie das return.
Und Statische Klassen ( clsLogger ) kann man umgehen ( die sind architektonisch schlecht ) indem man DI/IOC benutzt.

Auch ist deine Namensgebung in .NET nicht üblich http://msdn.microsoft.com/en-us/library/xzf533w0(v=vs.71).aspx