Just nu i M3-nätverket
Gå till innehåll
Micke_skane

Connectionsstring i web.config eller .cs-filen?

Rekommendera Poster

Hej,

 

Vilket är bäst att ha, connectionstring i web.config eller i .cs-filen?

Tror själv web.config men kan inte motivera det för mig själv då båda filerna berör hela webbplatsen.

Misstänker det handlar om att separera den olika användningsområdena, i så kallade lager.

 

Om det är i web.config, ska det då vara:

<connectionStrings>
 <add 
   name="MinDatabasKoppling" 
   connectionString="Data Source=mysql50.kontrollpanelen.se;Port=3305;DataBase=xxx;User 
   ID=yyy;Password=zzz"
   providerName="System.Data.SqlClient"
 />
</connectionStrings>

 

Hur är det sen bäst att skriva i cs-filen om det är så här nu:

MySqlConnection dbCon = new MySqlConnection("Server=mysql50.kontrollpanelen.se;Port=3305;Database=xxx;User=yyy;Password=zzz;");

Skulle tänka mig något så här:

string MyConnStr=ConfigurationManager.ConnectionStrings["MinDatabasKoppling"].ConnectionString;
MySqlConnection dbCon = new MySqlConnection(MyConnStr);

Har så klart kollat på nätet men det finns en Massa olika varianter där den ena varianten ska vara mer effektiv än den andra...

 

Har testat detta och det fungerar men är det ett bra sätt?

Inser nu att detta inte är så hållbart då man vill kunna köra olika sql-frågor till databasen ifrån olika sidor.

Så egentligen är det bara databas-kontakten jag vil ha här och sen skapa funktioner/klasser för olika frågor, som jag anropar på något sätt ifrån varje sida.

Phuuuuu...VARFÖR är jag inte hjärnkirurg istället ???

 

[inlägget ändrat 2008-02-28 13:36:46 av Micke_skane]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Har testat detta och det fungerar men är det ett bra sätt?

Ja, kopplingssträngarna skall du lägga i web.config. Dels för att detta är just en global konfigurering, dels för att man ska slippa kompilera om projektet när man vill ändra denna och andra globala inställningar. Glöm inte att kryptera sådana här känsliga data innan du publicerar webbplatsen publikt.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Men jag har upptäckt att jag inte kan ha koden som jag har den nu.

Man ska visst inte ha En cs-fil utan ett par st...

Nu får jag ju fel om jag vill använda .cs-filen på en annan aspx-fil.

Då saknas liksom labeln som fanns på första sidan och som ingår i Page_Load.

Sen vill jag ju använda samma databaskoppling men med andra sql-frågor för t ex en unik söksida där min SELECT-fråga ska byggas dynamiskt baserat på vad man väljer för sökkriterier.

 

Som jag förstått det så ska man skapa en namespace med olika klasser för det man vill använda men jag fattar fan inte hur man ska tänka/göra :/

Dem här klasserna ska läggas in i en .cs-fil som sen ska göras till en dll-fil genom en .bat-fil.

Sen ska man anropa dem här olika klasserna på något jävla viss...

Blir så jävla förbannad :)

 

I klassisk asp hade jag skapat en fil med olika subar/funktioner och sen kallad på dem där jag ville. Enkelt och klart!

Det är så jag vill göra nu med men fattar inte hur man skapar det!

 

Och hur krypterar man dessa uppgifter?

 

[inlägget ändrat 2008-02-28 17:53:35 av Micke_skane]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Jag är inte riktigt säker på vad du är ute efter, men börja med att dela upp ditt projekt i tre lager. Överst har du presentationslagret (aspx-sidor) , sedan kommer affärslagret (nedan representerat av DittProjekt.CustomerData) och nederst datalagret (DittProjekt.Data)

Naturligtvis kan du utöka affärslagret till att innehålla flera typer av data. Ex. DittProjekt.BusinessLogic.CustomerData, DittProjekt.BusinessLogic.OrderData osv.

namespace DittProjekt.Data
{
public static class DataFactory
{
	private static SqlConnection connection;
	private enum DatabaseState { Closed, Open };

