天天看點

.NET資料庫程式設計求索之路--4.使用ADO.NET實作(三層架構篇-使用Table傳遞資料)(1)

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 }