最近一段时间一直在总结过去一年中的经验教训,突然发现还没毕业那会做的项目:一平台,语言是c#,数据库用MYSQL,所以需要写一个类似于SQLHelper的类,虽然不再使用了,拿出来晒晒,说不定哪天会有人需要,也可以参考下。
View Code
1 /* ---------------------------------------------------------------- 2 // File Name:MYSQLHelper.cs 3 // File Description: 4 * DataBase Deal Layer 5 * 6 // Create Mark: 7 * Create Date: 2011-04-14 8 * Create By: Mike.Jiang 9 // Modify Mark: 10 * Modify Date 11 * Modify By 12 //---------------------------------------------------------------- */ 13 using System; 14 using System.Collections.Generic; 15 using System.Text; 16 using System.Data; 17 using System.Collections; 18 using MySql.Data.MySqlClient; 19 using System.Configuration; 20 using System.IO; 21 22 23 namespace PLA.DBUtility 24 { 25 /// <summary> 26 /// when use mysql database application this class 27 /// Generic database access code 28 /// this class that is a abstract,which does not allow instantiation, the application can directly call it 29 /// </summary> 30 public abstract class MYSQLHelper 31 { 32 // Get the database connectionstring, which are static variables and readonly, all project documents can be used directly, but can not modify it 33 // the database connectionString 34 // public static readonly string connectionStringManager = ConfigurationManager.ConnectionStrings["MYSQLConnectionString"].ConnectionString; 35 public static string ConnectionStringManager { 36 get { return connectionStringManager; } 37 } 38 39 40 41 // This connectionString for the local test 42 public static readonly string connectionStringManager = ConfigurationManager.ConnectionStrings[ " LocalMYSQLConnectionString " ].ConnectionString; 43 44 // hashtable to store the parameter information, the hash table can store any type of argument 45 // Here the hashtable is static types of static variables, since it is static, that is a definition of global use. 46 // All parameters are using this hash table, how to ensure that others in the change does not affect their time to read it 47 // Before ,the method can use the lock method to lock the table, does not allow others to modify.when it has readed then unlocked table. 48 // Now .NET provides a HashTable's Synchronized methods to achieve the same function, no need to manually lock, completed directly by the system framework 49 private static Hashtable parmCache = Hashtable.Synchronized( new Hashtable()); 50 51 /// <summary> 52 /// Execute a SqlCommand command that does not return value, by appointed and specified connectionstring 53 /// The parameter list using parameters that in array forms 54 /// </summary> 55 /// <remarks> 56 /// Usage example: 57 /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, 58 /// "PublishOrders", new MySqlParameter("@prodid", 24)); 59 /// </remarks> 60 /// <param name="connectionString"> a valid database connectionstring </param> 61 /// <param name="cmdType"> MySqlCommand command type (stored procedures, T-SQL statement, and so on.) </param> 62 /// <param name="cmdText"> stored procedure name or T-SQL statement </param> 63 /// <param name="commandParameters"> MySqlCommand to provide an array of parameters used in the list </param> 64 /// <returns> Returns a value that means number of rows affected/returns> 65 public static int ExecuteNonQuery( string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) 66 { 67 MySqlCommand cmd = new MySqlCommand(); 68 69 using (MySqlConnection conn = new MySqlConnection(connectionString)) 70 { 71 PrepareCommand(cmd, conn, null , cmdType, cmdText, commandParameters); 72 int val = cmd.ExecuteNonQuery(); 73 cmd.Parameters.Clear(); 74 return val; 75 } 76 } 77 78 /// <summary> 79 /// Execute a SqlCommand command that does not return value, by appointed and specified connectionstring 80 /// The parameter list using parameters that in array forms 81 /// </summary> 82 /// <remarks> 83 /// Usage example: 84 /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, 85 /// "PublishOrders", new MySqlParameter("@prodid", 24)); 86 /// </remarks> 87 /// <param name="cmdType"> MySqlCommand command type (stored procedures, T-SQL statement, and so on.) </param> 88 /// <param name="connectionString"> a valid database connectionstring </param> 89 /// <param name="cmdText"> stored procedure name or T-SQL statement </param> 90 /// <param name="commandParameters"> MySqlCommand to provide an array of parameters used in the list </param> 91 /// <returns> Returns true or false </returns> 92 public static bool ExecuteNonQuery(CommandType cmdType, string connectionString, string cmdText, params MySqlParameter[] commandParameters) 93 { 94 MySqlCommand cmd = new MySqlCommand(); 95 96 using (MySqlConnection conn = new MySqlConnection(connectionString)) 97 { 98 PrepareCommand(cmd, conn, null , cmdType, cmdText, commandParameters); 99 try 100 { 101 int val = cmd.ExecuteNonQuery(); 102 return true ; 103 } 104 catch 105 { 106 return false ; 107 } 108 finally 109 { 110 cmd.Parameters.Clear(); 111 } 112 } 113 } 114 /// <summary> 115 /// Execute a SqlCommand command that does not return value, by appointed and specified connectionstring 116 /// Array of form parameters using the parameter list 117 /// </summary> 118 /// <param name="conn"> connection </param> 119 /// <param name="cmdType"> MySqlCommand command type (stored procedures, T-SQL statement, and so on.) </param> 120 /// <param name="cmdText"> stored procedure name or T-SQL statement </param> 121 /// <param name="commandParameters"> MySqlCommand to provide an array of parameters used in the list </param> 122 /// <returns> Returns a value that means number of rows affected </returns> 123 public static int ExecuteNonQuery(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) 124 { 125 MySqlCommand cmd = new MySqlCommand(); 126 PrepareCommand(cmd, conn, null , cmdType, cmdText, commandParameters); 127 int val = cmd.ExecuteNonQuery(); 128 cmd.Parameters.Clear(); 129 return val; 130 } 131 132 /// <summary> 133 /// Execute a SqlCommand command that does not return value, by appointed and specified connectionstring 134 /// Array of form parameters using the parameter list 135 /// </summary> 136 /// <param name="conn"> sql Connection that has transaction </param> 137 /// <param name="cmdType"> SqlCommand command type (stored procedures, T-SQL statement, and so on.) </param> 138 /// <param name="cmdText"> stored procedure name or T-SQL statement </param> 139 /// <param name="commandParameters"> MySqlCommand to provide an array of parameters used in the list </param> 140 /// <returns> Returns a value that means number of rows affected </returns> 141 public static int ExecuteNonQuery(MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) 142 { 143 MySqlCommand cmd = new MySqlCommand(); 144 PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters); 145 int val = cmd.ExecuteNonQuery(); 146 cmd.Parameters.Clear(); 147 return val; 148 } 149 150 /// <summary> 151 /// Call method of sqldatareader to read data 152 /// </summary> 153 /// <param name="connectionString"> connectionstring </param> 154 /// <param name="cmdType"> command type, such as using stored procedures: CommandType.StoredProcedure </param> 155 /// <param name="cmdText"> stored procedure name or T-SQL statement </param> 156 /// <param name="commandParameters"> parameters </param> 157 /// <returns> SqlDataReader type of data collection </returns> 158 public static MySqlDataReader ExecuteReader( string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) 159 { 160 MySqlCommand cmd = new MySqlCommand(); 161 MySqlConnection conn = new MySqlConnection(connectionString); 162 163 // we use a try/catch here because if the method throws an exception we want to 164 // close the connection throw code, because no datareader will exist, hence the 165 // commandBehaviour.CloseConnection will not work 166 try 167 { 168 PrepareCommand(cmd, conn, null , cmdType, cmdText, commandParameters); 169 MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 170 cmd.Parameters.Clear(); 171 return rdr; 172 } 173 catch 174 { 175 conn.Close(); 176 throw ; 177 } 178 } 179 180 /// <summary> 181 /// use the ExectueScalar to read a single result 182 /// </summary> 183 /// <param name="connectionString"> connectionstring </param> 184 /// <param name="cmdType"> command type, such as using stored procedures: CommandType.StoredProcedure </param> 185 /// <param name="cmdText"> stored procedure name or T-SQL statement </param> 186 /// <param name="commandParameters"> parameters </param> 187 /// <returns> a value in object type </returns> 188 public static object ExecuteScalar( string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) 189 { 190 MySqlCommand cmd = new MySqlCommand(); 191 192 using (MySqlConnection connection = new MySqlConnection(connectionString)) 193 { 194 PrepareCommand(cmd, connection, null , cmdType, cmdText, commandParameters); 195 object val = cmd.ExecuteScalar(); 196 cmd.Parameters.Clear(); 197 return val; 198 } 199 } 200 201 public static DataSet GetDataSet( string connectionString, string cmdText, params MySqlParameter[] commandParameters) 202 { 203 DataSet retSet = new DataSet(); 204 using (MySqlDataAdapter msda = new MySqlDataAdapter(cmdText, connectionString)) 205 { 206 msda.Fill(retSet); 207 } 208 return retSet; 209 } 210 211 /// <summary> 212 /// cache the parameters in the HashTable 213 /// </summary> 214 /// <param name="cacheKey"> hashtable key name </param> 215 /// <param name="commandParameters"> the parameters that need to cached </param> 216 public static void CacheParameters( string cacheKey, params MySqlParameter[] commandParameters) 217 { 218 parmCache[cacheKey] = commandParameters; 219 } 220 221 /// <summary> 222 /// get parameters in hashtable by cacheKey 223 /// </summary> 224 /// <param name="cacheKey"> hashtable key name </param> 225 /// <returns> the parameters </returns> 226 public static MySqlParameter[] GetCachedParameters( string cacheKey) 227 { 228 MySqlParameter[] cachedParms = (MySqlParameter[])parmCache[cacheKey]; 229 230 if (cachedParms == null ) 231 return null ; 232 233 MySqlParameter[] clonedParms = new MySqlParameter[cachedParms.Length]; 234 235 for ( int i = 0 , j = cachedParms.Length; i < j; i++ ) 236 clonedParms[i] = (MySqlParameter)((ICloneable)cachedParms[i]).Clone(); 237 238 return clonedParms; 239 } 240 241 /// <summary> 242 /// Prepare parameters for the implementation of the command 243 /// </summary> 244 /// <param name="cmd"> mySqlCommand command </param> 245 /// <param name="conn"> database connection that is existing </param> 246 /// <param name="trans"> database transaction processing </param> 247 /// <param name="cmdType"> SqlCommand command type (stored procedures, T-SQL statement, and so on.) </param> 248 /// <param name="cmdText"> Command text, T-SQL statements such as Select * from Products </param> 249 /// <param name="cmdParms"> return the command that has parameters </param> 250 private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms) 251 { 252 if (conn.State != ConnectionState.Open) 253 conn.Open(); 254 255 cmd.Connection = conn; 256 cmd.CommandText = cmdText; 257 258 if (trans != null ) 259 cmd.Transaction = trans; 260 261 cmd.CommandType = cmdType; 262 263 if (cmdParms != null ) 264 foreach (MySqlParameter parm in cmdParms) 265 cmd.Parameters.Add(parm); 266 } 267 #region parameters 268 /// <summary> 269 /// Set parameters 270 /// </summary> 271 /// <param name="ParamName"> parameter name </param> 272 /// <param name="DbType"> data type </param> 273 /// <param name="Size"> type size </param> 274 /// <param name="Direction"> input or output </param> 275 /// <param name="Value"> set the value </param> 276 /// <returns> Return parameters that has been assigned </returns> 277 public static MySqlParameter CreateParam( string ParamName, MySqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value) 278 { 279 MySqlParameter param; 280 281 282 if (Size > 0 ) 283 { 284 param = new MySqlParameter(ParamName, DbType, Size); 285 } 286 else 287 { 288 289 param = new MySqlParameter(ParamName, DbType); 290 } 291 292 293 param.Direction = Direction; 294 if (!(Direction == ParameterDirection.Output && Value == null )) 295 { 296 param.Value = Value; 297 } 298 299 300 return param; 301 } 302 303 /// <summary> 304 /// set Input parameters 305 /// </summary> 306 /// <param name="ParamName"> parameter names, such as:@ id </param> 307 /// <param name="DbType"> parameter types, such as: MySqlDbType.Int </param> 308 /// <param name="Size"> size parameters, such as: the length of character type for the 100 </param> 309 /// <param name="Value"> parameter value to be assigned </param> 310 /// <returns> Parameters </returns> 311 public static MySqlParameter CreateInParam( string ParamName, MySqlDbType DbType, int Size, object Value) 312 { 313 return CreateParam(ParamName, DbType, Size, ParameterDirection.Input, Value); 314 } 315 316 /// <summary> 317 /// Output parameters 318 /// </summary> 319 /// <param name="ParamName"> parameter names, such as:@ id </param> 320 /// <param name="DbType"> parameter types, such as: MySqlDbType.Int </param> 321 /// <param name="Size"> size parameters, such as: the length of character type for the 100 </param> 322 /// <param name="Value"> parameter value to be assigned </param> 323 /// <returns> Parameters </returns> 324 public static MySqlParameter CreateOutParam( string ParamName, MySqlDbType DbType, int Size) 325 { 326 return CreateParam(ParamName, DbType, Size, ParameterDirection.Output, null ); 327 } 328 329 /// <summary> 330 /// Set return parameter value 331 /// </summary> 332 /// <param name="ParamName"> parameter names, such as:@ id </param> 333 /// <param name="DbType"> parameter types, such as: MySqlDbType.Int </param> 334 /// <param name="Size"> size parameters, such as: the length of character type for the 100 </param> 335 /// <param name="Value"> parameter value to be assigned <</param> 336 /// <returns> Parameters </returns> 337 public static MySqlParameter CreateReturnParam( string ParamName, MySqlDbType DbType, int Size) 338 { 339 return CreateParam(ParamName, DbType, Size, ParameterDirection.ReturnValue, null ); 340 } 341 342 /// <summary> 343 /// Generate paging storedProcedure parameters 344 /// </summary> 345 /// <param name="CurrentIndex"> CurrentPageIndex </param> 346 /// <param name="PageSize"> pageSize </param> 347 /// <param name="WhereSql"> query Condition </param> 348 /// <param name="TableName"> tableName </param> 349 /// <param name="Columns"> columns to query </param> 350 /// <param name="Sort"> sort </param> 351 /// <returns> MySqlParameter collection </returns> 352 public static MySqlParameter[] GetPageParm( int CurrentIndex, int PageSize, string WhereSql, string TableName, string Columns, Hashtable Sort) 353 { 354 MySqlParameter[] parm = { 355 MYSQLHelper.CreateInParam( " @CurrentIndex " , MySqlDbType.Int32, 4 , CurrentIndex ), 356 MYSQLHelper.CreateInParam( " @PageSize " , MySqlDbType.Int32, 4 , PageSize ), 357 MYSQLHelper.CreateInParam( " @WhereSql " , MySqlDbType.VarChar, 2500 , WhereSql ), 358 MYSQLHelper.CreateInParam( " @TableName " , MySqlDbType.VarChar, 20 , TableName ), 359 MYSQLHelper.CreateInParam( " @Column " , MySqlDbType.VarChar, 2500 , Columns ), 360 MYSQLHelper.CreateInParam( " @Sort " , MySqlDbType.VarChar, 50 , GetSort(Sort) ), 361 MYSQLHelper.CreateOutParam( " @RecordCount " , MySqlDbType.Int32, 4 ) 362 }; 363 return parm; 364 } 365 /// <summary> 366 /// Statistics data that in table 367 /// </summary> 368 /// <param name="TableName"> table name </param> 369 /// <param name="Columns"> Statistics column </param> 370 /// <param name="WhereSql"> conditions </param> 371 /// <returns> Set of parameters </returns> 372 public static MySqlParameter[] GetCountParm( string TableName, string Columns, string WhereSql) 373 { 374 MySqlParameter[] parm = { 375 MYSQLHelper.CreateInParam( " @TableName " , MySqlDbType.VarChar, 20 , TableName ), 376 MYSQLHelper.CreateInParam( " @CountColumn " , MySqlDbType.VarChar, 20 , Columns ), 377 MYSQLHelper.CreateInParam( " @WhereSql " , MySqlDbType.VarChar, 250 , WhereSql ), 378 MYSQLHelper.CreateOutParam( " @RecordCount " , MySqlDbType.Int32, 4 ) 379 }; 380 return parm; 381 } 382 /// <summary> 383 /// Get the sql that is Sorted 384 /// </summary> 385 /// <param name="sort"> sort column and values </param> 386 /// <returns> SQL sort string </returns> 387 private static string GetSort(Hashtable sort) 388 { 389 string str = "" ; 390 int i = 0 ; 391 if (sort != null && sort.Count > 0 ) 392 { 393 foreach (DictionaryEntry de in sort) 394 { 395 i++ ; 396 str += de.Key + " " + de.Value; 397 if (i != sort.Count) 398 { 399 str += " , " ; 400 } 401 } 402 } 403 return str; 404 } 405 406 /// <summary> 407 /// execute a trascation include one or more sql sentence(author:donne yin) 408 /// </summary> 409 /// <param name="connectionString"></param> 410 /// <param name="cmdType"></param> 411 /// <param name="cmdTexts"></param> 412 /// <param name="commandParameters"></param> 413 /// <returns> execute trascation result(success: true | fail: false) </returns> 414 public static bool ExecuteTransaction( string connectionString, CommandType cmdType, string [] cmdTexts, params MySqlParameter[][] commandParameters) 415 { 416 MySqlConnection myConnection = new MySqlConnection(connectionString); // get the connection object 417 myConnection.Open(); // open the connection 418 MySqlTransaction myTrans = myConnection.BeginTransaction(); // begin a trascation 419 MySqlCommand cmd = new MySqlCommand(); 420 cmd.Connection = myConnection; 421 cmd.Transaction = myTrans; 422 423 try 424 { 425 for ( int i = 0 ;i<cmdTexts.Length; i++ ) 426 { 427 PrepareCommand(cmd, myConnection, null , cmdType, cmdTexts[i], commandParameters[i]); 428 cmd.ExecuteNonQuery(); 429 cmd.Parameters.Clear(); 430 } 431 myTrans.Commit(); 432 } 433 catch 434 { 435 myTrans.Rollback(); 436 return false ; 437 } 438 finally 439 { 440 myConnection.Close(); 441 } 442 return true ; 443 } 444 #endregion 445 } 446 }