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
