webForumDet fria alternativet

Hur lyfter jag ut min databasuppkoppling till annan klass? Data Access Layer? C#

.NET

1 svar · 843 visningar · startad av xtreme

Medlem sedan juli 20002 056 inlägg
Frågan#1

Just nu har jag ett Windows form där jag kopplar upp till databasen med:

namespace WindowsFormsApplication1
{
    public partial class InvoiceGUI : Form
    {
        System.Data.SqlClient.SqlConnection con;
        System.Data.SqlClient.SqlDataAdapter da;
        DataSet ds1;
        DataRow dRow;

        int MaxRows = 0;
        int inc = 0;

        public InvoiceGUI()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           con = new System.Data.SqlClient.SqlConnection();
           ds1 = new DataSet();

           con.ConnectionString = "Data Source=(local);Initial Catalog=invoice_db;Integrated Security=SSPI";

            con.Open();
            //MessageBox.Show("open");

            string sql = "select * from invoice";
            da = new System.Data.SqlClient.SqlDataAdapter(sql, con);

            da.Fill(ds1, "Invoice");
            NavigateInvoice();

            //Set the max rows
            MaxRows = ds1.Tables["Invoice"].Rows.Count;

            con.Close();
            //MessageBox.Show("closed");

        }

Problemet är om jag har en till form och vill komma åt databasen. Hört något om Data Access Layer men en sökning gör min inte klokare. Hur lyfter jag ut kopplingen till en annan klass så att jag kan komma åt den från en annan klass (ett annat Windows form)?

Något enkelt exempel? Eller modifiera min kod?

Medlem sedan apr. 20012 266 inlägg
#2

Som du skriver är syftet just med ett Data Access Layer (datalager) att lyfta ut och abstrahera databaskopplingar från resterande komponenter. På sådant sätt kan samma metoder för att kommunicera med databas lätt användas på flera ställen (i detta fall dina formulär). Samtidigt blir formulären dessutom mindre beroende av den exakta tekniken bakom dina databasanrop och går därför lättare att byta ut. Utöver det, och kanske lite överkurs, går även klasserna enklare att testa då t.ex. formulären kan användas med låtsasdataskopplingar, och databaskomponenterna kan testas fristående från formulären.

Oftast när man konstruerar ett datalager definerar man ett antal metoder (kontrakt) som t.ex. getInvoices() som retunerar en lista av klassen Invoice. I ditt fall har du valt att använda DataSet vilket också fungerar, även om det ibland kan bli mer rörigt utan väldefinerade kontrakt såsom klasser. Nedan följer ett exempel på hur ditt datalager skulle kunna se ut:

public class InvoiceDAL : IDisposable 
{
	private System.Data.SqlClient.SqlConnection con;

	public InvoiceDAL(String connectionString) {
		con.ConnectionString = connectionString;
		con.Open();
	}

	public DataSet GetInvoices() {
		string sql = "select * from invoice";

		DataSet dataSet = new DataSet();

		da = new System.Data.SqlClient.SqlDataAdapter(sql, con);
		da.Fill(dataSet, "Invoice");
	
		return dataSet; 
	}

	public void Dispose() 
	{
        	// Close database connections etc.      
	}
}

Sedan i ditt formulär använder du klassen ovan för att anropa databasen:

...
private void Form1_Load(object sender, EventArgs e)
{
	using (var dal = new InvoiceDAL("Data Source=(local);Initial Catalog=invoice_db;Integrated Security=SSPI")) {
		ds1 = dal.GetInvoices();
	}
 
	NavigateInvoice();

	//Set the max rows
	MaxRows = ds1.Tables["Invoice"].Rows.Count;
}

Hoppas ovanstående kan ge lite inspiration, det finns mycket mer att läsa om hur man strukturerar kod. Något jag funnit hjälpsamt är att definera klasser som modellerar den domän din applikation arbetar inom. Med dessa klasser använder man sedan en objekt-till-databas-mappare (ORM), t.ex. Subsonic eller Entity Framework 4.

http://subsonicproject.com/
http://msdn.microsoft.com/en-us/data/aa937723

Mvh
Kristoffer

259 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)