Avatar billede aero Nybegynder
28. november 2010 - 17:38 Der er 28 kommentarer og
1 løsning

Data hentet fra en DB via. SQL, er dette måden at gøre det på idag.

Hej

Har denne side og den virker fint, men ved det er noget jeg har brugt for 2-3 år siden, så ville lige høre om det forsat er måden at gøre det på idag eller om jeg kan gøre koden lidt kortere og derved også hurtigere at køre.

Koder kun i min fritid, derfor jeg spørger på denne måde.

Min codebehind er dette..
Imports System.Data
Imports System.Data.SqlClient

Partial Class _Default
    Inherits System.Web.UI.Page

    Public Sub OpenDBproduct()
        Dim ProductConnection As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)

        Dim ProductReader As SqlDataReader
        Dim ProductCommand As SqlCommand

        Dim ProductSQL As String = ""
        ProductSQL = "SELECT * FROM table1 ORDER BY PName DESC;"
        ProductCommand = New SqlCommand(ProductSQL, ProductConnection)

        'Prøv at åben Connection.
        Try
            ProductConnection.Open()
            ProductReader = ProductCommand.ExecuteReader(CommandBehavior.CloseConnection)
            'Hvis der er data, udskriv da dataen.
            If ProductReader.HasRows() Then

                Response.Write("<h2>Produkter</h2>")
                Response.Write("<table style=""width:340px; border:0px;""><tr>")

                Do While ProductReader.Read()
                    Response.Write("<td colspan=""3""><br /></td>")
                    Response.Write("</tr><tr>")
                    Response.Write("<td style=""width:10px;""></td>")
                    Response.Write("<td><div style=""width:52px; text-align:center;""><span class=""""># " & ProductReader("PName") & "</span></div></td>")
                    Response.Write("<td class=""""><span class="""">" & ProductReader("PName") & "</span><br /><span class="""">" & ProductReader("PPrice") & "</span><br /><span class=""""><b>" & ProductReader("Pean") & "</b></span></td>")
                    Response.Write("</tr><tr>")
                    Response.Write("<td colspan=""3""><br />" & ProductReader("PDescription") & "</td>")
                    Response.Write("</tr><tr>")
                    Response.Write("<td style=""border-bottom:dashed 2px #FFA902;"" colspan=""3""><br /></td>")
                    Response.Write("</tr><tr>")

                Loop
                Response.Write("</tr></table>")
                Response.Write("Slutning")
            Else
                'Hvis der ikke er data, lav en fejl tekst.
                Response.Write("<table style=""width:340px; border:0px;""><tr><td>")
                Response.Write("Der findes ingen produkter.")
                Response.Write("<br /><br />")
                Response.Write("Slutning")
                Response.Write("</td></tr></table>")
            End If

        Catch ex As Exception
            Console.WriteLine(ex.Message)

        Finally
            'Lukker Connection, Reader og Sletter Hukommelse.
            If Not ProductReader Is Nothing Then
                ProductReader.Dispose()
            End If
            If Not ProductConnection Is Nothing Then
                ProductConnection.Dispose()
            End If

        End Try
    End Sub
End Class
Avatar billede arne_v Ekspert
28. november 2010 - 19:27 #1
Nej.

Du burde som minimum vise data med en repeater - jeg mener bestemt at en SqlDataReader kan bindes til en sådan.
Avatar billede arne_v Ekspert
28. november 2010 - 19:28 #2
Og så er der mere eksotiske løsninger ved at skifte fra direkte SqlCommand til en ORM, men det er kun flødeskum på lagkagen - SqlCommand er OK.
Avatar billede aero Nybegynder
28. november 2010 - 19:47 #3
okay

Hvordan får jeg <ItemTemplate> til at skifte mellem 2 forskellige BackGround Farver !?
Avatar billede arne_v Ekspert
28. november 2010 - 20:00 #4
AlternatingItemTemplate ?
Avatar billede aero Nybegynder
28. november 2010 - 20:02 #5
har du et eks. på ORM synes ikke jeg kan finde nogle der forklare det på en forstålig måde.

Og smid et svar.
Avatar billede arne_v Ekspert
28. november 2010 - 20:07 #6
svar

AlternatingItemTemplate var lige det du skulle bruge?
Avatar billede arne_v Ekspert
28. november 2010 - 20:12 #7
ORM = O/R Mapper = Object/Relational Mapper

Sådan kort fortalt er ideen at du laver en data klasse som:
  klasse navn = tabel navn
  property navn = fekt navn

Og så er der en database manager med et API som:

X o = dbmgr.GetByPrimaryKey(id);
List<X> lst = dbmgr.GetAll();
dbmgr.Save(o);

etc.

Database manageren skal bare have connection string, så sørger den selv for SqlConnection, SqlCommand, SqlDataReader objekter og diverse SELECT, INSERT, UPDATE sætninger.

D.v.s. at du kan programmer udfra din objekt model og ORM frameworket mapper så dette til den relationelle model i databasen.
Avatar billede arne_v Ekspert
28. november 2010 - 20:22 #8
Til problem stillinger hvor man skal bruge simple operationer som beskrevet ovenfor anses ORM normalt for at være bedre end direkte SQL fordi man sparer en del trivielt arbejde.

De fleste ORM frameworks er dog lidt komplekse og kræver ofte at man bruger en del tid på at sætte sig ind i hvordan de virker. Hvis du selv skriver din SQL så kan du nemt optimere den. Hvis ORM frameworket genererer SQL'en for dig, så kan det godt være lidt tricky at få den rigtige performance.
Avatar billede arne_v Ekspert
28. november 2010 - 20:23 #9
Der er masser af ORM frameworks til .NET - mere end 20, men de to store er nok:
* MS EF
* NHibernate (open source)
Avatar billede aero Nybegynder
28. november 2010 - 20:51 #10
Kunne det tænkes du lige vil ud fra mit eks. lave et ORM eks. for kan ikke se hvordan den får adgang til min database fra min web.config fil.
Avatar billede arne_v Ekspert
28. november 2010 - 20:59 #11
Det kunne jeg godt.
Avatar billede arne_v Ekspert
28. november 2010 - 21:48 #12
Jeg kan jo ikke helt genskabe din kode, men jeg prøver lige med et simpelt eksempel.

Først med SqlCommand og SqlDataReader.

simple.aspx


<%@ import namespace="System.Data" %>
<%@ import namespace="System.Data.SqlClient" %>
<html>
<head>
<title>Simple SqlCommand and SqlDataReader</title>
<script language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
    Dim con As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("Test").ConnectionString)
    con.Open()
    Dim cmd As SqlCommand = New SqlCommand("SELECT f1,f2 FROM t1", con)
    Dim rdr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
    MyRep.DataSource = rdr
    MyRep.DataBind()
End Sub
</script>
</head>
<body>
<form runat=server>
    <table border='1'>
        <tr bgcolor='#FF0000'>
            <th>F1</th>
            <th>F2</th>
        </tr>
        <asp:Repeater id="MyRep" runat="server">
            <ItemTemplate>
                <tr bgcolor='#AAAAAA'>
                <td><%# DataBinder.Eval(Container.DataItem,"F1") %></td>
                <td><%# DataBinder.Eval(Container.DataItem,"F2") %></td>
                </tr>
            </ItemTemplate>
            <AlternatingItemTemplate>
                <tr bgcolor='#FFFFFF'>
                <td><%# DataBinder.Eval(Container.DataItem,"F1") %></td>
                <td><%# DataBinder.Eval(Container.DataItem,"F2") %></td>
                </tr>
            </AlternatingItemTemplate>
        </asp:Repeater>
    </table>
</form>
</body>
</html>


web.config fragment


    <connectionStrings>
        <add name="Test" connectionString="Server=ARNEPC3\SQLEXPRESS;Integrated Security=true;Database=Test" providerName="System.Data.SqlClient" />
    </connectionStrings>
Avatar billede arne_v Ekspert
28. november 2010 - 21:51 #13
Så med NHibernate.

nhib.aspx


<%@ import namespace="NHibernate" %>
<html>
<head>
<title>NHibernate</title>
<script language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
    Dim cfg As NHibernate.Cfg.Configuration = New NHibernate.Cfg.Configuration()
    cfg.Configure(Server.MapPath("hibernateconfig.xml"))
    cfg.AddXmlFile(Server.MapPath("t1mapping.xml"))
    Dim sf As ISessionFactory = cfg.BuildSessionFactory()
    Dim s As ISession = sf.OpenSession()
    Dim res As IList(Of T1) = s.CreateQuery("FROM T1 AS t1").List(Of T1)()
    s.Close()
    MyRep.DataSource = res
    MyRep.DataBind()
End Sub
</script>
</head>
<body>
<form runat=server>
    <table border='1'>
        <tr bgcolor='#FF0000'>
            <th>F1</th>
            <th>F2</th>
        </tr>
        <asp:Repeater id="MyRep" runat="server">
            <ItemTemplate>
                <tr bgcolor='#AAAAAA'>
                <td><%# DataBinder.Eval(Container.DataItem,"F1") %></td>
                <td><%# DataBinder.Eval(Container.DataItem,"F2") %></td>
                </tr>
            </ItemTemplate>
            <AlternatingItemTemplate>
                <tr bgcolor='#FFFFFF'>
                <td><%# DataBinder.Eval(Container.DataItem,"F1") %></td>
                <td><%# DataBinder.Eval(Container.DataItem,"F2") %></td>
                </tr>
            </AlternatingItemTemplate>
        </asp:Repeater>
    </table>
</form>
</body>
</html>


DOM.vb


Imports System

Public Class T1
    Private _f1 As Integer
    Private _f2 As String
    Public Overridable Property F1 As Integer
        Get
            return _f1
        End Get
        Set
            _f1 = Value
        End Set
    End Property
    Public Overridable Property F2 As String
        Get
            return _f2
        End Get
        Set
            _f2 = Value
        End Set
    End Property
End Class


nhibernateconfig.xml


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    <session-factory>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">Data Source=ARNEPC3\SQLEXPRESS;Initial Catalog=Test;Integrated Security=True</property>
        <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
        <property name="show_sql">false</property>
        <property name="hbm2ddl.keywords">none</property>
    </session-factory>
</hibernate-configuration>


t1mapping.xml


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" >
    <class name="T1,DOM" table="t1">
        <id name="F1">
            <column name="f1"/>
        </id>
        <property name="F2">
            <column name="f2"/>
        </property>
    </class>
</hibernate-mapping>
Avatar billede aero Nybegynder
28. november 2010 - 22:17 #14
Tror næsten jeg forstår det..

Men hvad gør Dom.VB og t1mapping.xml !?

Dom.VB er det siden her henter de forskellige kolonner fra min tabel. !?

eller hvad gør de.
Avatar billede aero Nybegynder
28. november 2010 - 22:52 #15
hvorfor siger den at min "Items" er ikke defineret i Dim res As IList(Of Items)!?

    Public Sub linqdb()
        Dim cfg As NHibernate.Cfg.Configuration = New NHibernate.Cfg.Configuration()
        cfg.Configure(Server.MapPath("nhibernateconfig.xml"))
        cfg.AddXmlFile(Server.MapPath("Productsmapping.xml"))
        Dim sf As ISessionFactory = cfg.BuildSessionFactory()
        Dim s As ISession = sf.OpenSession()
        Dim res As IList(Of Items) = s.CreateQuery("FROM Items AS Products").List(Of Items)()
        s.Close()
        MyRep.DataSource = res
        MyRep.DataBind()
    End Sub
Avatar billede arne_v Ekspert
28. november 2010 - 23:04 #16
DOM.vb indeholder de data klasser som siden bruger.

t1mappings.xml definerer mappingen fra tabel t1 til klasse T1.
Avatar billede arne_v Ekspert
28. november 2010 - 23:04 #17
Hvis Items ikke findes så har du enten ikke defineret en Items klasse eller du har ikke ref til den DLL hvori den er.
Avatar billede aero Nybegynder
28. november 2010 - 23:09 #18
hmm

i dit eks.
Dim res As IList(Of T1) = s.CreateQuery("FROM T1 AS t1").List(Of T1)()

Siger du da ikke er t1 er en Tabel i TEST og at du vil have at t1 fromover hedder T1 eller har jeg misforstået noget !? for så burde jeg da bare kunne tage dette og sige
Dim res As IList(Of Items) = s.CreateQuery("FROM Items AS Products").List(Of Items)()

altså Products er en tabel i TEST som fremover skal kaldes Items og alle de steder du har skrevet T1 der laver jeg det om til Items..

ret mig hvis jeg er gal på den...
Avatar billede arne_v Ekspert
28. november 2010 - 23:15 #19
Dim res As IList(Of T1) = s.CreateQuery("FROM T1 AS t1").List(Of T1)()

laver en liste med alle instanser af T1 klassen som i databasen er rækker i T1 tabellen.
Avatar billede aero Nybegynder
28. november 2010 - 23:50 #20
nu prøvede jeg fra starten og kan se at dit eks. også laver samme fejl ang. IList(Of T1) =    hvor T1 ikke er defineret !!
Avatar billede arne_v Ekspert
28. november 2010 - 23:56 #21
DOM.cs skal bygges til en separat DOM.dll og web projektet skal have en ref til den DLL!
Avatar billede aero Nybegynder
29. november 2010 - 00:10 #22
undskyld men bliver nød til at spørge, hvordan laves dom.vb så om til dll, ved godt hvordan jeg add en ref.
Avatar billede arne_v Ekspert
29. november 2010 - 00:34 #23
Hvis du tænker Visual Studio:

lav et separat projekt af type class library

Hvis du tænker command line:

vbc /t:library DOM.vb
Avatar billede aero Nybegynder
29. november 2010 - 22:30 #24
Hej Arne

Så fik jeg lavet filen men når jeg køre det i Visual Studio som debug så melder den fejl ved.

Dim cfg As NHibernate.Cfg.Configuration = New NHibernate.Cfg.Configuration()

ang. Filen eller assemblyen 'Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4' eller en af dens afhængigheder kunne ikke indlæses. Den angivne fil blev ikke fundet.

Jeg har KUN add ref ang. NHibernate.dll
Avatar billede arne_v Ekspert
30. november 2010 - 00:02 #25
Du behøver en hel stak af Hibernate dit og dat.

Antlr3.Runtime.dll
Iesi.Collections.dll
LinFu.DynamicProxy.dll
log4net.dll
NHibernate.ByteCode.LinFu.dll
NHibernate.dll
Avatar billede aero Nybegynder
30. november 2010 - 00:21 #26
okay

Hvad var flg ved dig
T1
t1
F1
_f1
F2
_f2

Hvad var kaldenavn og egentlige Tabel og kolonne navne !? fra din Mapping og DOM fil.
Avatar billede arne_v Ekspert
30. november 2010 - 00:49 #27
class, property : upper case
tabel, field : lower case
Avatar billede arne_v Ekspert
27. december 2010 - 00:17 #28
all set?
Avatar billede aero Nybegynder
27. december 2010 - 20:23 #29
nej men smid et svar, har fumdet en anden linq lysning via. VS2010.
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
Kurser inden for grundlæggende programmering

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