[c#]SqlDatareader en EOF checken

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 26-05 21:18
Ik heb een kleine web applicatie die een x aantal records middels sqlDataReader in een XLS file zet.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
SqlConnection conn = new SqlConnection
        (ConfigurationSettings.AppSettings["connstring"]);

SqlCommand orderinfo = new SqlCommand
        ("Select * from orders where status = 1", conn);

conn.Open();
orderinfo.CommandType = CommandType.Text;
SqlDataReader drorder = orderinfo.ExecuteReader();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", 
"attachment; filename="+System.DateTime.Now.Ticks.ToString()+".xls");



Alleen ik wil van te voren checken of er uberhaupt wel iets in de DataReader zit met:
C#:
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
if(drorder.Read())
{
Response.Write("Naam\t");
Response.Write("Adres\t");
Response.Write("Postcode\t");
Response.Write("Woonplaats\t");
Response.Write("Besteldatum\t");
Response.Write("Ordernummer\t\n");//laatste komt een new line bij

//lapmiddel begin:
  Response.Write (drorder["naam"].ToString()+"\t");
  Response.Write (drorder["adres"].ToString()+"\t");
  Response.Write (drorder["postcode"].ToString()+"\t");
  Response.Write (drorder["woonplaats"].ToString()+"\t");
  Response.Write (drorder["besteldatum"].ToString()+"\t");
  Response.Write (drorder["ordernummer"].ToString()+"\t\n");
//lapmiddel eind:

//loop de db!
while(drorder.Read())
{
  Response.Write (drorder["naam"].ToString()+"\t");
  Response.Write (drorder["adres"].ToString()+"\t");
  Response.Write (drorder["postcode"].ToString()+"\t");
  Response.Write (drorder["woonplaats"].ToString()+"\t");
  Response.Write (drorder["besteldatum"].ToString()+"\t");
  Response.Write (drorder["ordernummer"].ToString()+"\t\n");
}
}else{
// geef melding
}


Het geval nu is dus, zodra je de eerste keer drorder.Read() (in het if statement) gebruikt om te checken of er wel iets in de db zit, dan zit ie al op het eerste record. Nu heb ik het imho ranzig opgelost (zie code tussen //lapmiddel) om voor de while loop en onder de "kolomheaders" al het eerste resultaat neer te zetten.

Dat is zeg maar de enige oplossing die ik kon verzinnen.

De vraag is dus: Is er iets makkelijkers te verzinnen of een of andere methode om dit beter te doen?

In vbScript was het imho makkelijker:
Visual Basic:
1
2
3
4
5
6
7
8
if not rs.eof then
   Do while not rs.eof
        ' haal data op
     rs.movenext
   Loop
else
   ' geef melding
end if


Ik heb me al klemgezocht op dotnet247.com en google, maar daar kwam ik alleen maar oplossingen tegen om 2 x naar de db te gaan en dat vind ik helemaal smerig.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Nu online
Je kunt ook dit doen:
code:
1
2
3
while (dr.Read())
{
}


Waarom doe je die eerste read in een if?
Ah, ok, ik zie het: je displayed de column header's eerst.


Ik geloof dat in .NET 1.1 de datareader ook een property of function HasRows heeft.

[ Voor 14% gewijzigd door whoami op 31-03-2004 11:38 ]

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 26-05 21:18
Nope, helaas geen HasRows. In ieder geval niet te vinden in de Dynamic help

FieldCount: maar dat is niet op (de naam zegt het al) record nivo, maar veld nivo.
RecordsAffected: alleen met T-SQL (insert, delete en update) dus niet op een select.

Verder heb ik afaik wel .net 1.1...

Even verder zoeken op MSDN :)
edit:
MSDN zegt van wel, lijkt me vrij vervelend om daarom mijn Framework te moeten upgraden.

ik maak trouwens gebruik van vs.net 2002, als ik mijn framework update, snapt vs.net dat dan ook?

