Avatar billede tjgrindsted Nybegynder
03. april 2007 - 23:40 Der er 19 kommentarer og
2 løsninger

Reader eller DataSet

Hej

Kalp Har været så flink at hjælpe mig en del http://www.eksperten.dk/spm/771010

Han lavede en løsning i Reader, hvor jeg kiggede efter noget DataSet, men jeg kan se at Reader minder meget om det gamle:

If Not (objRS.BOF Or objRS.EOF) Then
..
Do While Not objRS.EOF
...
objRS.MoveNext
...
Loop

- Men kan se at man i .Net bruger Try Finally osv. men hvad erstatter MoveNext og de andre ting !?

- Samt bør man både Dispose og Close i en Reader !?

- Samt i DataSet kan flg. bruges:
        RepeaterImagesList.DataSource = DBDataView
        RepeaterImagesList.DataBind()
  kan det bruges i en Reader også og evt. hvordan !?

- Hvad er egentligt bedst Reader eller DataSet !?

Sidste ting jeg har ud fra Kalp's CSharp kode lavet flg. er det, det mest optimale eller kan den skrives bedre !?

    Public Sub OpenDB()
        Dim ObjConn As OleDbConnection
        Dim ObjCmd As OleDbCommand
        Dim ObjReader As OleDbDataReader

        Dim ConnectionString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
        ObjConn = New OleDbConnection(ConnectionString)
        ObjCmd = New OleDbCommand("select count(date) as amount,date from somestuff where date not like( SELECT TOP 1 date FROM somestuff ORDER BY date DESC) group by date order by date desc", ObjConn)
        ObjConn.Open()
        ObjReader = ObjCmd.ExecuteReader()

        While ObjReader.Read()

            Response.Write(("(" & ObjReader("amount").ToString() & ") billeder fra " & CType(ObjReader("date"), DateTime).ToString("dd-MM-yy")))
            Response.Write("<br />")

        End While
        'Lukker Connection og Sletter Hukommelse.
        ObjReader.Dispose()
        ObjReader.Close()
        ObjConn.Dispose()
        ObjConn.Close()
    End Sub
Avatar billede erikjacobsen Ekspert
03. april 2007 - 23:45 #1
Det er typisk en smule hurtigere at bruge en datareader. Men man kan kun have een i gang pr. connection. Husk at lukke den i finally. Altid - jeg taler af erfaring.

ObjReader.Read() "indeholder" din movenext.
Avatar billede tjgrindsted Nybegynder
03. april 2007 - 23:56 #2
CITAT: kan kun have een i gang pr. connection
Så jeg skal lave flere forskellige ConnectionStrings i min Web.Config med Reader hvor med DataSet der kan jeg bruge samme ConnectionString !??

I Finally !?? hvor skal jeg sætte denne ind henne !?
Avatar billede tjgrindsted Nybegynder
03. april 2007 - 23:59 #3
Er det sådan her du mener


    Public Sub OpenDB()
        Dim ObjConn As OleDbConnection
        Dim ObjCmd As OleDbCommand
        Dim ObjReader As OleDbDataReader

        Dim ConnectionString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
        ObjConn = New OleDbConnection(ConnectionString)
        ObjCmd = New OleDbCommand("select count(date) as amount,date from somestuff where date not like( SELECT TOP 1 date FROM somestuff ORDER BY date DESC) group by date order by date desc", ObjConn)
        ObjConn.Open()
        ObjReader = ObjCmd.ExecuteReader()
   
      Try

        While ObjReader.Read()

            Response.Write(("(" & ObjReader("amount").ToString() & ") billeder fra " & CType(ObjReader("date"), DateTime).ToString("dd-MM-yy")))
            Response.Write("<br />")

        End While
        'Lukker Connection og Sletter Hukommelse.
        ObjReader.Dispose()
        ObjReader.Close()

    Finally

        ObjConn.Dispose()
        ObjConn.Close()
    End Sub
Avatar billede erikjacobsen Ekspert
04. april 2007 - 00:08 #4
1) Nej, du skal generelt kun have een connection i gang. Der menes blot at du skal gøre en datareader færdig, før du begynder på en anden. Evt. gemme resultatet.

2) Jeg kan ikke se at du lukker din datareader i "finally".
Avatar billede kalp Novice
04. april 2007 - 09:12 #5
- Men kan se at man i .Net bruger Try Finally osv. men hvad erstatter MoveNext og de andre ting !?


Den fungere via. en while loop og metoden Read() som findes i reader objektet.. m
kan se at det har du med i din kode ovenover:)


- Samt bør man både Dispose og Close i en Reader !?

Ja du bør selv rydde op efter dig hvis ikke du gør som mig og anvender "using" blokke.. (ved ikke om man kan i VB.. tvivler jeg på)

- Hvad er egentligt bedst Reader eller DataSet !?

Jeg kan bedst lide Reader, men har også benyttet DataSet før til hurtig fremvisning af data.

ps. i din kode bør du også kunne lukke din database forbindelse i metoden
ObjCmd.ExecuteReader(---> her <---)

der kan du igen se i min kode hvordan jeg gør
Avatar billede snepnet Nybegynder
04. april 2007 - 09:20 #6
Du kan godt arbejde med flere resultsets på samme forbindelse med .net 2.0:
http://search.live.com/results.aspx?q=.net+2.0+MARS+sample&mkt=en-us&FORM=LIVSOP&go.x=0&go.y=0&go=Search
Og her er der lidt kode:
http://www.devx.com/dbzone/Article/30132/0/page/2
Mvh
Avatar billede tjgrindsted Nybegynder
04. april 2007 - 10:39 #7
Jeg er blevet så meget klogere og fem øren er virklige faldet, jeg kan kun vise stor respekt :)

