Avatar billede olehaahr Nybegynder
07. juli 2011 - 16:21 Der er 10 kommentarer

2 datareadere og 1 connection

Ifølge microsoft m.fl, så kan man IKKE have 2 datareadere på den samme connection.

http://msdn.microsoft.com/en-us/library/haa3afyz(v=VS.100).aspx

Jeg forsøger imidlertid forgæves på at få systemet til at fejle.
Burde nedenstående kode ikke give en fejl ?
Efter min overbevisning er der 2 datareadere åbne på samme tid på den samme connection.

Eller har jeg misforstået noget ? 

Mvh Ole

SqlCeConnection c1 = new SqlCeConnection(@"Data Source = C:\DB\Database1.sdf");
            c1.Open();

            SqlCeCommand SQLKommando1 = new SqlCeCommand("SELECT TOP(3) varenummer, varenavn FROM varer ORDER BY varenummer", c1);
            SqlCeDataReader r1 = SQLKommando1.ExecuteReader(CommandBehavior.);
           
            while (r1.Read())
            {
                SqlCeCommand SQLKommando2 = new SqlCeCommand("SELECT TOP(2) varenavn, beholdning FROM varer", c1);
                SqlCeDataReader r2 = SQLKommando2.ExecuteReader();
                while (r2.Read())
                {
                    MessageBox.Show("YDRE: " + r1[0].ToString()+" INDRE: " + r2[0].ToString());
                }
                r2.Close();
            }
            r1.Close();
            c1.Close();


Mvh Ole
Avatar billede Syska Mester
07. juli 2011 - 16:43 #1
Denne linje burde da ikke kunne compile:
SqlCeDataReader r1 = SQLKommando1.ExecuteReader(CommandBehavior.);

Du er vist kommet til at fjerne noget.

Måske CE virker på en anden måde eller den måske automatisk lukke efter ExecuteReader er blevet kørt.

mvh
Avatar billede olehaahr Nybegynder
07. juli 2011 - 18:48 #2
Hov...

Skulle selvfølgelig have været

SqlCeDataReader r1 = SQLKommando1.ExecuteReader();

Jeg var midt i at se, hvilke parametre man kunne kalde executereader med.

Men tilbage til spørgsmålet. Jeg har prøvet koden både på en SQLCeDataReader og en OracleDataReader. Jeg kan ikke få den til at fejle.

Er der nogen som har et kodeeksempel som viser, hvornår det fejler at have 2 datareadere på den samme connection.

Mvh Ole
Avatar billede olehaahr Nybegynder
07. juli 2011 - 18:54 #3
Og hvad mener du i øvrigt med... "Efter executereader er blevet kørt"...

Svarer executereader ikke til at "snuppe sig en cursor", ligesom vi kender fra Oracle. Denne cursor kan man så loope igennem.

Så databasen laver da ikke noget før jeg begynder at "reade" min datareader.

Eller har jeg misforstået noget ?


Mvh Ole
Avatar billede Syska Mester
07. juli 2011 - 19:07 #4
Følgende fejler ved mig:
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

SqlCommand outerCommand = new SqlCommand("SELECT CID, Name FROM Countries", connection);
SqlDataReader outerReader = outerCommand.ExecuteReader();

while (outerReader.Read())
{
    /Console.WriteLine(outerReader.GetString(1));
    SqlCommand innerCommand = new SqlCommand("SELECT SID, Name FROM Servers WHERE CID = @CID}", connection);
    innerCommand.Parameters.Add("@CID", SqlDbType.TinyInt).Value = outerReader.GetByte(0);
    SqlDataReader innerReader = innerCommand.ExecuteReader();
    while (innerReader.Read())
    {
        Console.WriteLine(innerReader.GetString(1));
    }
}

Og jeg ikke se den store forskel ... så jeg er også lidt forundret. Jeg bruger en SQL 2008 R2, hvis det skulle have noget at sige.

mvh
Avatar billede arne_v Ekspert
08. juli 2011 - 04:19 #5
Her er mit bud paa en forklaring.

Generel database programmering med brug af IDbCommand ExecuteReader og IDbDataReader:

Kontrakten garanterer ikke at man kan have multiple readere aaben paa samme connection, saa kode der bruger det er principielt ukorrekt.

SQLServer:

default - giver fejl

2005 eller nyere med MultipleActiveResultSets=True i connection string - giver ikke fejl

er dokumenteret

SQLServer CE:

giver ikke fejl

er dokumenteret i http://msdn.microsoft.com/en-us/library/0c9att46.aspx

MySQL:

giver fejl

jeg kan ikke finde noget dokumentation

Oracle:

jeg har ikke lige en Oracle koerende, men som jeg laeser http://msdn.microsoft.com/en-us/library/ab4kxd8h.aspx skal det ikke give fejl
Avatar billede olehaahr Nybegynder
08. juli 2011 - 10:38 #6
Med Arnes indlæg i baghovedet, hvad er så det pæneste hvis man udvikler en windows-applikation til SQlServerCE ??

1) Kun at have EEN (global) connection.

eller

2) Snuppe sig en ny connection hver gang man skal tilgå databasen. Dette kan betyde at programmet har flere connections åben på samme tid.

Jeg er selv mest tilhænger af 1). I mit daglige arbejde anvender vi Concorde XAL på Oracle, og den bruger 1).

Hvad mener i ???

Mvh Ole
Avatar billede arne_v Ekspert
08. juli 2011 - 15:17 #7
Helt klart #2.

Bruge connetcion pool, aabne connection saa sent som muligt, lukke connection igen saa tidligt som muligt, kune lave en ting af gangen paa en connection uanset hvad er hvad jeg vil betragte som gaengs praksis.

Det er et must for web og server apps.

For desktop apps kan man godt faa alternativer til at fungere, men hvorfor skulle man det?
Avatar billede olehaahr Nybegynder
11. juli 2011 - 12:04 #8
Ok...

Smid et svar, så vi kan få lukket indlægget.

Mvh Ole
Avatar billede arne_v Ekspert
11. juli 2011 - 16:35 #9
moi?
Avatar billede arne_v Ekspert
08. august 2011 - 00:56 #10
??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester