Avatar billede briank Nybegynder
16. marts 2002 - 18:20 Der er 15 kommentarer og
1 løsning

OleDbDataReader -> Dataset

Hej

Er der nogen som kan beskrive hvorledes man på en enkelt måde får læst indholdet af en OleDbDataReader over i et dataset, gerne illustreret med et eksempel.
Avatar billede nute Nybegynder
16. marts 2002 - 18:34 #1
OleDbConnection conn = new OleDbConnection([connectionstring]);

OleDbCommand selectCMD = new OleDbCommand("SELECT * FROM tabell", conn);

OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
custDA.SelectCommand = selectCMD;

DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet, "EtNavn");

hvis du søker i dokumentasjonen din, så vil du finne ekspempler på dette ;)

/nute
Avatar billede reffak Nybegynder
16. marts 2002 - 18:35 #2
Hej
Ikke for at være på tværs, men jeg tror ikke det, der er tiltænkt med en OleDbDataReader. Ifølge MSDN :
"Provides a way of reading a forward-only stream of data rows from a data source"

-"From a datasource". Dvs, du skal have en datasource, før du kan bruge en reader. Og hvis du har en datasource, så er det fra DENNE, og ikke readeren, du skal lave dit dataset.
Hvis du har brug for at fylde et dataset, skal du altså have en source, og så anvende en OleDbDataAdapter til at fylde datasættet (faktisk har sådan en adapter en funktion der hedder fill - meget sigende). Dermed slet ikke anvende en reader.
Avatar billede reffak Nybegynder
16. marts 2002 - 18:37 #3
...Ja, nu hvor jeg kan se nute's svar, er det tydeligt han er inde på netop denne løsning.

High-five nute :-)

MVH
Avatar billede brynil Nybegynder
16. marts 2002 - 18:42 #4
Den her virker for mig.
<%@ Import namespace="system.data" %>
<%@ import namespace="system.data.oledb" %>

<Script language="vb" runat="server">
    sub page_load(obj as Object, e as EventArgs)

        dim objConn as new OleDbConnection ("Provider=Microsoft.Jet.OleDb.4.0;" & "Data Source=d:\samsasp\dag08\lmspost.mdb")

        dim objCmd as new OleDbDataAdapter ("SELECT sebehandling, sagsemne, prioritet, dato, behandler, behhjem FROM sag", objConn)

        dim ds as DataSet = new DataSet()
        objCmd.Fill(ds, "sag")

        MyDataList.DataSource = ds.Tables("sag"). Defaultview
        MyDataList.DataBind()
    end sub
</script>

<html><body>
    <asp:DataList id="MyDataList" RepeatColumns="2"
        RepeatDirection="Vertical" runat="server">
        <ItemTemplate>
            <div style="padding:15,15,15,15; font-size:8pt; font-family:Verdana">
            <div style="font:8pt; font-family:verdana; color:darkblue">
            <i><b>
                  <%# DataBinder.Eval(Container.DataItem, "sebehandling")%>&nbsp;
                  <%# DataBinder.Eval(Container.DataItem, "sagsemne")%>
            </i></b>
            </div>
            <br>
            <b>Prior: </b><%# DataBinder.Eval(Container.DataItem, "Prioritet")%><br>
            <b>Dato: </b><%# DataBinder.Eval(Container.DataItem, "Dato")%><br>
            <b>Behandler: </b><%# DataBinder.Eval(Container.DataItem, "Behandler")%><br>
            <b>BehHjem: </b><%# DataBinder.Eval(Container.DataItem, "behhjem")%><br>
            </div>
       
        </ItemTemplate>
    </asp:DataList>
</body></html>
Avatar billede nute Nybegynder
16. marts 2002 - 18:45 #5
jeg ville nok personlig gjort det på en litt annen måte. Det er litt dobbelt arbeide å først opprette en datareader for så å legge det inn i et dataset. et dataset bygger jo ovenpå en datareader, så ....

jeg ville gjort:

OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM tabel", connectionObject );
DataSet dataSet = new DataSet();
dataAdapter.Fill( dataSet, "EtNavn" );

/nute
Avatar billede briank Nybegynder
16. marts 2002 - 18:49 #6
Hej igen

