一些小型的項目,在不使用其他的框架(LINQ,NHibernate,EF等等框架)的前提下,這時候一些反復的增刪改查就會讓我們感到極其的繁瑣,厭煩,為了避免這種情況出現,本人寫了一個小的工具類.自動將實體類添加到數據庫.
實現功能的思路:
1,通過反射獲取該對象名稱和所有屬性名稱,然后組合成insert SQL字符串
(前提是對象屬性名稱和數據庫字段名稱一致,表名稱和實體類名稱一致.不區分大小寫).
2,通過反射獲取該對象的每個屬性值,並動態的往已經定義好的SqlParameter數組里添加SqlParameter,
SqlParameter參數的名稱與屬性名稱一致.
3,執行SQL。
開始代碼:
CODE_1,定義方法命名先,第一參數是需要插入數據的對象實例,第二個參數是自動增長的主鍵名稱(不區分大小寫)
public static int Insert(Object obj, string identityName) { }
CODE_2,反射獲取對象數據
StringBuilder commandText = new StringBuilder(" insert into ");
Type type = obj.GetType();
string tableName = type.Name;//表名稱
PropertyInfo[] pros = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);//所有字段名稱
StringBuilder fieldStr = new StringBuilder();//拼接需要插入數據庫的字段
StringBuilder paramStr = new StringBuilder();//拼接每個字段對應的參數
int len = pros.Length;
if (!"".Equals(identityName) && null != identityName) param = new SqlParameter[len-1];//如果有自動增長的字段,則該字段不需要SqlParameter
int paramLIndex = 0;
for (int i = 0; i < len; i++)
{
string fieldName = pros[i].Name;
if (!fieldName.ToUpper().Equals(identityName.ToUpper()))
{//非自動增長字段才加入SQL語句
fieldStr.Append(fieldName);
string paramName = "@" + fieldName;//SQL語句的字段名稱和參數名稱保持一致
paramStr.Append(paramName);
if (i < (len - 1))
{
fieldStr.Append(",");//參數和字段用逗號隔開
paramStr.Append(",");
}
object val = type.GetProperty(fieldName).GetValue(obj, null);// 根據屬性名稱獲取當前屬性的值
if (val == null) val = DBNull.Value;//如果該值為空的話,則將其轉化為數據庫的NULL
param[paramLIndex] = new SqlParameter(fieldName, val);//給每個參數賦值
paramLIndex++;
}
}
commandText.Append(tableName);
commandText.Append(" ( ");
commandText.Append(fieldStr);
commandText.Append(" ) values ( ");
commandText.Append(paramStr);
commandText.Append(" ) ");//拼接成完整的字符串
DBHelp.ExcuteSave(commandText.ToString(), param)//執行該INSERT SQL 語句
最后一行執行SQL語句的代碼就不需要再說了吧.....
其實如果能自動生成指定數據庫的實體類,那么又減輕的一些繁瑣的工作,下一篇我將會寫到如何根據指定的數據庫生成簡單的實體類
反射需要引用到的控件名稱為
using System.Reflection;
歡迎各路同行來拍磚。。。。。