[ Voor 36% gewijzigd door TeeDee op 31-03-2004 12:00 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Nu online
Je kan ook een dataset/datatable gebruiken ipv een datareader.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

TeeDee schreef op 31 maart 2004 @ 11:54:

ik maak trouwens gebruik van vs.net 2002, als ik mijn framework update, snapt vs.net dat dan ook?
ja, maar hij blijft compilen tegen 1.0.

Waarom maak je je trouwens zo druk om het aantal records? Waarom geen leeg .xls bestand teruggeven?

Waarom dump je ze niet eerst in een arraylist; de huidige methodiek vind ik vrij eng..

Stel er gaat iets fout, dan blijft je connectie open staan...

[ Voor 36% gewijzigd door gorgi_19 op 31-03-2004 12:14 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

TeeDee schreef op 31 maart 2004 @ 11:54:
ik maak trouwens gebruik van vs.net 2002, als ik mijn framework update, snapt vs.net dat dan ook?
Je framework draait wel gewoon, maar je functies van versie 1.1 zijn niet beschikbaar. Met Visual Studio .NET 2002 kun je alleen maar voor .NET Framework 1.0 devven. Je app werkt wel op het .NET Framework 1.1 maar kan niet de functie's van 1.1 gebruiken.

  • whoami
  • Registratie: December 2000
  • Nu online
Wat als je de cs compiler vervangt door de cs compiler van 1.1 ?

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

questa schreef op 31 maart 2004 @ 12:12:
[...]


Je framework draait wel gewoon, maar je functies van versie 1.1 zijn niet beschikbaar. Met Visual Studio .NET 2002 kun je alleen maar voor .NET Framework 1.0 devven. Je app werkt wel op het .NET Framework 1.1 maar kan niet de functie's van 1.1 gebruiken.
1.1 is niet 100% backwards compatible met 1.0.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

gorgi_19 schreef op 31 maart 2004 @ 12:13:
[...]
1.1 is niet 100% backwards compatible met 1.0.
Ow, dat wist ik niet. Wel iets om rekening mee te houden dan. Ik lever somige van mijn software (in VS.NET 2002 gemaakt) met .NET Framework 1.1. Bij mij werkt het allemaal nog wel. Maar is wel iets om even goed te onthouden dan.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 26-05 21:18
Dus, de HasRows functie kan ik niet gebruiken :'(

Nog even gezocht:

Volgens dit document, als ik het goed gelezen heb, moet het mogelijk zijn om het aan te passen.
A version 1.0 application installed on a system with both 1.1 and 1.0 of the Framework will run against 1.0 unless an administrator changes this behavior.
Ga ik daar maar even verder naar op zoek.

@whoami: ik wil dat eigenlijk als laatste middel gebruiken. Eerst ff uitzoeken of je het e.e.a. aan kan passen :)

edit:
Tijdens het compilen komt er wel een error, maar als je die negeert is er niks aan de hand :)

Toch nog even een vs.net 2003 licentie aanvragen :)