	public static SqlDataReader SqlRead(string query)
	{
		SqlDataReader reader=null;
		DatabaseState state=(connection.State==ConnectionState.Open)?DatabaseState.Open:DatabaseState.Closed;
		if (state==DatabaseState.Closed)
		{
			state=OpenConnection();
		}
		if (state == DatabaseState.Open)
		{
			// Kör din fråga här och returnera readern
			return reader;
		}
		else
		{
			return null;
		}
	}
	private static DatabaseState OpenConnection() 
	{
		DatabaseState state=DatabaseState.Closed;
		// Öppna en koppling och spara i connection
		return state;
	}
	public static void CloseConnection()
	{
		if (connection != null && connection.State != ConnectionState.Closed)
		{
			connection.Close();
		}
	}
}
}

 

Detta är ju rätt förenklat, men nu har du lagt kopplingar och databasanrop i ett eget lager i form av en statisk klass. Från ditt affärslager hämtar du data från detta lager med

namespace DittProjekt.CustomerData
{

public class Customer
{
	private int ID;
	private string name;

	public string Name
	{
		get { return name; }
		set { name = value; }
	}

	public Customer()
	{
	}
	public void LoadCustomer()
	{
		SqlDataReader reader = DittProjekt.Data.DataFactory.SqlRead(String.Concat("sp_GetCustomer ", ID.ToString()));
		if (reader != null)
		{
			reader.Read();
			Name = Convert.ToString(reader["Name"]);
			reader.Close();
		}
	}
}
}

 

Från din code-behind skapar du nu ett Customer-objekt och låter detta internt sköta databasanropen. Från ditt presentationslager har du nu ingen direkt manipulation av databasen, vilket är precis det man vill uppnå.

 

   protected void Page_Load(object sender, EventArgs e)
   {
	DittProjekt.CustomerData.Customer customer;
	customer = new DittProjekt.CustomerData.Customer();
	customer.LoadCustomer();
	string Name = customer.Name;


   }

 

Någonstans i slutet av din sida skall du naturligtvis se till att kopplingen stängs. Detta blir den enda direkta referensen från presentationslagret till datalagret.

	DittProjekt.Data.DataFactory.CloseConnection();

 

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Stort tack för inlägget, ska plugga det ett antal gånger!

 

Det är egentligen inte så svårt det jag ska göra, hade jag kunnat maila dig hade jag kunnat berättat mer i detalj.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
hade jag kunnat maila dig hade jag kunnat berättat mer i detalj.

Har lite mycket att stå i på fritiden nu, två stora sidoprojekt. Men ställ följdfrågor här när de dyker upp.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Ingen fara och följdfrågor kommer ideligen.

(är riktigt förbannad just nu :))

 

Vad menar du med:

presentationslagret (aspx-sidor) (där är ju databaskopplingen osv...)

 

Ska allt detta ligga i en och samma fil?

 

[inlägget ändrat 2008-02-28 19:11:32 av Micke_skane]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Vad menar du med:

presentationslagret (aspx-sidor) (där är ju databaskopplingen osv...)

 

Nä, databaslagret (DittProjekt.Data) ligger i en egen cs-fil (som du f.ö bör lägga i mappen App_Code), ex. DittProjekt.Data.cs

 

Affärslagret lägger du även det i en egen fil, ex. DittProjekt.CustomerData.cs

 

Har du väldigt många klasser per namespace kan du dela upp det i flera filer. Ex. DittProjekt.CustomerData.Customer.cs och DittProjekt.CustomerData.CustomerRelations.cs

[inlägget ändrat 2008-02-28 19:13:33 av Anjuna Moon]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Så det är flera cs-filer!

Då är jag nog mer med.

 

Är så xxx frustrerande att inte fatta tänket :)

Ibland är det enklare att förstå klara filer istället för "ordförklaringar".

 

Är det bara en cs-fil som ska ligga i App_Code-mappen?

Ska dem andra cs-filerna bara ligga i samma mapp som aspx-filerna?

Hur anropar man sen klassen(erna) ifrån min aspx-sida?

T ex som vi pratade om innan om att fylla två dropdownlist:s.

 

[inlägget ändrat 2008-02-28 19:35:08 av Micke_skane]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Så det är flera cs-filer!

