Avatar billede bongo20 Nybegynder
26. september 2005 - 21:07 Der er 15 kommentarer og
1 løsning

nextresult i datareader

Hej

Jeg vil godt have flere resultater i min datareader.
Jeg har prøvet sådan her:

sqlStr = "Select Count(*) From t1; Select Count(*) From t2;";
  dReader = DB.Query(sqlStr, Conn);
  if  (dReader.Read())
  {
      sOutPut = dReader.GetInt32(0).ToString();
      dReader.NextResult();
      sOutPut = dReader.GetInt32(0).ToString();
  }
dReader.Close();

I denne situation får jeg denne meddelelse:
Invalid attempt to read when no data is present.

Der burde være data i der. Nogen der kan se hvad der er galt?

:o)
Avatar billede davidfossil Nybegynder
26. september 2005 - 21:19 #1
Det er metoden Read() du skal bruge til at iterere med:

while (dReader.Read())
{
  // udskriv data
}
Avatar billede arne_v Ekspert
26. september 2005 - 21:21 #2
.Read henter næste række

.NextResulthenter næste result set (stored procedure som returnerer mere end
et result set)
Avatar billede bongo20 Nybegynder
26. september 2005 - 21:31 #3
Jamen arne er det ikke to resultset jeg forsøger at hente her ?
Avatar billede arne_v Ekspert
26. september 2005 - 21:34 #4
"forsøger" er nok det rigtige ord

du kan næppe hente 2 result set med et query kald selvom du putter 2 x SELECT
i din SQL
Avatar billede arne_v Ekspert
26. september 2005 - 21:34 #5
du kan med en SQLServer stored procedure
Avatar billede driis Nybegynder
26. september 2005 - 21:35 #6
Jeg har ikke testet, men:

sqlStr = "Select Count(*) From t1; Select Count(*) From t2;";
  dReader = DB.Query(sqlStr, Conn);
  if  (dReader.Read())
  {
      sOutPut = dReader.GetInt32(0).ToString();
      dReader.NextResult();
      dReader.Read();
      sOutPut = dReader.GetInt32(0).ToString();
  }
dReader.Close();
Avatar billede bongo20 Nybegynder
26. september 2005 - 21:35 #7
ok,.. hvis man gør det i en stored procedure, er det så noget med 2X execute query ?
Avatar billede bongo20 Nybegynder
26. september 2005 - 21:37 #8
ja for pokker da driis,.. det virker da,..  :o)
Avatar billede driis Nybegynder
26. september 2005 - 21:37 #9
Ovenstående burde virke, hvis dit query rent faktisk returnerer 2 resultset; det skulle jeg mene det gør.

Men læg dog mærke til at du overskriver indholdet af sOutput i det andet kald til GetInt32
Avatar billede arne_v Ekspert
26. september 2005 - 21:38 #10
nej - kun 1 x execute stored procedure
Avatar billede driis Nybegynder
26. september 2005 - 21:39 #11
Finten er blot at du skal positionere readeren ved første resultat i andet resultset - præcist som med første resultset ;-) I øvrigt burde du nok tjekke at andet kald til dReader.Read også returnerer true, før du forsøger at læse.
Avatar billede bongo20 Nybegynder
26. september 2005 - 21:39 #12
ja det så jeg lige driis,.. men det virker glimrende. Bør jeg bruge en stored procedure alligevel ?
Avatar billede driis Nybegynder
26. september 2005 - 21:41 #13
I øvrigt er jeg enig med arne i, at stored procedures er en bedre løsning end ad-hoc SQL i koden. Bl.a. idet der så også foregår typecheck på serveren, så du er lidt bedre beskyttet mod SQL injections (men husk behørig validering alligevel).
Avatar billede bongo20 Nybegynder
26. september 2005 - 22:00 #14
tak for hjælpen begge,.. driis får pointene idet jeg indtil videre bruger den løsning

:o)
Avatar billede davidfossil Nybegynder
27. september 2005 - 15:20 #15
Sorry, jeg læste ikke din sql sætning inden jeg skrev i går...

Måske en detalje, men det fanger mig:
Du tester om der er en række i den første tabel, inden du henter værdien. Ved den anden tabel antager du blot at der nok er en række... Det sidste er sådan set fint nok, idet COUNT(*) altid vil returnere et eller andet. Mit forslag er altså: fjern "if  (dReader.Read())" - den er redundant.
Avatar billede arne_v Ekspert
27. september 2005 - 15:42 #16
man skal altid kalde Read fordi inden første kald til Read står man før første række
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