[ Voor 13% gewijzigd door TeeDee op 31-03-2004 12:22 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

questa schreef op 31 maart 2004 @ 12:17:
[...]


Ow, dat wist ik niet. Wel iets om rekening mee te houden dan. Ik lever somige van mijn software (in VS.NET 2002 gemaakt) met .NET Framework 1.1. Bij mij werkt het allemaal nog wel. Maar is wel iets om even goed te onthouden dan.
Mja, ze hebben een aantal dingen gesloopt en aangepast.. :X
Context.RewritePath iig en <form runat=server> in .ascx bestanden werkt ook niet goed.. Iig de zaken die ik heb gevonden.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • DanTm
  • Registratie: Juni 2002
  • Niet online
waarom niet zo?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool first = true;
while(drorder.Read())
{
  if (first)
  {
     first = false;
     Response.Write("Naam\t");
     Response.Write("Adres\t");
     Response.Write("Postcode\t");
     Response.Write("Woonplaats\t");
     Response.Write("Besteldatum\t");
     Response.Write("Ordernummer\t\n");//laatste komt een new line bij
  }
  Response.Write (drorder["naam"].ToString()+"\t");
  Response.Write (drorder["adres"].ToString()+"\t");
  Response.Write (drorder["postcode"].ToString()+"\t");
  Response.Write (drorder["woonplaats"].ToString()+"\t");
  Response.Write (drorder["besteldatum"].ToString()+"\t");
  Response.Write (drorder["ordernummer"].ToString()+"\t\n");
}

  • whoami
  • Registratie: December 2000
  • Nu online
TeeDee schreef op 31 maart 2004 @ 12:17:
Dus, de HasRows functie kan ik niet gebruiken :'(

Nog even gezocht:

Volgens dit document, als ik het goed gelezen heb, moet het mogelijk zijn om het aan te passen.
Je begrijpt het verkeerd. Als je je app build tegen .NET 1.0, dan wordt het uitgevoerd met .NET 1.0. Echter, je hebt dan die HasRows functie niet.
Een app die met 1.1 gebuild is, zal niet met 1.0 uitgevoerd worden. (Logisch).
@whoami: ik wil dat eigenlijk als laatste middel gebruiken. Eerst ff uitzoeken of je het e.e.a. aan kan passen :)
Mjah, ..... Een dataset heeft als voordeel dat je je connectie niet meer nodig hebt.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 snapt trouwens de gehele code niet; dit is toch een datagrid wat je nu na loopt te maken? :?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Nu online
gorgi_19 schreef op 31 maart 2004 @ 12:19:
[...]

Mja, ze hebben een aantal dingen gesloopt en aangepast.. :X
Context.RewritePath iig en
in .ascx bestanden werkt ook niet goed.. Iig de zaken die ik heb gevonden.
Met remoting zijn er ook een aantal aanpassingen; zie hier:
[rml][ .NET] Remoting : SecurityExceptions bij delegates[/rml]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
gorgi_19 schreef op 31 maart 2004 @ 12:25:
[...]

* gorgi_19 snapt trouwens de gehele code niet; dit is toch een datagrid wat je nu na loopt te maken? :?
Nee, het is wel een redelijk mooie oplossing eigenlijk, al heb je in iedere iteratie een extra if, die je zowiezo maximaal 1x nodig hebt eigenlijk.
-> Als je gegevens hebt, zorg er dan voor dat je eerst de column-headers schrijft, en daarna alle gegevens.

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 26-05 21:18
Ik heb nu gewoon de drorder.HasRows() erin gezet.
Vervolgens die laten compilen, bij de error door laten gaan en vervolgens werkt ie gewoon.

Maar, ik ga nog wel ff verder neuzen.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Nu online
:?
Welke error krijg je? 't Lijkt me sterk dat bij een compiler error, het build proces zomaar doorgaat, en er een exe gemaakt wordt. :?

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 31 maart 2004 @ 12:28:
[...]


Nee, het is wel een redelijk mooie oplossing eigenlijk, al heb je in iedere iteratie een extra if, die je zowiezo maximaal 1x nodig hebt eigenlijk.
-> Als je gegevens hebt, zorg er dan voor dat je eerst de column-headers schrijft, en daarna alle gegevens.
* gorgi_19 curious, why? :P

Een datareader vind ik een ontzettend eng ding, forward only, read only, databasegebonden en houdt een connectie open.. Oftewel: Deze mag imho nooit voorbij de DAL komen en hoef ik hem dus niet terug te zien in BLL of PL.

Waarom gooi je iet alles in een arraylist en bind je deze aan een datagrid.
Visual Basic .NET:
1
2
3
4
Dim dg as datagrid=new datagrid
dg.Datasource= MijnArraylist
dg.Databind()
dg.visible = MijnArraylist.Count > 0

Nu moet je er toch ook zijn?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 26-05 21:18
Compiler error:
code:
1
....

Vervolgens de vraag: Continue >Yes/No, ik klik op Yes, en daarna niks vreemds.
Misschien smerig, maar het werkt :)

Hmm, even een testje gedaan, hij compiled inderdaad niet :)

Ik lees nog even alle tips/tricks door in dit topic en ik ga weer aan de slag.
Thanks all

