stänga

.NET

13 svar · 314 visningar · startad av renholm

Medlem sedan apr. 20012 266 inlägg
Trådstart#1

hur gör jag för att stänga t.ex. ett ADODB objekt?

i "gammla" ASP gjorde man ju såhär:

Set dbConn = Nothing

hur gör jag samma sak fast i ASP.NET(C#)

Medlem sedan dec. 2000399 inlägg
#2

Hej!

Minneshanteringen fungerar lite annorlunda .NET jämfört med ASP. Kika lite här.

Kolla denna sida också(mer relevant tror jag): http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconprogrammingessentialsforgarbagecollection.asp

Medlem sedan apr. 20012 266 inlägg
#3

tack för url... men blev inte så mycke klokare för de... får detta fel meddelande när jag försöker "stänga" mitt Dataset objekt:

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: CS1540: Cannot access protected member 'object.~Object()' via a qualifier of type 'DataSet'; the qualifier must be of type 'nav_aspx' (or derived from it)

Source Error:

Line 30:   Response.Write("\n</body>\n</html>");
Line 31: 
Line 32: ds.Finalize();
Line 33: %>

Min kod ser ut så här:

<%@ Page Language="C#" Debug="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%
string strDbCon = "Provider=SQLOLEDB;Server=(local);Database=webshop;Uid=sa;Pwd=***;";

DataSet ds = new DataSet();
OleDbDataAdapter oleQuery = new OleDbDataAdapter("Select * from category", strDbCon);
oleQuery.Fill(ds, "Table");
DataTable dt = ds.Tables["Table"];

%>

<html>
<head>
<title>nav.aspx</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<%	

foreach (DataRow dr in dt.Rows) {
  if (Request.QueryString["p"] == dr["intParent"]) {
    Response.Write("-");
  }
  Response.Write("<a href='nav.aspx?p=" + dr["catid"] + "'>" + dr["strCatName"] + "</a><br>\n");
}

  Response.Write("\n</body>\n</html>");

ds.Finalize();
%>
Medlem sedan maj 2001329 inlägg
#4

Hi.

Du behöver aldrig stänga ett DataSet i .Net. DataSetet kopierar helt enkelt över alla raderna ifrån databasen och håller alla dessa i minnet, till skillnad från gamla ADO.

När du sedan trillar ut ur det block där du definierade DataSetet kommer GC att automatiskt ta hand om ditt objekt, i detta fall ditt dataset.

Däremot måste du öppna och stänga en connection om du använder dig av DataReader, vilken liknar gamla ADO lite mer.

Bara en liten övrig kommentar. I .Net ska du aldrig blanda kod med design. Fyll istället ex. en Repeater med ditt dataset och ha en LinkButton i denna repeater. För exempel på sådant, kolla igenom Quickstarten.
http://samples.gotdotnet.com/quickstart/Default.aspx

//lite snabbt, ska äta

Medlem sedan juni 20011 732 inlägg
#5

Precis. Antingen har du två helt skilda dokument (ett med c#-koden och ett med design-koden, inkl asp.net, sk codebehind) eller så strukturerar du åtminstone upp sidan så här:

----------------
all c#-kod
----------------
<html>
...din sida...
</html>
----------------

Dessutom ska du naturligtvis använda asp.net! Exempelvis, istället för detta:

Response.Write("<a href='nav.aspx?p=" + dr["catid"] + "'>" + dr["strCatName"] + "</a><br>\n");

...så ska du naturligtvis använda asp.net-taggar (annars förlorar du ju halva poängen med .net), exempelvis:

<asp:HyperLink id="myHyperlink" runat="server" />

//där du sedan sätter dess parametrar i din c#-kod, exempelvis:

string myString = "se";
myHyperlink.NavigateUrl = "http://www.minsida.com/default.aspx?language=" + myString;

Du ska i princip aldrig använda Response.Write annat än om du vill skriva ut data när du testar olika grejjer. Till allt som ska vara dynamiskt använder du asp.net-taggar, exempelvis <asp:Button...> <asp:ImageButton...> <asp:Label...> <asp:DropDownList...> osv. I början kan det vara lite krångligt och förvirrande med alla nya taggar men när du fått grepp om den så kommer du få igen det MÅNGA gånger!

Medlem sedan apr. 20012 266 inlägg
#6

Bara en liten övrig kommentar. I .Net ska du aldrig blanda kod med design. Fyll istället ex. en Repeater med ditt dataset och ha en LinkButton i denna repeater. För exempel på sådant, kolla igenom Quickstarten. http://samples.gotdotnet.com/quickstart/Default.aspx

jo.. vet att man ska helst använda Repeater... men då kan jag inte få de funkationer som jag ska ha i min webshop meny... dvs.. med undermenyer osv.. efterrsom man inte kan lägga en repeater i en annan... iaf funkade de inte när jag försökte... men tack för hjälpen

men funkar de bra om jag kör c# koden i en <script></script> i början av documentet som de har gjort på t.ex http://samples.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/aspplus/samples/webforms/customize/datalist1.src&file=CS\DataList1.aspx&font=3 ?

Medlem sedan apr. 20012 266 inlägg
#7

Hej igen!

Har nu fixat en repeater... bättre så här?:

<%@ Page Language="C#" Debug="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<html>
<head>
<title>nav.aspx</title>

<script language="C#" runat="server">

        void Page_Load(Object sender, EventArgs e ) {

	string strDbCon = "Provider=SQLOLEDB;Server=(local);Database=webshop;Uid=sa;Pwd=***;";

	OleDbDataAdapter oleQuery = new OleDbDataAdapter("Select * from category", strDbCon);
	DataSet ds = new DataSet();
	oleQuery.Fill(ds, "Table");

        navRe.DataSource = ds.Tables["Table"].DefaultView;
        navRe.DataBind();

	}
</script>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">

  <ASP:Repeater id="navRe" runat="server">
      <HeaderTemplate>
        <table width="120" style="font: 8pt verdana">
      </HeaderTemplate>
      <ItemTemplate>
        <tr style="background-color:FFECD8">
          <td>
            +
          </td>
          <td>
            <%# DataBinder.Eval(Container.DataItem, "strCatName") %>
          </td>
        </tr>
      </ItemTemplate>
      <FooterTemplate>
        </table>
      </FooterTemplate>
  </ASP:Repeater>

</body>
</html>
Medlem sedan juni 20011 732 inlägg
#8

Jodå, du kan visst ha en repeater i en repeater i en repeater...

Tro mig, du kan göra ALLT med asp.net som du kan göra på det gamla sättet, plus en hel del annat också. Om du "tror" att det inte går, så är det snarare så att du inte har lärt dig hur man gör. :)

Du får använda findcontrols för att hitta en control i en control.

Medlem sedan apr. 20012 266 inlägg
#9

jo märkte att de funkade med en repeater i en annan.. de var med DataGrid jag hade haft problem med...

finns de någon fördel att lägga de i en .cs fil? annars så tar jag en sak i taget :)