Då är jag nog mer med.

Notera dock att det inte är nödvändigt att lägga de olika klasserna i olika filer, men ju större filer desto mer internminne går åt för att ladda in dll:en/komponenten.

 

[inlägget ändrat 2008-02-28 19:36:09 av Anjuna Moon]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Okej!

 

Men hur är det med detta:

# Är det bara en cs-fil som ska ligga i App_Code-mappen?

# Ska dem andra cs-filerna bara ligga i samma mapp som aspx-filerna?

# Hur anropar man sen klassen(erna) ifrån min aspx-sida?

T ex som vi pratade om innan om att fylla två dropdownlist:s.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Är det bara en cs-fil som ska ligga i App_Code-mappen?

Nä, lägg alla separata bibliotek där. App_Code är nytt för .Net 2.0 och cs-filer som läggs här behöver inte förkompileras. I tidigare versioner var man tvungen att förkompilera cs-filer och placera dll:erna i bin-mappen för att de skulle bli åtkomliga. I 2.0 kompileras cs-filerna under run-time, vilket är en klar förbättring.

 

Ska dem andra cs-filerna bara ligga i samma mapp som aspx-filerna?

Japp. Jag är inte säker på varför man gjort det på detta sätt, har inte satt mig in i det.

 

Hur anropar man sen klassen(erna) ifrån min aspx-sida?

Det visade jag med det tredje och sista kodexemplet. Titta på snabblänken jag gav (paste-sidan) där den nedersta koden visar en aspx-sidas code-behind och där anropet sker från Load-hanteraren.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Visste faktiskt det om App-Code-mappen, så lite har jag lyckats snappa upp :)

 

Nä, lägg alla separata bibliotek där.
Vad är bibliotek i detta sammanhanget? Och varför ska bara denna cs-fil kompileras?

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Vad är bibliotek i detta sammanhanget?

Jag brukar kalla en cs-fil med en klass för ett bibliotek.

 

Och varför ska bara denna cs-fil kompileras?

Vilken? Code-behind-filen? Isåfall vet jag inte, vet som sagt inte varför MS valt att dessa skall ligga i samma mapp som tillhörande aspx-fil. Lämnar det som övning =)

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Vilken?
Tänker på att den ena cs-filen(med datalagret) ska läggas in i App_Code-mappen men dem andra ska ligga tillsammans med aspx-filerna.

För när den läggs in i mappen som blir det en dll-fil.

Jag ser liksom ingen skillnad rent kodmässigt mot t ex affäreslagret.

 

Sen är det då presentationslagret man länkar in i aspx-filerna som code-behinde-fil?

Kan man använda denna fil till flera aspx-filer?

 

Tänker på att på den ena sidan vill jag använda databasen och fylla par dropdownlist och på nästa sida använda databaskopplingen och köra helt nya SELECT-frågor som tillviss kan skapas på dropdownlist:en på första sidan.

 

MÅNGA frågor men jag vill VERKLIGEN veta/förstå tänket för att själv sen kunna utveckla andra idéer/behov.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Sen är det då presentationslagret man länkar in i aspx-filerna som code-behinde-fil?

Kan man använda denna fil till flera aspx-filer?

Det ska man inte göra nej.

 

Tänker på att på den ena sidan vill jag använda databasen och fylla par dropdownlist och på nästa sida använda databaskopplingen och köra helt nya SELECT-frågor som tillviss kan skapas på dropdownlist:en på första sidan.

De olika frågorna skickas från metoder i affärslagret till datalagret. I presentationslagret skall du överhuvudtaget inte tänka i termer av databasanrop, utan enbart i form av objekt skapade av klasser i affärslagret.

 

