XueSqlHelper.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. using System.Data;
  2. using System.Data.SqlClient;
  3. namespace SiteCore
  4. {
  5. /// <summary>
  6. /// 数据库的通用访问代码
  7. /// 此类为抽象类,不允许实例化,在应用时直接调用即可
  8. /// </summary>
  9. public abstract class XueSqlHelper
  10. {
  11. public static readonly string xueConnString = "Data Source=.;Initial Catalog=mengjing;User ID=test;Password=test123;Max Pool Size=512;Min Pool Size=5;";
  12. // 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。
  13. //private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
  14. /// <summary>
  15. ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
  16. /// 使用参数数组形式提供参数列表
  17. /// </summary>
  18. /// <remarks>
  19. /// 使用示例:
  20. /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
  21. /// </remarks>
  22. /// <param name="connectionString">一个有效的数据库连接字符串</param>
  23. /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
  24. /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
  25. /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
  26. /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
  27. public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
  28. {
  29. SqlCommand cmd = new SqlCommand();
  30. using (SqlConnection conn = new SqlConnection(connectionString))
  31. {
  32. //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中
  33. PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
  34. int val = cmd.ExecuteNonQuery();
  35. //清空SqlCommand中的参数列表
  36. cmd.Parameters.Clear();
  37. return val;
  38. }
  39. }
  40. /// <summary>
  41. ///执行一条不返回结果的SqlCommand,通过一个已经存在的数据库连接
  42. /// 使用参数数组提供参数
  43. /// </summary>
  44. /// <remarks>
  45. /// 使用示例:
  46. /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
  47. /// </remarks>
  48. /// <param name="conn">一个现有的数据库连接</param>
  49. /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
  50. /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
  51. /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
  52. /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
  53. public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
  54. {
  55. SqlCommand cmd = new SqlCommand();
  56. PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
  57. int val = cmd.ExecuteNonQuery();
  58. cmd.Parameters.Clear();
  59. return val;
  60. }
  61. /// <summary>
  62. /// 执行一条不返回结果的SqlCommand,通过一个已经存在的数据库事物处理
  63. /// 使用参数数组提供参数
  64. /// </summary>
  65. /// <remarks>
  66. /// 使用示例:
  67. /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
  68. /// </remarks>
  69. /// <param name="trans">一个存在的 sql 事物处理</param>
  70. /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
  71. /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
  72. /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
  73. /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
  74. public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
  75. {
  76. SqlCommand cmd = new SqlCommand();
  77. PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
  78. int val = cmd.ExecuteNonQuery();
  79. cmd.Parameters.Clear();
  80. return val;
  81. }
  82. /// <summary>
  83. /// 执行一条返回结果集的SqlCommand命令,通过专用的连接字符串。
  84. /// 使用参数数组提供参数
  85. /// </summary>
  86. /// <remarks>
  87. /// 使用示例:
  88. /// SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
  89. /// </remarks>
  90. /// <param name="connectionString">一个有效的数据库连接字符串</param>
  91. /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
  92. /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
  93. /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
  94. /// <returns>返回一个包含结果的SqlDataReader</returns>
  95. public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
  96. {
  97. SqlCommand cmd = new SqlCommand();
  98. SqlConnection conn = new SqlConnection(connectionString);
  99. // 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在,
  100. //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。
  101. //关闭数据库连接,并通过throw再次引发捕捉到的异常。
  102. try
  103. {
  104. PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
  105. SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  106. cmd.Parameters.Clear();
  107. return rdr;
  108. }
  109. catch
  110. {
  111. conn.Close();
  112. throw;
  113. }
  114. }
  115. /// <summary>
  116. /// 执行一条返回第一条记录第一列的SqlCommand命令,通过专用的连接字符串。
  117. /// 使用参数数组提供参数
  118. /// </summary>
  119. /// <remarks>
  120. /// 使用示例:
  121. /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
  122. /// </remarks>
  123. /// <param name="connectionString">一个有效的数据库连接字符串</param>
  124. /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
  125. /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
  126. /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
  127. /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
  128. public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
  129. {
  130. SqlCommand cmd = new SqlCommand();
  131. using (SqlConnection connection = new SqlConnection(connectionString))
  132. {
  133. PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
  134. object val = cmd.ExecuteScalar();
  135. cmd.Parameters.Clear();
  136. return val;
  137. }
  138. }
  139. /// <summary>
  140. /// 执行一条返回第一条记录第一列的SqlCommand命令,通过已经存在的数据库连接。
  141. /// 使用参数数组提供参数
  142. /// </summary>
  143. /// <remarks>
  144. /// 使用示例:
  145. /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
  146. /// </remarks>
  147. /// <param name="conn">一个已经存在的数据库连接</param>
  148. /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
  149. /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
  150. /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
  151. /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
  152. public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
  153. {
  154. SqlCommand cmd = new SqlCommand();
  155. PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
  156. object val = cmd.ExecuteScalar();
  157. cmd.Parameters.Clear();
  158. return val;
  159. }
  160. public static DataSet ExecuteDataSet(string commandText)
  161. {
  162. SqlCommand command = new SqlCommand();
  163. using (SqlConnection connection = new SqlConnection(xueConnString))
  164. {
  165. PrepareCommand(command, connection, null, CommandType.Text, commandText, null);
  166. SqlDataAdapter adapter = new SqlDataAdapter(command);
  167. DataSet ds = new DataSet();
  168. adapter.Fill(ds);
  169. return ds;
  170. }
  171. }
  172. public static int ExecuteNonQuery(string commandText)
  173. {
  174. SqlCommand cmd = new SqlCommand();
  175. using (SqlConnection connection = new SqlConnection(xueConnString))
  176. {
  177. PrepareCommand(cmd, connection, null, CommandType.Text, commandText, null);
  178. int val = cmd.ExecuteNonQuery();
  179. return val;
  180. }
  181. }
  182. /// <summary>
  183. /// 为执行命令准备参数
  184. /// </summary>
  185. /// <param name="cmd">SqlCommand 命令</param>
  186. /// <param name="conn">已经存在的数据库连接</param>
  187. /// <param name="trans">数据库事物处理</param>
  188. /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
  189. /// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param>
  190. /// <param name="cmdParms">返回带参数的命令</param>
  191. private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
  192. {
  193. //判断数据库连接状态
  194. if (conn.State != ConnectionState.Open)
  195. conn.Open();
  196. cmd.Connection = conn;
  197. cmd.CommandText = cmdText;
  198. //判断是否需要事物处理
  199. if (trans != null)
  200. cmd.Transaction = trans;
  201. cmd.CommandType = cmdType;
  202. if (cmdParms != null)
  203. {
  204. foreach (SqlParameter parm in cmdParms)
  205. cmd.Parameters.Add(parm);
  206. }
  207. }
  208. }
  209. }