4.使用ADO.NET實作(三層架構篇-使用Table傳遞資料)(1)
4.1 解決方案架構
解決方案(.sln)包含以下幾個項目:
(1)類庫項目HomeShop.DbUtility,資料通路實用工具;
(2)類庫項目HomeShop.Model,實體層;
(3)類庫項目HomeShop.DAL,資料通路層;
(4)類庫項目HomeShop.BLL,業務邏輯層;
(5)WinForm項目HomeShop.WinForm,界面層。
4.2 資料通路實用工具HomeShop.DbUtility
SqlDbHelper.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data;//新添命名空間
6 using System.Configuration;//新添命名空間
7 using System.Data.SqlClient;//新添命名空間
8
9 namespace HomeShop.DbUtility
10 {
11 //功能:SQL Server資料通路基礎類;
12 //作者:夏春濤;
13 //日期:2011-11-30;
14 public class SqlDbHelper
15 {
16 //資料庫連接配接字元串
17 private string connectionString = "";
18 public string ConnectionString
19 {
20 get {return connectionString; }
21 }
22
23 //資料庫連接配接對象
24 private SqlConnection connection;
25
26 //預設構造函數,從應用程式配置檔案中讀取第1個資料庫連接配接字元串
27 public SqlDbHelper()
28 {
29 this.connectionString = ConfigurationManager.ConnectionStrings[1].ConnectionString;
30 this.connection = new SqlConnection(this.connectionString);
31 }
32
33 //重載構造函數,根據入參初始化資料庫連接配接字元串
34 public SqlDbHelper(string connectionString)
35 {
36 this.connectionString = connectionString;
37 this.connection = new SqlConnection(this.connectionString);
38 }
39
40 //執行SQL指令(Select),擷取傳回資料-重載函數
41 public DataTable ExecuteQuery(string selectCommandText)
42 {
43 return ExecuteQuery(selectCommandText, null);
44 }
45
46 //執行SQL指令(Select),擷取傳回資料
47 public DataTable ExecuteQuery(string selectCommandText, params SqlParameter[] cmdParameters)
48 {
49 connection.Open();
50 SqlCommand command = new SqlCommand(selectCommandText, connection);
51 if (null != cmdParameters)
52 {
53 for (int i = 0; i < cmdParameters.Length; i++)
54 {
55 command.Parameters.Add(cmdParameters[i]);
56 }
57 }
58 SqlDataAdapter adapter = new SqlDataAdapter(command);
59 DataTable dataTable = new DataTable();
60 adapter.Fill(dataTable);
61 connection.Close();
62
63 return dataTable;
64 }
65
66 //執行SQL指令(Insert/Delete/Update),以資料庫事務方式
67 public int ExecuteNonQueryTrans(string cmdText, params SqlParameter[] cmdParameters)
68 {
69 int rowsCountAffected = 0;
70 connection.Open();
71 SqlCommand command = new SqlCommand(cmdText, connection);
72 if (null != cmdParameters)
73 {
74 for (int i = 0; i < cmdParameters.Length; i++)
75 {
76 command.Parameters.Add(cmdParameters[i]);
77 }
78 }
79 //開始資料庫事務
80 SqlTransaction trans = connection.BeginTransaction();
81 command.Transaction = trans;
82 try
83 {
84 rowsCountAffected += command.ExecuteNonQuery();
85 trans.Commit();//送出資料庫事務
86 }
87 catch
88 {
89 trans.Rollback();//復原資料庫事務
90 throw;
91 }
92 connection.Close();
93
94 return rowsCountAffected;
95 }
96
97 //執行多條SQL(Insert/Delete/Update),以資料庫事務方式-重載函數
98 public int ExecuteNonQueryTrans(params SqlCmdTextAndParams[] cmdTextAndParams)
99 {
100 List<SqlCmdTextAndParams> list = new List<SqlCmdTextAndParams>();
101 for(int i=0;i<cmdTextAndParams.Length;i++)
102 {
103 list.Add(cmdTextAndParams[i]);
104 }
105
106 return ExecuteNonQueryTrans(list);
107 }
108
109 //執行多條SQL(Insert/Delete/Update),以資料庫事務方式
110 public int ExecuteNonQueryTrans(List<SqlCmdTextAndParams> listCmdTextAndParams)
111 {
112 int rowsCountAffected = 0;
113 connection.Open();
114 //開始資料庫事務
115 SqlTransaction trans = connection.BeginTransaction();
116 SqlCommand command = new SqlCommand();
117 command.Connection = connection;
118 command.Transaction = trans;
119 try
120 {
121 //循環執行每一個CommandTextAndParameters對象
122 foreach (SqlCmdTextAndParams cmdTextAndParams in listCmdTextAndParams)
123 {
124 command.CommandText = cmdTextAndParams.CommandText;
125 foreach (SqlParameter param in cmdTextAndParams.CommandParameters)
126 {
127 command.Parameters.Add(param);
128 }
129 rowsCountAffected += command.ExecuteNonQuery();
130 //清空參數清單,避免參數重名問題
131 command.Parameters.Clear();
132 }
133 trans.Commit();//送出資料庫事務
134 }
135 catch
136 {
137 trans.Rollback();//復原資料庫事務
138 throw;
139 }
140 connection.Close();
141
142 return rowsCountAffected;
143 }
144
145 //開始(生成)一個資料庫事務
146 public SqlTransaction BeginTransaction()
147 {
148 connection.Open();
149 SqlTransaction trans = connection.BeginTransaction();
150
151 return trans;
152 }
153
154 //在指定的資料庫事務中執行SQL指令,最後要手工送出事務
155 public int ExecuteNonQueryTrans(SqlTransaction inTransaction, string cmdText, params SqlParameter[] cmdParameters)
156 {
157 int rowsCountAffected = 0;
158 SqlCommand command = new SqlCommand(cmdText, inTransaction.Connection);
159 if (null != cmdParameters)
160 {
161 for (int i = 0; i < cmdParameters.Length; i++)
162 {
163 command.Parameters.Add(cmdParameters[i]);
164 }
165 }
166 command.Transaction = inTransaction;
167 rowsCountAffected += command.ExecuteNonQuery();
168 command.Parameters.Clear();//清空參數清單,避免參數重名問題
169
170 return rowsCountAffected;
171 }
172
173 //關閉資料庫連接配接
174 public void Close()
175 {
176 if (ConnectionState.Open == this.connection.State )
177 this.connection.Close();
178 }
179
180 /****************************************************************************************/
181 }
182 }
SqlCmdTextAndParams.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data.SqlClient;//新添命名空間
6
7 namespace HomeShop.DbUtility
8 {
9 //用于儲存一條SQL指令及對應參數的類
10 public class SqlCmdTextAndParams
11 {
12 public SqlCmdTextAndParams(string commandText, params SqlParameter[] commandParamters)
13 {
14 this.CommandText = commandText;
15 this.CommandParameters = commandParamters;
16 }
17
18 public string CommandText { set; get; }
19
20 public SqlParameter[] CommandParameters { set; get; }
21 }
22 }