[英]Generic Data Access Layer in an Multi-Layer Arcitechture
我需要創建一個通用數據訪問層,以便在我最終的軟件工程任務中使用,但我當前創建的數據訪問層可以自動生成CRUD(創建,讀取,更新和刪除)SQL語句。 我仍然需要在我的數據庫中定義每個表,每次更改數據庫時,我都需要在數據訪問層中定義更改。
請查看我的代碼示例,並告訴我如何更改我的代碼以改進我的訪問層:
class sqlConn
{
//Local
private String strConn = @"Data Source=.\SQLEXPRESS;" +
@"AttachDbFilename='D:\JP Stuff\BELGIUM CAMPUS\3de Jaar\SOFTWARE ENGINEERING\ASSIGNMENT\Premier Service Solutions\Premier Service Solutions\DB\db_PSS_1.0.mdf';" +
@"Integrated Security=True;" +
@"User Instance=True";
private SqlConnection conn;
//Properties
public SqlConnection Conn
{
get { return this.conn = new SqlConnection(this.strConn); }
}
//Constructor
public sqlConn()
{
}
}
class sqlFactory : sqlConn
{
//Constructor
public sqlFactory()
: base()
{
}
//Insert Record into database
public void Create(String[] dbData, List<String> strRow)
{
using (SqlConnection sqlCon = this.Conn)
using (SqlCommand com = new SqlCommand("SELECT * FROM " + dbData[0], sqlCon))
{
SqlDataAdapter da = new SqlDataAdapter(com);
SqlCommandBuilder sqlbuilder = new SqlCommandBuilder(da);
DataSet ds = new DataSet();
da.Fill(ds, dbData[0]);
DataRow dr = ds.Tables[dbData[0]].NewRow();
for (int i = 0; i < dbData.Count() - 2; i++)
{
dr[i + 1] = strRow[i];
}
ds.Tables[dbData[0]].Rows.Add(dr);
da.Update(ds, dbData[0]);
}
}
}
class dbDefinitions : sqlFactory
{
public static Dictionary<String, String[]> columns;
static dbDefinitions()
{
columns = new Dictionary<String,String[]>();
//tblCall Definition
#region call
String[] data = new String[]
{
"tblCall", "call_ID_PK", "call_emp_ID_FK",
"call_Description", "call_Notes", "call_Start_Time",
"call_End_Time", "call_Job_FK"
};
columns.Add("call", data);
#endregion
}
}
這可能無法完全回答您的問題,但您可以通過多種方式改進此代碼。
構成與繼承
首先,理解並應用組合而不是繼承。 構成是“有”關系,而繼承是“是一種”關系。
例如,如果Person類具有Phone類類型的屬性,則它的組成。
public class Person
{
public Phone Phone {get; set;}
}
如果Person類是從Phone類繼承的,那么它是繼承。
public class Person : Phone
{
}
在你的代碼中,sqlFactory應該包含一個sqlConn而不是從它繼承。
組合提供了更大的靈活性,特別是因為C#不允許多重繼承。 在這里閱讀更多:更喜歡繼承的組合?
SQL注入
你永遠不應該像這樣使用字符串連接來構建sql語句。
"SELECT * FROM " + dbData[0]
這會產生一個潛在的安全漏洞,允許SQL注入攻擊。 您應該始終使用參數化查詢來防止這種情況。
閱讀提示/技巧:防范SQL注入攻擊以了解SQL注入攻擊以及如何防止它們。
編碼公約
C#開發人員幾乎普遍接受的類命名約定是使用PascalCase,其中類名中每個單詞的首字母大寫。 您的類將是SqlFactory,SqlConn和DbDefinition。
本指南提供了相當常用的約定: C#編碼標准文檔
您的DAO應該具有作為表的模型的支持類。 這些模型都應該有一個共同的界面。 然后,您的DAO應該具有Model接口的實例,其XML配置指向模型的正確表。 這將使您無需在代碼中定義表。 您的數據訪問層是訪問數據的層,而不是定義數據的層。 您的模型應該定義數據。
嘗試在xml文件中定義數據庫模式信息並讀取它以創建CRUD操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.