.NET 利用反射將對象數據添加到數據庫


一些小型的項目,在不使用其他的框架(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;

歡迎各路同行來拍磚。。。。。

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM