webForumDet fria alternativet

Två frågor från en förvirrad nybörjare

.NET

2 svar · 308 visningar · startad av JPS

Medlem sedan nov. 2001101 inlägg
Frågan#1

1. Databaskoppling
http://www.dotnetjunkies.com/QuickStartv20/aspnet/
så används databskopplingar som

<asp:SqlDataSource ID="SqlDataSource2" Runat="server" SelectCommand="SELECT DISTINCT [state] FROM [authors]"

hur är dessa? Är det något som man - kan/bör/inte bör använda?

2. Visa post
Vad är rätt/fel att använda då man vill visa en post?
skall man använda

<asp:Repeater id="customers" runat="server">
<ItemTemplate>
<%#Container.DataItem("Namn")%>
</ItemTemplate>
</asp:Repeater>

eller

While myReader.Read
            LabelNamn.Text = myReader("Namn")
End While

<asp:Label id="LabelNamn" runat="server" />
Medlem sedan dec. 19996 721 inlägg
#2

JPS skrev:

1. Databaskoppling
http://www.dotnetjunkies.com/QuickStartv20/aspnet/
så används databskopplingar som

<asp:SqlDataSource ID="SqlDataSource2" Runat="server" SelectCommand="SELECT DISTINCT [state] FROM [authors]"

hur är dessa? Är det något som man - kan/bör/inte bör använda?

Om DataSource-kontrollerna gör dig produktiv, så visst... Det finns massor av åsikter om vad som är rätt och fel, bra och dåligt, men till syvende och sist är det vad du åstadkommer som avgör av det var rätt eller fel.

Med det sagt, så ...:)

  • Att DataSource är utformad som en kontroll som läggs på sidan är genomkorkat. Varför ska jag lägga något på sidan som ändå inte ska hamna där?
  • Att lägga datalagret inne i designlagret går emot nästan alla etablerade utvecklingsmodeller och riskerar att skapa spagettikod. Jag är ingen rättrogen flerlagersfascist, men här känns det som att det gått lite väl långt.
  • De flesta som jobbat med DataGrid etc. vet att dessa väldigt ofta kräver "modifiering" runtime, dvs. att man manipulerar data i ItemDataBound etc. Det behovet kommer inte att försvinna, och helt plötsligt har vi Spagetti Carbonara, med datalager i designlagret och design farligt nära data-/affärslagret

Det måste dock tilläggas att själva utformningen, av DataSource-kontrollerna, har mycket vettigt i sig, och kanske kan de bli riktigt användbara om man lär sig att använda dem på ett smart sätt. I synnerhet ObjectDataSource är lovande. Den spontana känslan är dock att de tillkommit för att glädja drag-and-drop-programmerare, utan tanke på att de sabbat för dem som inte jobbar så.

JPS skrev:

2. Visa post
Vad är rätt/fel att använda då man vill visa en post?
skall man använda

<asp:Repeater id="customers" runat="server">
<ItemTemplate>
<%#Container.DataItem("Namn")%>
</ItemTemplate>
</asp:Repeater>

eller

While myReader.Read
            LabelNamn.Text = myReader("Namn")
End While

<asp:Label id="LabelNamn" runat="server" />

Det övre exemplet kan stoppas i papperskorgen. Det är inget repeterande fält och då ska man inte dra med sig allt bagage som en repeater innebär.

Det under exemplet är mer rätt, men även där är det en loop i onödan (while). Ska man bara plocka ut ett värde från databasen så ska man använda t.ex. ExecuteScalar (som direkt returnerar värdet) i stället för ExecuteReader, eller åtminstone göra om While till If, eftersom myReader endast innehåller en rad.

Medlem sedan nov. 2001101 inlägg
#3

Ok! Tackar för all input! (y)
(Du har helt rätt med kod i design men då jag är van vid vanlig
asp så har jag ännu inte hittat alla fördelar med att dela upp koden.
Jag kan tänka mig att det har stor skillnad för webbsidor där man är har flera
olika personer som programmerare, desiger som arbetar med samma sida.)

Jag glömde en fråga igår så här kommer den!!!

Jag undrar hur man gör med ExecuteReader (ExecuteScalar) när ingen post finns?
I vanliga ASP skrev man:

<% If RS.EOF Then %>
Det finns ingen post att visa.
<% Else %>

<% = RS("Namn")%><br>
<% = RS("Adress")%><br>
o.s.v.
<% End If %>

Hur gör man med .NET? Visa gärna med kod. (Du skrev att det var fel med While?)

Sub Page_Load(Src As Object, E As EventArgs)

	Dim Connection, SQL, dbComm, dbRead
	Connection=New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data source=" & server.mappath("../Nisse.mdb"))
	
	Try
	Connection.Open()
	
	SQL="SELECT * FROM Kontakter WHERE KontaktId = " & Request("KontaktId")

	dbcomm=New OleDbCommand(SQL,Connection)
	dbRead=dbcomm.ExecuteReader()
	'Projekt.DataSource=dbRead
	'Projekt.DataBind()

	While dbRead.Read
		Namn.Text = dbRead("Namn")
	Adress.Text = dbRead("Adress")
o.s.v.
	End While
	
	Catch ex as exception
		l3.text = "Error!"
	Finally
	
	dbRead.Close()
	Connection.Close()		
	
	End Try
   
End Sub
262 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)