/edit: wat gorgi_19 zei :)

[ Voor 56% gewijzigd door TeeDee op 31-03-2004 12:32 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

Ik heb zo een vermoeden dat hij alsnog een vorige versie pakt...

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • DanTm
  • Registratie: Juni 2002
  • Niet online
gorgi_19 schreef op 31 maart 2004 @ 12:31:
[...]

* gorgi_19 curious, why? :P

Een datareader vind ik een ontzettend eng ding, forward only, read only, databasegebonden en houdt een connectie open.. Oftewel: Deze mag imho nooit voorbij de DAL komen en hoef ik hem dus niet terug te zien in BLL of PL.

Waarom gooi je iet alles in een arraylist en bind je deze aan een datagrid.
Visual Basic .NET:
1
2
3
4
Dim dg as datagrid=new datagrid
dg.Datasource= MijnArraylist
dg.Databind()
dg.visible = MijnArraylist.Count > 0

Nu moet je er toch ook zijn?
het voordeel van een datareader is de performance en (de kleinere) overhead t.o.v. een datagrid. Prima te gebruiken mits je de connectie direct sluit na gebruik en het object niet overal rondgeeft maar direct gebruikt.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

het voordeel van een datareader is de performance en (de kleinere) overhead t.o.v. een datagrid.
datareader vs arraylist neem ik aan dat je bedoeld? Idd is de overhead een stuk kleiner, maar de schaalbaarheid is ook een stuk lager dan als je een aparte DAL neemt.
Verder is in ieder geval bij mijn applicaties dit niet de grootste overhead, dus om dit stukje te optimaliseren (qua performance) vind ik eigenlijk een beetje onzin.

Je kan dan veel beter bijvoorbeeld een Outputcache;levert meer op qua performance.

[ Voor 16% gewijzigd door gorgi_19 op 31-03-2004 13:07 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Nu online
gorgi_19 schreef op 31 maart 2004 @ 12:31:
[...]

* gorgi_19 curious, why? :P

Een datareader vind ik een ontzettend eng ding, forward only, read only, databasegebonden en houdt een connectie open.. Oftewel: Deze mag imho nooit voorbij de DAL komen en hoef ik hem dus niet terug te zien in BLL of PL.
Daar geef ik je gelijk in.
Waarom gooi je iet alles in een arraylist en bind je deze aan een datagrid.
Dan kan je imo even goed een datatable gebruiken.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 31 maart 2004 @ 13:10:
Dan kan je imo even goed een datatable gebruiken.
't is een voorkeur; ik gooi liever een object in een arraylist en die ga ik m'n applicatie rondgooien. :) Voor dit voorbeeld zou het niet uitmaken.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • DanTm
  • Registratie: Juni 2002
  • Niet online
gorgi_19 schreef op 31 maart 2004 @ 12:39:
[...]

datareader vs arraylist neem ik aan dat je bedoeld? Idd is de overhead een stuk kleiner, maar de schaalbaarheid is ook een stuk lager dan als je een aparte DAL neemt.
Verder is in ieder geval bij mijn applicaties dit niet de grootste overhead, dus om dit stukje te optimaliseren (qua performance) vind ik eigenlijk een beetje onzin.

Je kan dan veel beter bijvoorbeeld een Outputcache;levert meer op qua performance.
sorry.. zat de denken dat je een dataset bedoelde :)
maar voor het vullen van de arraylist heb je nog steeds een datareader/dataset nodig om de gegevens uit de db te halen.. maar goed .. we gaan lekker offtopic hier :)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

DanTm schreef op 31 maart 2004 @ 13:20:
[...]


sorry.. zat de denken dat je een dataset bedoelde :)
maar voor het vullen van de arraylist heb je nog steeds een datareader/dataset nodig om de gegevens uit de db te halen.. maar goed .. we gaan lekker offtopic hier :)
Dat wel, ik heb zelf een DAL en deze vult mbv een Datareader een arraylist met mijn eigen classes. Deze arraylist stuur ik vervolgens de rest van de applicatie in. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1