Säg att du på en sida fyller en dropdown med kunder och på en annan sida fyller du en dropdown med kunder, filtrerade efter ett kriterium. Detta är två sätt att hämta kunder således och kräver då två metoder i affärslagret (som returnerar ex. en lista av kunder, List<DittProjekt.CustomerData.Customer>

Metoderna kan vara överlagrade varianter av samma metod, ex.

 

public function List<DittProjekt.CustomerData.Customer> GetCustomers()

Hämtar samtliga kunder

 

public function List<DittProjekt.CustomerData.Customer> GetCustomers(int Year)

Hämtar kunder registrerade ett visst år.

 

I den ena varianten skickas en specifik query till datalagrets SqlRead-funktion och i den andra skickas en annan query.

 

[inlägget ändrat 2008-02-28 20:42:17 av Anjuna Moon]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Aha, så man "behöver" skapa en ny metod för varje sql-fråga.

int Year, är det en parameter som man skickar med till GetCustomer() för att lägga in den variabel i SELECT-frågan!?

Är Year något som servern lämnar ifrån sig i form av ett årtal?

 

Vad betyder:

List<DittProjekt.CustomerData.Customer>

 

Hur kan man då ta emot ett värde ifrån ett par dropdownlist för att sen använda på en annan sida?

Det har jag inte helt greppat ännu :)

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Om du har viss kod som är gemensam för samtliga code-behind filer så kan du skapa en egen klass som ärver från System.Web.UI.Page

 

Ex.

Här skapar jag en egen Page-klass som mina code-behind sidor ska använda sig av. Den gemensamma koden här är inget annat än en funktion som sätter en publik variabel PageName.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace DittProjekt.Forms
{
public class BaseForm : System.Web.UI.Page
{
	public BaseForm()
	{
	}
	public  string PageName="Ej namngiven";
	public void  SetPageName(string Name) 
	{
		PageName=Name;
	}

}
}

 

I dina code-behind filer ersätter du nu

public partial class DinSida  : System.Web.UI.Page

med

public partial class DinSida : DittProjekt.Forms.BaseForm

 

Din code-behind fil kan nu utnyttja den nya basklassens metoder

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class content_en_Default : DittProjekt.Forms.BaseForm
{
   protected void Page_Load(object sender, EventArgs e)
   {

	SetPageName("Nytt namn");
   }

}

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Okej!

 

Får nog smälta det lite nu :)

Stort tack så länge!

 

Det värsta är att jag inte har så mycket tid längre att laborera med detta, i värsta laget får jag skapa det i klassisk asp så länge.

Hade hoppats på det...

 

Ha det bra så länge!

Micke

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
nt Year, är det en parameter som man skickar med till GetCustomer() för att lägga in den variabel i SELECT-frågan!?

Ja, exempelvis med:

List<DittProjekt.CustomerData.Customer> lista=DittProjekt.CustomerData.CustomerFactory.GetCustomers(2008);

 

Är Year något som servern lämnar ifrån sig i form av ett årtal?

Det är bara en parameter jag valt för exemplet.

 

List<DittProjekt.CustomerData.Customer>

En lista där varje element är av den angivna typen. Detta är ett exempel på generiska listor, nytt för C# 2.0

 

Hur kan man då ta emot ett värde ifrån ett par dropdownlist för att sen använda på en annan sida?

Querystrings, postad formulärdata, cookies, sessionsvariabler, typ...som du är van vid med andra ord. Sidorna är lika skilda entiteter som i alla andra utvecklingsmiljöer för webben.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Querystrings, postad formulärdata, cookies, sessionsvariabler, typ
Men hur berättar jag för t ex sida1(med par dropdowns+knapp) att efter klickat på knappen ska man komma till sida2 och där ta emot ev värden.

Var säger man vilken url som gäller vid klicket?

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Var säger man vilken url som gäller vid klicket?

Ex. via knappen händelsehanterare för Click.

	protected void Button1_Click(object sender, EventArgs e)
{
	Response.Redirect("nysida.aspx?id=1");
}

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Ex. via knappen händelsehanterare för Click.
Det var precis så jag testade innan idag eller igår men fick felmeddelandet av en invalid postback.

Det är lite därför jag är lite "snurrig" i detta då jag trodde jag tänkte/gjorde rätt men att det ändå inte gick.

 

Gjorde en tråd om detta :)

//eforum.idg.se/viewmsg.asp?entriesid=1034597

 

Triggar man en .NET-knapp som vill den ju tillbaka till samma sida.

Så har jag fattat att form-taggen tänker som generas omslutande i en .NET-fil.

 

[inlägget ändrat 2008-02-28 21:18:31 av Micke_skane]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...