SQLHelper.cs 文件 //================================================================================================= // This file is based on the Microsoft Data Access Application Block for .NET // For more information please go to http://msdn.microsoft.com/library/en-us/dnbda/html/daab-rm.asp //================================================================================================= using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Collections; namespace PetShop.DBUtility .........{ /**//**//**//**//**//**//**//// 〈summary〉 /// The SqlHelper class is intended to encapsulate high performance, /// scalable best practices for common uses of SqlClient. /// 〈/summary〉 publicabstractclass SqlHelper .........{ //Database connection strings publicstaticreadonlystring ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings[“SQLConnString1“].ConnectionString; publicstaticreadonlystring ConnectionStringInventoryDistributedTransaction = ConfigurationManager.ConnectionStrings[“SQLConnString2“].ConnectionString; publicstaticreadonlystring ConnectionStringOrderDistributedTransaction = ConfigurationManager.ConnectionStrings[“SQLConnString3“].ConnectionString; publicstaticreadonlystring ConnectionStringProfile = ConfigurationManager.ConnectionStrings[“SQLProfileConnString“].ConnectionString; // Hashtable to store cached parameters privatestatic Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); /**//**//**//**//**//**//**//// 〈summary〉 /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string /// using the provided parameters. /// 〈/summary〉 /// 〈remarks〉 /// e.g.: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, “PublishOrders“, new SqlParameter(“@prodid“, 24)); /// 〈/remarks〉 /// 〈param name=“connectionString“〉a valid connection string for a SqlConnection〈/param〉 /// 〈param name=“commandType“〉the CommandType (stored procedure, text, etc.)〈/param〉 /// 〈param name=“commandText“〉the stored procedure name or T-SQL command〈/param〉 /// 〈param name=“commandParameters“〉an array of SqlParamters used to execute the command〈/param〉 /// 〈returns〉an int representing the number of rows affected by the command〈/returns〉 publicstaticint ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) .........{ SqlCommand cmd =new SqlCommand(); using (SqlConnection conn =new SqlConnection(connectionString)) .........{ PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } } /**//**//**//**//**//**//**//// 〈summary〉 /// Execute a SqlCommand (that returns no resultset) against an existing database connection /// using the provided parameters. /// 〈/summary〉 /// 〈remarks〉 /// e.g.: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, “PublishOrders“, new SqlParameter(“@prodid“, 24)); /// 〈/remarks〉 /// 〈param name=“conn“〉an existing database connection〈/param〉 /// 〈param name=“commandType“〉the CommandType (stored procedure, text, etc.)〈/param〉 /// 〈param name=“commandText“〉the stored procedure name or T-SQL command〈/param〉 /// 〈param name=“commandParameters“〉an array of SqlParamters used to execute the command〈/param〉 /// 〈returns〉an int representing the number of rows affected by the command〈/returns〉 publicstaticint ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) .........{ SqlCommand cmd =new SqlCommand(); PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } /**//**//**//**//**//**//**//// 〈summary〉 /// Execute a SqlCommand (that returns no resultset) using an existing SQL Transaction /// using the provided parameters. /// 〈/summary〉 /// 〈remarks〉 /// e.g.: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, “PublishOrders“, new SqlParameter(“@prodid“, 24)); /// 〈/remarks〉 /// 〈param name=“trans“〉an existing sql transaction〈/param〉 /// 〈param name=“commandType“〉the CommandType (stored procedure, text, etc.)〈/param〉 /// 〈param name=“commandText“〉the stored procedure name or T-SQL command〈/param〉 /// 〈param name=“commandParameters“〉an array of SqlParamters used to execute the command〈/param〉 /// 〈returns〉an int representing the number of rows affected by the command〈/returns〉 publicstaticint ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) .........{ SqlCommand cmd =new SqlCommand(); PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } /**//**//**//**//**//**//**//// 〈summary〉 /// Execute a SqlCommand that returns a resultset against the database specified in the connection string /// using the provided parameters. /// 〈/summary〉 /// 〈remarks〉 /// e.g.: /// SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, “PublishOrders“, new SqlParameter(“@prodid“, 24)); /// 〈/remarks〉 /// 〈param name=“connectionString“〉a valid connection string for a SqlConnection〈/param〉 /// 〈param name=“commandType“〉the CommandType (stored procedure, text, etc.)〈/param〉 /// 〈param name=“commandText“〉the stored procedure name or T-SQL command〈/param〉 /// 〈param name=“commandParameters“〉an array of SqlParamters used to execute the command〈/param〉 /// 〈returns〉A SqlDataReader containing the results〈/returns〉 publicstatic SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) .........{ SqlCommand cmd =new SqlCommand(); SqlConnection conn =new SqlConnection(connectionString); // we use a try/catch here because if the method throws an exception we want to // close the connection throw code, because no datareader will exist, hence the // commandBehaviour.CloseConnection will not work try .........{ PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return rdr; } catch .........{ conn.Close(); throw; } } /**//**//**//**//**//**//**//// 〈summary〉 /// Execute a SqlCommand that returns the first column of the first record against the database specified in the connection string /// using the provided parameters. /// 〈/summary〉 /// 〈remarks〉 /// e.g.: /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, “PublishOrders“, new SqlParameter(“@prodid“, 24)); /// 〈/remarks〉 /// 〈param name=“connectionString“〉a valid connection string for a SqlConnection〈/param〉 /// 〈param name=“commandType“〉the CommandType (stored procedure, text, etc.)〈/param〉 /// 〈param name=“commandText“〉the stored procedure name or T-SQL command〈/param〉 /// 〈param name=“commandParameters“〉an array of SqlParamters used to execute the command〈/param〉 /// 〈returns〉An object that should be converted to the expected type using Convert.To{Type}〈/returns〉 publicstaticobject ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) .........{ SqlCommand cmd =new SqlCommand(); using (SqlConnection connection =new SqlConnection(connectionString)) .........{ PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); object val = cmd.ExecuteScalar(); cmd.Parameters.Clear(); return val; } } /**//**//**//**//**//**//**//// 〈summary〉 /// Execute a SqlCommand that returns the first column of the first record against an existing database connection /// using the provided parameters. /// 〈/summary〉 /// 〈remarks〉 /// e.g.: /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, “PublishOrders“, new SqlParameter(“@prodid“, 24)); /// 〈/remarks〉 /// 〈param name=“conn“〉an existing database connection〈/param〉 /// 〈param name=“commandType“〉the CommandType (stored procedure, text, etc.)〈/param〉 /// 〈param name=“commandText“〉the stored procedure name or T-SQL command〈/param〉 /// 〈param name=“commandParameters“〉an array of SqlParamters used to execute the command〈/param〉 /// 〈returns〉An object that should be converted to the expected type using Convert.To{Type}〈/returns〉 publicstaticobject ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) .........{ SqlCommand cmd =new SqlCommand(); PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); object val = cmd.ExecuteScalar(); cmd.Parameters.Clear(); return val; } /**//**//**//**//**//**//**//// 〈summary〉 /// add parameter array to the cache /// 〈/summary〉 /// 〈param name=“cacheKey“〉Key to the parameter cache〈/param〉 /// 〈param name=“cmdParms“〉an array of SqlParamters to be cached〈/param〉 publicstaticvoid CacheParameters(string cacheKey, params SqlParameter[] commandParameters) .........{ parmCache[cacheKey] = commandParameters; } /**//**//**//**//**//**//**//// 〈summary〉 /// Retrieve cached parameters /// 〈/summary〉 /// 〈param name=“cacheKey“〉key used to lookup parameters〈/param〉 /// 〈returns〉Cached SqlParamters array〈/returns〉 publicstatic SqlParameter[] GetCachedParameters(string cacheKey) .........{ SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey]; if (cachedParms ==null) returnnull; SqlParameter[] clonedParms =new SqlParameter[cachedParms.Length]; for (int i =0, j = cachedParms.Length; i 〈 j; i++) clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone(); return clonedParms; } /**//**//**//**//**//**//**//// 〈summary〉 /// Prepare a command for execution /// 〈/summary〉 /// 〈param name=“cmd“〉SqlCommand object〈/param〉 /// 〈param name=“conn“〉SqlConnection object〈/param〉 /// 〈param name=“trans“〉SqlTransaction object〈/param〉 /// 〈param name=“cmdType“〉Cmd type e.g. stored procedure or text〈/param〉 /// 〈param name=“cmdText“〉Command text, e.g. Select * from Products〈/param〉 /// 〈param name=“cmdParms“〉SqlParameters to use in the command〈/param〉 privatestaticvoid PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) .........{ if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans !=null) cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms !=null) .........{ foreach (SqlParameter parm in cmdParms) cmd.Parameters.Add(parm); } } } }