Avatar billede skindbeni Nybegynder
21. juli 2010 - 13:59 Der er 5 kommentarer og
1 løsning

ASP.NET (.VB) - Anvendelse af count (SQL) - kan det skrives pænere

Hej.

På en webside ønsker jeg at hente nogle nyheder ind i min webside. Der er plads til de seneste 6 nyheder på forsiden. For at siden ikke ser dum ud vil jeg gøre nogle elementer usynlige så fremt der ikke er op til 6 nyheder pt. 8ellers står labelens standardtekst og forvirrer.

Kan nedenstående kode skrivs bedre og pænere? (Den er ikke fuldent)


Imports System.Data
Imports System.Data.SqlClient

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim NewsConnection As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("FrejaConnectionString").ConnectionString)

        Dim NewsReader As SqlDataReader
        Dim NewsCommand As SqlCommand

        Dim NewsSQL As String = ""
        NewsSQL = "SELECT TOP 6 Overskrift, LEFT(Indhold, 5000) AS Indhold, Forfatter, Dato FROM nyheder ORDER BY Dato"
        NewsCommand = New SqlCommand(NewsSQL, NewsConnection)

        Dim AntalSQL As String = ""
        AntalSQL = "SELECT count(*) as antalnyheder FROM nyheder"
        Dim AntalCommand As SqlCommand = New SqlCommand(AntalSQL, NewsConnection)

        NewsConnection.Open()
        NewsReader = NewsCommand.ExecuteReader()

        Dim lblOverskriftArr As Label() = New Label() {lblNyhed1Overskrift, lblNyhed2Overskrift, lblNyhed3Overskrift, lblNyhed4Overskrift, lblNyhed5Overskrift, lblNyhed6Overskrift}
        Dim lblDatoArr As Label() = New Label() {lblNyhed1Dato, lblNyhed2Dato, lblNyhed3Dato, lblNyhed4Dato, lblNyhed5Dato, lblNyhed6Dato}
        Dim lblIndholdArr As Label() = New Label() {lblNyhed1Indhold, lblNyhed2Indhold, lblNyhed3Indhold, lblNyhed4Indhold, lblNyhed5Indhold, lblNyhed6Indhold}

        Dim i As Integer = 0
        While NewsReader.Read = True
            lblOverskriftArr(i).Text = NewsReader("Overskrift").ToString.Trim()
            'lblDatoArr(i).Text = CType(NewsReader("NyhedsDato"), DateTime).ToString("dddd")
            lblNyhed1Dato.Text = CType(NewsReader("Dato"), DateTime).ToString("dddd d. MMMM yyyy")
            'lblDatoArr(i).Text = CType(NewsReader("Dato"), DateTime).ToString("dddd 'd.' d. MMMM yyyy") + CType(NewsReader("Tid"), DateTime).ToString("' kl. ' HH.mm")
            lblIndholdArr(i).Text = Server.HtmlDecode(NewsReader("Indhold").ToString.Trim())
            i = i + 1
        End While

        NewsReader.Close()



        Dim AntalREader As SqlDataReader
        AntalREader = AntalCommand.ExecuteReader()

        Dim Antal As Integer
        AntalREader.Read()
        Antal = AntalREader("antalnyheder")

        If Antal = 2 Then
            lblNyhed2Dato.Visible = False
        End If
        AntalREader.Close()

        NewsConnection.Close()
    End Sub
End Class
Avatar billede arne_v Ekspert
21. juli 2010 - 14:38 #1
Umiddelbart tror jeg at du skal erstatte:

SqlDataReader -> web page

med:

SqlDataReader -> data struktur -> web page

Den data struktur kan f.eks. vaere en List of X, hvor X er custom data klasse.

Saa ved du web pagen hvor mange elementer der er etc..
Avatar billede madand Nybegynder
21. juli 2010 - 14:40 #2
Nu er jeg ikke lige den skarpeste til VB.NET men du kan ligge din SQLConnection, SQLDataReader, SQLCommand osv. ind i en using statement, da de automatisk laver Dispose. Så slipper du for
NewsReader.Close()
NewsConnection.Close() osv.