Mit problem er føgende : jeg modtager f.eks 12 rækker fra min datareader som den fint returnere til aspx-side hvor jeg binder resultatet MEN jeg ønsker kun at benytte de 10 af de 12 rækker. Jeg kan bare ikke finde ud af hvorledes jeg får den fjernet inden jeg returnerer for at binde.

Har lige pastet lidt af min kode for forklare hvad jeg har gang i :-)

            TopCount = 10;
            BKConsult.LinksDB links = new BKConsult.LinksDB();
            TopLinks.DataSource = links.GetTopLinks(TopCount);
            TopLinks.DataBind();

--------------------------------------------------------------------

        public OleDbDataReader GetTopLinks(int topCount)
        {

            string strDSN = ConfigurationSettings.AppSettings["LinkbasenConStr"];
            string strSQL = " SELECT TOP " + topCount + " * " +
                            " FROM BOOKMARKS " +
                            " WHERE account_id = 30" +
                            " ORDER BY hit desc ";

            // create Objects of ADOConnection and ADOCommand
            OleDbConnection myConn = new OleDbConnection(strDSN);
            OleDbCommand myCmd = new OleDbCommand( strSQL, myConn );
            OleDbDataReader result = null;
            OleDbDataAdapter da = new OleDbDataAdapter();

            myConn.Open();
            result = myCmd.ExecuteReader();
           
            return result;
Avatar billede nute Nybegynder
16. marts 2002 - 18:52 #7
ehhh....hvis du ikke skal til med paging, hvorfor iikke bare sette betingelser i din SQL ? ved kun å hente ut de 10 "øverste"/nyeste records ?
Avatar billede briank Nybegynder
16. marts 2002 - 18:52 #8
Ideen var at en datareader skulle være den hurtigste måde at læse på MEN jeg er ny i .NET og fumler lidt i blinde :-))
Avatar billede briank Nybegynder
16. marts 2002 - 18:54 #9
problemet er at min top 10 linkliste kan returnere mere en 10 link hvis flere link har den samme hit-counter.
Avatar billede nute Nybegynder
16. marts 2002 - 18:55 #10
en datareader *er* den hurtigste måte å lese på, og hvis du kun skal lese fra databasen og skrive resultater ut, så er det jo ingen hensikt å benytte noe annet...

men når jeg kikker på din seneste posting, så sender du jo med hvor mange du skal vise (topCount)...vil ikke dette parameter bestemme hvor mange records du skriver ut ?
Avatar billede nute Nybegynder
16. marts 2002 - 18:56 #11
hmmm....så kan du jo gjøre følgende...

result = myCmd.ExecuteReader();
int counter = 0;

while( reader.Read() && counter < 10 ){
  //skriv ut en record
  counter++;
}

/nute
Avatar billede briank Nybegynder
16. marts 2002 - 19:03 #12
Jeg har leget lidt med sql-udtrykket

"SELECT TOP 10 * " +
" FROM BOOKMARKS " +
" WHERE account_id = 30" +
" ORDER BY hit desc "

og jeg får som tidligere nævnt IKKE ALTID 10 rækker tilbage hvis flere rækker har samme antal hits :


rk1  : 34
rk2  : 33
rk3  : 32
rk4  : 31
rk5  : 30
rk6  : 20
rk7  : 19
rk8  : 18
rk9  : 17
rk10 : 16
rk11 : 16
rk12 : 16
Avatar billede briank Nybegynder
16. marts 2002 - 19:07 #13
men jeg skal returnerer datareaderen RESULT og skal gerne have fjernet de 2 sidste rækker inden jeg binder eller hvad ?
Avatar billede nute Nybegynder
16. marts 2002 - 19:12 #14
som reffak påpekte, så kan du ikke fjerne rekker i en DataReader. Dette er en 'forward-only' stream som ikke kan manipuleres. hvis du ikke kan få din SQL til kun å returnere 10 rekker, så skal du gjøre som jeg foreslo i min posting @ 16/03-2002 18:56:58

/nute
Avatar billede briank Nybegynder
16. marts 2002 - 19:19 #15
ok, svaret er forstået og jeg vil gerne give dig de 30 point som tak for hjælpen nute :-)

Send lige et svar, og tak igen :-))
Avatar billede nute Nybegynder
16. marts 2002 - 19:23 #16
jeg håper du kan bruke det til noe :-)

takker...
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