Medlem sedan juni 20011 732 inlägg
#10

Njäe, skit i cs-filerna så länge, det är nog rätt onödigt för den som snickrar på hemsidan... det är som sagt framför allt om du vill kompilera koden och skapa dll-filer som du måste använda det (observera att sidan kompileras även när du gör på ditt sätt, första gången när du kliver in på sidan så kompileras den och ligger sedan på serverns ramminne! Till skillnad från gamla asp, som ju intepreteras varje gång någon besöker sidan...).

Medlem sedan apr. 20012 266 inlägg
#11

.cs filerna fungerar alltså som t.ex COM komponenter i gammla ASP... ?

Medlem sedan juni 20011 732 inlägg
#12

Ja, det kan man väl säga... även om det naturligtvis finns skillnader. Det finns säkert någon som kan förklara det bättre än jag. En av de viktigaste skillnaderna med hela asp.net är ju att du bygger funktionaliteten med ett riktigt objekt-orienterat programmeringsspråk - och det gör du ju alltid, oavsett du använder code-behind eller inte. I gamla asp har du den möjligheten att använda ett riktigt programmeringsspråk endast om du skapar com-objekt och det var/är både svårare, sämre och klurigare att jobba med, i jämförelse med .net.

-----------------
Jag kan inte komma på någon signatur.

[Redigerat av NETwork den 31 jan 2002]

Medlem sedan juni 20008 205 inlägg
#13

finns de någon fördel att lägga de i en .cs fil?
Det enda svaret som behövs är att det är så man ska göra, annars gör man sig skyldig till ett ännu hemskare brott än de som använder ASP utan COM. Logiken ska inte vara bunden till presentationen, vilket kanske blivit en klyscha men det stämmer förbannat bra. Gör man något annat än ett snabbt fulhack borde det t.o.m. vara spöstraff på att blanda logik med gränssnitt. Alla objektorienterade plattformar i världen är inte värda ett piss om man inte själv arbetar efter samma modell. :)
Vill man efter ett tag slänga på ett annat gränssnitt på sin applikation (vanlig Windows-miljö eller något elektroniskt gränssnitt som SOAP, t.ex.) så slipper man skriva om allt.

Medlem sedan apr. 20012 266 inlägg
#14

ok... men vad behövs för att göra de till .cs filer?

257 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)