標籤:使用 os io 資料 for ar cti 代碼
一般我們用使用ADO.NET查詢資料庫返回泛型集合?使用SqlDataReader逐行讀取資料存入對象
代碼
/// <summary>
/// 擷取UserInfo泛型集合
/// </summary>
/// <param name="connStr">資料庫連接字串</param>
/// <param name="sqlStr">要查詢的T-SQL</param>
/// <returns></returns>
public IList<UserInfo> GetUserInfoAll(string connStr, string sqlStr)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand(sqlStr,conn))
{
SqlDataReader sdr = cmd.ExecuteReader();
IList<UserInfo> list = new List<UserInfo>();
while (sdr.Read())
{
UserInfo userInfo = new UserInfo();
userInfo.ID = (Guid) sdr["ID"];
userInfo.LoginName = sdr["LoginName"].ToString();
userInfo.LoginPwd = sdr["LoginPwd"].ToString();
list.Add(userInfo);
}
return list;
}
}
}
這樣做雖然返回了需要的資料,但如果當資料庫表非常多的時候,針對每一個表都需要去建立這樣的一個方法,非常麻煩,也增加了重複勞動力。
而直接返回DataSet操作起來又不方便,DataSet是一種弱類型。也不如泛型集合操作效率高!
這個時候就需要我們來提取一個通用的轉換方法了?DataSetToList。
代碼
1 /// <summary>
2 /// 擷取泛型集合
3 /// </summary>
4 /// <typeparam name="T">類型</typeparam>
5 /// <param name="connStr">資料庫連接字串</param>
6 /// <param name="sqlStr">要查詢的T-SQL</param>
7 /// <returns></returns>
8 public IList<T> GetList<T>(string connStr, string sqlStr)
9 {
10 using (SqlConnection conn = new SqlConnection(connStr))
11 {
12 using (SqlDataAdapter sda = new SqlDataAdapter(sqlStr, conn))
13 {
14 DataSet ds = new DataSet();
15 sda.Fill(ds);
16 return DataSetToList<T>(ds, 0);
17 }
18 }
19 }
代碼
1 /// <summary>
2 /// DataSetToList
3 /// </summary>
4 /// <typeparam name="T">轉換類型</typeparam>
5 /// <param name="dataSet">資料來源</param>
6 /// <param name="tableIndex">需要轉換表的索引</param>
7 /// <returns>泛型集合</returns>
8 public IList<T> DataSetToList<T>(DataSet dataSet, int tableIndex)
9 {
10 //確認參數有效
11 if (dataSet == null || dataSet.Tables.Count <= 0 || tableIndex < 0)
12 return null;
13
14 DataTable dt = dataSet.Tables[tableIndex];
15
16 IList<T> list = new List<T>();
17
18
19 for (int i = 0; i < dt.Rows.Count; i++)
20 {
21 //建立泛型對象
22 T _t = Activator.CreateInstance<T>();
23
24 //擷取對象所有屬性
25 PropertyInfo[] propertyInfo = _t.GetType().GetProperties();
26
27 for (int j = 0; j < dt.Columns.Count; j++)
28 {
29 foreach (PropertyInfo info in propertyInfo)
30 {
31 //屬性名稱和列名相同時賦值
32 if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
33 {
34 if (dt.Rows[i][j]!=DBNull.Value)
35 {
36 info.SetValue(_t, dt.Rows[i][j], null);
37 }
38 else
39 {
40 info.SetValue(_t, null, null);
41 }
42
43 break;
44 }
45 }
46 }
47 list.Add(_t);
48 }
49 return list;
50 }
使用這種轉換方式需要注意的是實體類(model)的屬性必須和資料庫表的欄位名字一致(大小寫可以不考慮);
因為轉換時候的匹配是靠屬性名稱和欄位名稱匹配的;
當然如果項目中用到了Linq to Sql 的話就不必這種轉換,Linq 已經封裝好了;