Her er eksempel:
Using conn As New SqlConnection(dsn)
  Using cmd As New SqlCommand("SELECT * FROM Employees", conn)
    conn.Open()
      Using rdr As SqlDataReader = cmd.ExecuteReader()
        While rdr.Read()
          Console.WriteLine(rdr(0))
        End While
      End Using
  End Using
End Using
Avatar billede skindbeni Nybegynder
21. juli 2010 - 14:48 #3
Hej Arne.

Det var lige en tand eller 2 over mit niveau, men du skal have tak for dit bidrag alligevel.

Jeg afventer lige og ser, hvad der ellers kommer ind inden jeg uddeler points.
Avatar billede Pulchra Nybegynder
22. juli 2010 - 01:03 #4
Jeg synes at der er mange potentielle problemer i din kode. Men om jeg skal komme med en løsning til dit specifikke spørgsmål, så ville det være at bruge en Repeater (Her er en simpel forklaring + eksempel http://www.aspnettutorials.com/tutorials/controls/repeater-vb.aspx) til at rendere dine nyheder.

Her er nogle kode fragmenter du måske kan bruge.
Noget lignende ville være i din markup (*.aspx fil)

    <form id="form1" runat="server">
    <div>
        <asp:Repeater ID="Repeater1" runat="server">
            <ItemTemplate>
                <div>
                    <%# Eval("Headline")%>
                </div>
                <div>
                    <%# Eval("Content")%>
                </div>
                <div>
                    <%# Eval("Author")%>
                </div>
                <div>
                    <%# Eval("Date")%>
                </div>
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>

Og så ville jeg ændre din Code behind fil (*.aspx.cs)
Til noget lignende:

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim NewsConnection As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("FrejaConnectionString").ConnectionString)

        Dim NewsReader As SqlDataReader
        Dim NewsCommand As SqlCommand

        Dim NewsSQL As String = ""
        NewsSQL = "SELECT TOP 6 Overskrift, LEFT(Indhold, 5000) AS Indhold, Forfatter, Dato FROM nyheder ORDER BY Dato"
        NewsCommand = New SqlCommand(NewsSQL, NewsConnection)

        NewsConnection.Open()
        NewsReader = NewsCommand.ExecuteReader()
       
        Dim newsItems As List<NewsItem> = new List<NewsItem>();

          While NewsReader.Read = True
            Dim newsItem As NewsItem = new NewsItem()
            newsItem.Headline = NewsReader("Overskrift").ToString.Trim()
            newsItem.Date = CType(NewsReader("NyhedsDato"), DateTime).ToString("dddd")
            newsItem.Content = Server.HtmlDecode(NewsReader("Indhold").ToString.Trim())
            newsItems.Add(newsItem);
          End While

        NewsReader.Close()

        Repeater1.DataSource = newsItems;
        Repeater1.DataBind();

        NewsConnection.Close()
    End Sub
End Class


Her er så den simple container klasse jeg bruger i koden.

    class NewsItem
    {
        public string Headline { get; set; }
        public string Content { get; set; }
        public string Author { get; set; }
        public DateTime Date { get; set; }
    }


Alt dette skulle gøre at om nu der f.eks. er 4 resultater i din førespørgsel, så vil kun den nødvendige html der skal til for at rendere disse 4 resultater blive generet.
Der er nok andre detejler omkring Repeater kontrollen, du vil have et behov for at vide om for at kunne bruge den effektivt, så er det bare at søge på nettet, hvor der er et hav af meteriale omkring emnet :)
Håber bare dette eksempel har givet dig en ide om hvad den kan bruges til.

obs! Denne kode er stykket sammen uden kompilerings muligeder + mine forfærdelige VB kundskaber, så du bliver nok nød at rydde op i det før det kompilerer.

/Hallur
Avatar billede arne_v Ekspert
22. juli 2010 - 02:55 #5
Det er tæt på.

List<NewsItem>

hedder dog

List(Of NewsItem)

i VB.NET
Avatar billede arne_v Ekspert
26. september 2010 - 21:20 #6
Tid at få afsluttet her?
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

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