Kun lige en lille ting no row i DataSet hvordan kan den anvendes i Reader så den response.write(r) en linje hvis der ikke findes noget i min DB. !?

Og vil i alle 3 smide et svar.

@Erikjacobsen
Skal ObjReader også ned i Finally !?

@Kalp
Hvordan lukker jeg ObjCmd.ExecuteReader !?

@Snepnet
1000 tak for de gode link.
Avatar billede kalp Novice
04. april 2007 - 10:49 #8
når du ved at det er sidste kald der skal laves til databasen gør du dette (så lukker command forbindelsen efter sig)
ObjCmd.ExecuteReader(CommandBehavior.CloseConnection)
Avatar billede kalp Novice
04. april 2007 - 10:54 #9
du kan lave mange forskellige tjek på om den skal udskrive noget..

en mulighed

if(dataset.Tables[0].Rows[0].Count == 0)
{
Response.Write("Tom række");
}
else
{
løb igennem
}


mener nok der er en count..
Avatar billede erikjacobsen Ekspert
04. april 2007 - 10:54 #10
Ingen point til mig, tak.

Du skal generelt, hvis det er muligt at overskue i programmet, åbne een connection, og lukke den efter du har brugt den, måske til flere ting - ikke nødvendigvis efter hver eneste ting du gør på databasen. Derfor er det ikke sikkert connection du skal lukke i finally, men altid din datareader. Kommer der fejl, vil du på den måde altid få den lukket. Men rimeligvis skal du så også gøre noget fornuftigt (catch), hvis der er en fejl.
Avatar billede kalp Novice
04. april 2007 - 10:54 #11
det er noget med at [] skal være () i vb
Avatar billede erikjacobsen Ekspert
04. april 2007 - 10:56 #12
En nem måde:

  dim count as int32 = 0
  While ObjReader.Read()
    count=count+1
    '...
  end while
  if count>0 then
    Response.Write("I alt " & count & " rækker")
  else
    Response.Write("Ingen bananer i dag")
  end if
Avatar billede tjgrindsted Nybegynder
04. april 2007 - 11:38 #13
Kunne jeg evt. få en af jer til lige at færdigskrive den Kalp har lavet som er oversat til VB.NET (tjgrindsted 03/04-2007 23:59:20) så det både laver en fejl tekst hvis der ingen data er og lukker connection og reader mm. de rigtige steder.
Avatar billede erikjacobsen Ekspert
04. april 2007 - 12:24 #14
Og så glemte vi jo lige den vigtigste anvendelse af et DataSet - nemlig til de indbyggede komponenter, hvis man kan "nøjes" med dem. 5 klik med musen, og man har en applikation, der kan vise og rette i en tabel i en database ;)
Avatar billede tjgrindsted Nybegynder
04. april 2007 - 16:02 #15
Hvis jeg vil bruge dette til noget Repeater altså som noget DataSet er det så noget alá

    Public Sub OpenDB()
        Dim ObjConn As OleDbConnection
        Dim ObjCmd As OleDbCommand
        Dim ObjReader As OleDbDataReader

        Dim ConnectionString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
        ObjConn = New OleDbConnection(ConnectionString)
        ObjCmd = New OleDbCommand("select count(date) as amount,date from somestuff where date not like( SELECT TOP 1 date FROM somestuff ORDER BY date DESC) group by date order by date desc", ObjConn)
          Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(sql, connection)
                Dim ds As New DataSet()
                adapter.Fill(ds, "SourceTable")
            End Using

    End Sub
Avatar billede tjgrindsted Nybegynder
04. april 2007 - 16:04 #16
mente

    Public Sub OpenDB()
        Dim ObjConn As OleDbConnection
        Dim ObjCmd As OleDbCommand
        Dim ObjReader As OleDbDataReader

        Dim ConnectionString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
        ObjConn = New OleDbConnection(ConnectionString)
        ObjCmd = New OleDbCommand("select count(date) as amount,date from somestuff where date not like( SELECT TOP 1 date FROM somestuff ORDER BY date DESC) group by date order by date desc", ObjConn)
          Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(ObjCmd, ConnectionString)
                Dim ds As New DataSet()
                adapter.Fill(ds, "Tabelnavn")
            End Using

    End Sub
Avatar billede websam Nybegynder
04. april 2007 - 20:21 #17
Jeg må lige henlede din opmærksomhed på arrays og collections af data der er omkring 30 gange hurtigere end et dataset med data.

Og med de fine muligheder for at cache data får du en super hurtig app ;o)

/Websam
Avatar billede tjgrindsted Nybegynder
04. april 2007 - 21:16 #18
@ Websam

Vi du komme nærmere ind på hvad du mener !?
Avatar billede tjgrindsted Nybegynder
26. april 2007 - 12:17 #19
@Kalp
Vil du lægge et svar !?

@Snepnet
Vil du lægge et svar !?
Avatar billede kalp Novice
26. april 2007 - 13:04 #20
:)
Avatar billede snepnet Nybegynder
26. april 2007 - 18:57 #21
Ok :o)
Mvh
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



IT-JOB

Udviklings- og Forenklingsstyrelsen

Webanalytiker til digitale løsninger

Cognizant Technology Solutions Denmark ApS

Senior Delivery Manager