SqlHelper.cs 13 KB

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