Ik heb een kleine web applicatie die een x aantal records middels sqlDataReader in een XLS file zet.
Alleen ik wil van te voren checken of er uberhaupt wel iets in de DataReader zit met:
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:
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.
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