webForumDet fria alternativet

C# och OleDbDataReader - bara en post syns

.NET

7 svar · 265 visningar · startad av m_soderlund

Medlem sedan sep. 20026 425 inlägg
Frågan#1

Jag använder koden nedan för att försöka skriva ut alla poster från en databas.
Nu är det så att koden nedan enbart skriver ut en post av cirka 1200. :(
Det spelar heller ingen roll ifall om jag i stället skriver
Console.WriteLine(objDataReader["Namn"].ToString() + "<br />";), och det vill jag heller inte göra, eftersom HTML-koden inte blir korrekt då.
Vad kan vara problemet?

<%@ Page Language="C#" Strict="True" Debug="True" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

    void Page_Load(object sender,EventArgs e)
     {
         string CnStr = "Provider=Microsoft.Jet.OLEDB.4.0;data source=" + Server.MapPath("../db2.mdb");
         string SQL = "SELECT namn FROM tbl";

         OleDbConnection Cn = new OleDbConnection(CnStr);
         OleDbCommand Cm = new OleDbCommand(SQL,Cn);

         Cn.Open();

         //skapa ett OleDbDataReader-objekt
         OleDbDataReader objDataReader = Cm.ExecuteReader();

         while(objDataReader.Read())
         {
         //vi skriver ut all data
         lbl1.Text = objDataReader["Namn"].ToString() + "<br />";
         }

         //stäng objekt
         objDataReader.Close();
         Cn.Close();
     }

</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head>
    <title>C# OleDbDataReader-iteration</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>

<body>

    <form runat="server">
        <asp:label id="lbl1" runat="server"></asp:label>
    </form>

</body>
</html>

Tacksam för all hjälp jag kan få. :)

Medlem sedan juli 20011 304 inlägg
#2

Du skriver ut allt - det är bara det att du skriver över det hela tiden :)

Om du bara vill se vad som händer kan du skriva:

lbl1.Text += objDataReader["Namn"].ToString() + "<br />";

Annars rekommenderar jag att du använder en repeater

Medlem sedan sep. 20026 425 inlägg
#3

Tack! Det var nästan det jag tyckte, men fick inte ihop syntaxen i C#. Varför ska jag använda repeater i stället? Det är ju ytterligare något som tar på prestandan, eller..? Dessutom är min kod ovan kompilerad, medan man med repeater måste slänga in ett par renderingstaggar i HTML-koden - vilket jag inte vill. :)

<%#DataBinder.Eval(Container.DataItem, "Namn") %>
Medlem sedan juli 20011 304 inlägg
#4

Att använda en label till att fylla massa html i är lite underligt.

Det var därför jag tyckte att du skulle använda en repeater. Det blir bättre kod och dessutom vill man ju oftast ha någon sorts design på sin sida och inte bara text :).

Den prestandan du förlorar där är knappt mätbar.

Men om du är ute efter att slippa serverkontroller borde du ju skippa labeln och använda response.write

Medlem sedan maj 20012 812 inlägg
#5

Varför ska jag använda repeater i stället? Det är ju ytterligare något som tar på prestandan, eller..?

Skulle tänka mig att det tar bra mycket mer prestanda att bygga ut din sträng i din label som du gör istället för att använda en repeater.

Att lägga ihop två strängar med + är grymt prestanda förbrukande jämfört med att använda sig av stringbuilder. Att man använder sig av repeater gör att man använder de verktyg och komponenter på ett korrekt och riktigt sätt.

En tankeställare, på hur många ställen har du sätt att man använder sig av din lösning istället för en repeater? Det finns garanterat en anledning till det och det är bland annat att man kan separerar layout och data totalt, i din kod har du skrivit in ett HTML-kommando. I just detta fallet så var det bara ett br, men vad händer om du vill göra mer komplexa lösningar med tabeller och kolumner, skall du då göra denna HTML kod i din codebehind.

Är du uteefter att slippa DataBinder som använder sig av reflextions som är lite långsamt, så använder man sig istället av eventet Item_DataBound och binder sin data till sina kontroller i repeatern och slipper däremed DataBinder kommandot i din HTML-kod.

Du gör givetviss som du vill, men varför inte göra det rätt när man ändå håller på.

- Magnus

Medlem sedan sep. 20026 425 inlägg
#6

Oj, tack för det där uttömmande svaret, Magnus! Hädanefter håller jag mig till Repeater. :)

Medlem sedan maj 20012 812 inlägg
#7

Det gör du rätt i. Repeaters och DataReaders (egna collections är mycket bättre, men då använder vi ändå readers/DataTables till att fylla dem med) är vägen till lycka i .NET världen.

Håll dig ifrån DataSet och DataGrids så mycket du kan, de fyller sin funktion, men bör användas med omtanke.

- Magnus

Medlem sedan sep. 20026 425 inlägg
#8

Go Gladh! :D :bire

268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)