利用反射和泛型把Model對象按行儲存進數據庫以及按行取出然後轉換成Model 類實例 MVC網站通用配置項管理
利用反射和泛型把Model對象按行儲存進數據庫以及按行取出然後轉換成Model 類實例 MVC網站通用配置項管理
2018-3-10 15:18 | 發布:Admin | 分類:代碼庫 | 評論:0 | 瀏覽:45 |該類在MVC中可以方便管理配置信息,可以直接把Model儲存進數據庫或者從數據庫去除數據轉為Model.
1 何為配置項目?
比如網站的名稱,頁腳信息,meta中的KeyWord信息等,如果不想硬編碼到網頁裏,就需要使用配置文件進行儲存,通常都是儲存到數據庫中.使用的時候讀取出來,也方便修改.
2 MVC中對於數據的編輯一般是Model建模,然後View調用強類型,使用諸如@Html.TextBoxFor(m=>m.Name)之類的方式,取值時可以直接取到Model,不用再根據Request.From來一個一個的去賦值.
3 MVC的特性提供了強大的數據自檢能力,如果Model中屬性為Int類型,那麽輸入的時候如果不是數字則會直接提示類型錯誤.該特性支持正則表達式,可以說不用寫一句js代碼就可以完成數據的服務器端和客戶端雙重驗證,十分強大.
4 本類只有兩個方法,一個Load 一個Save,顧名思義,一個讀取一個儲存.參數都采用了泛型.你可以創建一個ConfigWebSIteModel基本設置類,
然後再創建一個ConfigSeo類,來分別管理不同的配置項目,可以一並儲存到一個數據表中.
1 2 |
T Load<T>();
void Save<T>(T t); |
不用的類中的屬性不可以重復,否則會覆蓋,比如ConfigWebSiteModel中有個ConfigWebSiteModel.Name 那麽 ConfigSeo中就不能在出現Name屬性,否則會覆蓋掉,出錯.
核心代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Text;
using ChengChenXu.Blog.Models;
using System.Reflection;
using System.Data.SqlClient;
namespace ChengChenXu.Blog.DAL.SqlServer
{
public class ConfigModelDAL:IConfigModelDAL
{
private readonly string tableName = "blog_Config" ; //表名
private readonly string columnKey = "c_Key" ; //key列名
private readonly string columnValue = "c_Value" ; //Value列名
private readonly string columnType = "c_Type" ; //Type列名
/// <summary>
/// 加載
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T Load<T>()
{
//通過sqlhelper獲取datatable
string sql = "select * from " + tableName;
DataTable dt = SqlHelper.ExecuteDataTable(sql);
//不存在記錄
if (dt.Rows.Count == 0) return default (T);
//表行轉換成列 ,臨時表
DataTable temp = new DataTable();
foreach (DataRow dr in dt.Rows)
{
//添加一列,設置列的數據類型
DataColumn dc = new DataColumn();
dc.ColumnName = dr[columnKey].ToString();
//根據字符串設置數據類型
dc.DataType = System.Type.GetType(dr[columnType].ToString());
temp.Columns.Add(dc);
//如果時第一列,添加一行
int index = temp.Columns.Count - 1;
if (temp.Rows.Count == 0) temp.Rows.Add();
//如果不是第一例,則行必定已經存在,直接賦值
temp.Rows[0][index] = dr[columnValue];
}
if (temp.Columns.Count == 0) return default (T);
//把臨時表轉換成Model並返回
return temp.Rows[0].ToModel<T>();
}
/// <summary>
/// 保存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
public void Save<T>(T t)
{
//利用反射獲取對象所有屬性
string attributeName = String.Empty;
PropertyInfo[] propertys = t.GetType().GetProperties();
//獲取數據庫配置表放到內存中,對比數據是否已經存在
DataTable dt = new DataTable();
if (propertys.Length > 0)
{
dt = SqlHelper.ExecuteDataTable( "select * from " +tableName+ "" );
//給表設置主鍵,方便查找.
dt.PrimaryKey= new [] {(dt.Columns[columnKey])};
}
//依次保存對象屬性到數據庫
foreach (PropertyInfo pi in propertys)
{
//獲取屬性值
var a = pi.GetValue(t, null );
//值為NULL跳出,不保存,進入下個循環
if (a == null )
{
SqlHelper.ExecuteNonQuery( "delete from " +tableName+ " where " +columnKey+ " =‘" +pi.Name+ "‘ " );
continue ;
}
//準備sql參數
SqlParameter[] parameters = SqlHelper.CreatParameters(
new string [] { "Key" , "Value" , "Type" },
new object [] { pi.Name, a, a.GetType().ToString() }
);
//查找屬性是否已經存在於數據庫中
if (dt.Rows.Contains(pi.Name))
{
//存在 更新屬性
SqlHelper.ExecuteNonQuery(
"update " + tableName + " set " + columnValue + " = @Value , " + columnType + " = @Type where " + columnKey + " = @Key" ,
parameters
);
}
else
{
//不存在 插入屬性
SqlHelper.ExecuteNonQuery(
"insert into " + tableName + " (" + columnKey + "," + columnValue + "," + columnType + ") values (@key,@value,@type) " ,
parameters
);
}
}
}
}
}
|
該類用到了兩個外部類,一個是SqlHelper 就是普通的數據庫輔助類,只用到了根據Sql語句和參數進行查詢,更新,插入的功能,可以替換為自己的Helper類或者直接在此類中完成數據庫操作
另外一個是把DataRow轉換為Model對象的類,這個類是一個擴展方法,引用之後就可以直接對DataRows實例進行ToModel操作了.
1 |
return temp.Rows[0].ToModel<T>();
|
Sqlhelper類不再貼出,可以自己查找.擴展方法見本文:http://www.chengchenxu.com/Article/10/
本博客源碼中也使用了此類,可以關註後期整理好源碼後會開源,可以參考用法.
使用方法很簡單:
1 這四個屬性對應數據庫中的表名以及列名,可以自定義,例如下圖這樣.
1 2 3 4 |
private readonly string tableName = "blog_Config" ; //表名
private readonly string columnKey = "c_Key" ; //key列名
private readonly string columnValue = "c_Value" ; //Value列名
private readonly string columnType = "c_Type" ; //Type列名
|
key要設置為主鍵,類型都為varchar,長度視情況而定.
2 數據庫鏈接字符串都是sqlHelper類中定義,SqlHelper類參考文章:http://www.chengchenxu.com/Article/11/sqlhelper
3 創建一個Model
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class ConfigSeoModel
{
[Display(Name = "Meta關鍵字" )]
public string KeyWord { get ; set ; }
[Display(Name = "Meta描述" )]
public string Description { get ; set ; }
}
//
ConfigModelDAL dal= new ConfigModelDAL();
//new 一個Model
ConfigSeoModel model= new ConfigSeoModel();
model.KeyWord= "關鍵字" ;
model.Description = "描述"
//完成保存
dal.Save<ConfigSeoModel>(model);
//讀取
ConfigSeoModel model = dal.Load<ConfigModel>();
|
本文為博主原創,轉載請保留出處:
http://www.chengchenxu.com/Article/24/fanxing
相關文章:
C.Net串口工具源碼 串口調試工具 支持16進制發送 可以定時自動發送
利用反射和泛型把Model對象按行儲存進數據庫以及按行取出然後轉換成Model 類實例 MVC網站通用配置項管理
asp.net MVC通用分頁組件 使用方便 通用性強
.NET C#生成隨機顏色,可以控制亮度,生成暗色或者亮色 基於YUV模式判斷顏色明亮度
微軟官方SqlHelper類以及輔助訪問類 簡化使用方法
DataTable和DataRow利用反射直接轉換為Model對象的擴展方法類
利用反射和泛型把Model對象按行儲存進數據庫以及按行取出然後轉換成Model 類實例 MVC網站通用配置項管理