Zunächst erstellen Sie eine einzelne Stelle in der Datenschicht, um Verbindungsinformationen abzurufen. Dies kann ein privates Mitglied sein, wenn Ihre Datenschicht auf eine einzelne Klasse oder ein internes Element beschränkt ist, wenn die Ebene eine gesamte Baugruppe umfasst. Es könnte eine Verbindungszeichenfolge oder ein tatsächliches Verbindungsobjekt zurückgeben selbst, aber die Hauptsache ist, dass es überhaupt nicht außerhalb der Datenschicht ausgesetzt ist:
private static ConnectionString { get { // read from config file once.... return ""; } }
private SqlConnection getConnection()
{
SqlConnection result = new SqlConnection(ConnectionString);
result.Open(); // I like to open it in advance, but that's less common
return result; // you'll want some error handling code in here as well
}
Sie dann öffentliche Methoden in der Datenschicht bereitzustellen, die die Schnittstelle, die Sie passen möchte der Business-Schicht zur Verfügung stellen. In einer gut gestalteten App wird dies im Allgemeinen mit den gespeicherten Prozeduren übereinstimmen, und das hört sich nach dem an, was Sie anstreben, aber manchmal klappt es nicht so gut. Sie müssen möglicherweise mehrere Prozeduren von einer Methode aufrufen.
Was auch immer Sie tun, die Methode sollte stark typisierte Parameterwerte akzeptieren, die beim Aufrufen der Prozeduren verwendet werden. Es gibt Diskussionen darüber, ob die Methode ein Geschäftsobjekt oder einen Datensatz zurückgeben soll.Persönlich neige ich Zurückgeben eines Datarecord favorisieren, sondern eine zusätzliche „Schicht“ ermöglichen, wenn die data übersetzt werden stark typisierte Business-Objekte:
public IDataRecord GetXYZ(int id)
{
DataTable dt = new DataTable();
using (var cn = getConnection())
using (var cmd = new SqlCommand("getXYZ"))
{
cmd.CommandType = CommandTypes.StoredProcedure;
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = id;
using (var rdr = cmd.ExecuteReader())
{
dt.Load(rdr);
}
}
//obviously put a little more work into your error handling
if (dt.Rows.Count <= 0)
throw new Exception("oops");
return dt.Rows[0];
}
public class XYZFactory
{
public static XZY Create(IDataRecord row)
{
XYZ result = new XYZ();
result.id = row["ID"];
result.otherfield = row["otherfield"];
return result;
}
}
tut mir leid im using sqlserver. – raklos
+1 für 'using()', um Speicherlecks zu beseitigen! –
es ist nicht Speicher, um den Sie sich sorgen müssen - es sind die Db-Verbindungen. –