DbHelperSQL2.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Specialized;
  4. using System.Data;
  5. using System.Data.SqlClient;
  6. using System.Data.Common;
  7. using Microsoft.Practices.EnterpriseLibrary.Data;
  8. namespace Maticsoft.DBUtility
  9. {
  10. /// <summary>
  11. /// Enterprise Library 2.0 数据访问进一步封装类
  12. /// Copyright (C) Maticsoft
  13. /// All rights reserved
  14. /// </summary>
  15. public abstract class DbHelperSQL2
  16. {
  17. public DbHelperSQL2()
  18. {
  19. }
  20. #region 公用方法
  21. public static int GetMaxID(string FieldName,string TableName)
  22. {
  23. string strSql = "select max(" + FieldName + ")+1 from " + TableName;
  24. Database db = DatabaseFactory.CreateDatabase();
  25. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  26. object obj = db.ExecuteScalar(dbCommand);
  27. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  28. {
  29. return 1;
  30. }
  31. else
  32. {
  33. return int.Parse(obj.ToString());
  34. }
  35. }
  36. public static bool Exists(string strSql)
  37. {
  38. Database db = DatabaseFactory.CreateDatabase();
  39. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  40. object obj = db.ExecuteScalar(dbCommand);
  41. int cmdresult;
  42. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  43. {
  44. cmdresult = 0;
  45. }
  46. else
  47. {
  48. cmdresult = int.Parse(obj.ToString());
  49. }
  50. if (cmdresult == 0)
  51. {
  52. return false;
  53. }
  54. else
  55. {
  56. return true;
  57. }
  58. }
  59. public static bool Exists(string strSql, params SqlParameter[] cmdParms)
  60. {
  61. Database db = DatabaseFactory.CreateDatabase();
  62. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  63. BuildDBParameter(db, dbCommand, cmdParms);
  64. object obj = db.ExecuteScalar(dbCommand);
  65. int cmdresult;
  66. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  67. {
  68. cmdresult = 0;
  69. }
  70. else
  71. {
  72. cmdresult = int.Parse(obj.ToString());
  73. }
  74. if (cmdresult == 0)
  75. {
  76. return false;
  77. }
  78. else
  79. {
  80. return true;
  81. }
  82. }
  83. /// <summary>
  84. /// 加载参数
  85. /// </summary>
  86. public static void BuildDBParameter(Database db, DbCommand dbCommand, params SqlParameter[] cmdParms)
  87. {
  88. foreach (SqlParameter sp in cmdParms)
  89. {
  90. db.AddInParameter(dbCommand, sp.ParameterName, sp.DbType,sp.Value);
  91. }
  92. }
  93. #endregion
  94. #region 执行简单SQL语句
  95. /// <summary>
  96. /// 执行SQL语句,返回影响的记录数
  97. /// </summary>
  98. /// <param name="strSql">SQL语句</param>
  99. /// <returns>影响的记录数</returns>
  100. public static int ExecuteSql(string strSql)
  101. {
  102. Database db = DatabaseFactory.CreateDatabase();
  103. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  104. return db.ExecuteNonQuery(dbCommand);
  105. }
  106. public static int ExecuteSqlByTime(string strSql,int Times)
  107. {
  108. Database db = DatabaseFactory.CreateDatabase();
  109. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  110. dbCommand.CommandTimeout = Times;
  111. return db.ExecuteNonQuery(dbCommand);
  112. }
  113. /// <summary>
  114. /// 执行多条SQL语句,实现数据库事务。
  115. /// </summary>
  116. /// <param name="SQLStringList">多条SQL语句</param>
  117. public static void ExecuteSqlTran(ArrayList SQLStringList)
  118. {
  119. Database db = DatabaseFactory.CreateDatabase();
  120. using (DbConnection dbconn = db.CreateConnection())
  121. {
  122. dbconn.Open();
  123. DbTransaction dbtran = dbconn.BeginTransaction();
  124. try
  125. {
  126. //执行语句
  127. for (int n = 0; n < SQLStringList.Count; n++)
  128. {
  129. string strsql = SQLStringList[n].ToString();
  130. if (strsql.Trim().Length > 1)
  131. {
  132. DbCommand dbCommand = db.GetSqlStringCommand(strsql);
  133. db.ExecuteNonQuery(dbCommand);
  134. }
  135. }
  136. //执行存储过程
  137. //db.ExecuteNonQuery(CommandType.StoredProcedure, "InserOrders");
  138. //db.ExecuteDataSet(CommandType.StoredProcedure, "UpdateProducts");
  139. dbtran.Commit();
  140. }
  141. catch
  142. {
  143. dbtran.Rollback();
  144. }
  145. finally
  146. {
  147. dbconn.Close();
  148. }
  149. }
  150. }
  151. #region 执行一个 特殊字段带参数的语句
  152. /// <summary>
  153. /// 执行带一个存储过程参数的的SQL语句。
  154. /// </summary>
  155. /// <param name="strSql">SQL语句</param>
  156. /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
  157. /// <returns>影响的记录数</returns>
  158. public static int ExecuteSql(string strSql,string content)
  159. {
  160. Database db = DatabaseFactory.CreateDatabase();
  161. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  162. db.AddInParameter(dbCommand, "@content", DbType.String, content);
  163. return db.ExecuteNonQuery(dbCommand);
  164. }
  165. /// <summary>
  166. /// 执行带一个存储过程参数的的SQL语句。
  167. /// </summary>
  168. /// <param name="strSql">SQL语句</param>
  169. /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
  170. /// <returns>返回语句里的查询结果</returns>
  171. public static object ExecuteSqlGet(string strSql,string content)
  172. {
  173. Database db = DatabaseFactory.CreateDatabase();
  174. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  175. db.AddInParameter(dbCommand, "@content", DbType.String, content);
  176. object obj = db.ExecuteNonQuery(dbCommand);
  177. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  178. {
  179. return null;
  180. }
  181. else
  182. {
  183. return obj;
  184. }
  185. }
  186. /// <summary>
  187. /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
  188. /// </summary>
  189. /// <param name="strSql">SQL语句</param>
  190. /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
  191. /// <returns>影响的记录数</returns>
  192. public static int ExecuteSqlInsertImg(string strSql,byte[] fs)
  193. {
  194. Database db = DatabaseFactory.CreateDatabase();
  195. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  196. db.AddInParameter(dbCommand, "@fs", DbType.Byte, fs);
  197. return db.ExecuteNonQuery(dbCommand);
  198. }
  199. #endregion
  200. /// <summary>
  201. /// 执行一条计算查询结果语句,返回查询结果(object)。
  202. /// </summary>
  203. /// <param name="strSql">计算查询结果语句</param>
  204. /// <returns>查询结果(object)</returns>
  205. public static object GetSingle(string strSql)
  206. {
  207. Database db = DatabaseFactory.CreateDatabase();
  208. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  209. object obj = db.ExecuteScalar(dbCommand);
  210. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  211. {
  212. return null;
  213. }
  214. else
  215. {
  216. return obj;
  217. }
  218. }
  219. /// <summary>
  220. /// 执行查询语句,返回SqlDataReader ( 注意:使用后一定要对SqlDataReader进行Close )
  221. /// </summary>
  222. /// <param name="strSql">查询语句</param>
  223. /// <returns>SqlDataReader</returns>
  224. public static SqlDataReader ExecuteReader(string strSql)
  225. {
  226. Database db = DatabaseFactory.CreateDatabase();
  227. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  228. SqlDataReader dr = (SqlDataReader)db.ExecuteReader(dbCommand);
  229. return dr;
  230. }
  231. /// <summary>
  232. /// 执行查询语句,返回DataSet
  233. /// </summary>
  234. /// <param name="strSql">查询语句</param>
  235. /// <returns>DataSet</returns>
  236. public static DataSet Query(string strSql)
  237. {
  238. Database db = DatabaseFactory.CreateDatabase();
  239. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  240. return db.ExecuteDataSet(dbCommand);
  241. }
  242. public static DataSet Query(string strSql,int Times)
  243. {
  244. Database db = DatabaseFactory.CreateDatabase();
  245. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  246. dbCommand.CommandTimeout = Times;
  247. return db.ExecuteDataSet(dbCommand);
  248. }
  249. #endregion
  250. #region 执行带参数的SQL语句
  251. /// <summary>
  252. /// 执行SQL语句,返回影响的记录数
  253. /// </summary>
  254. /// <param name="strSql">SQL语句</param>
  255. /// <returns>影响的记录数</returns>
  256. public static int ExecuteSql(string strSql,params SqlParameter[] cmdParms)
  257. {
  258. Database db = DatabaseFactory.CreateDatabase();
  259. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  260. BuildDBParameter(db, dbCommand, cmdParms);
  261. return db.ExecuteNonQuery(dbCommand);
  262. }
  263. /// <summary>
  264. /// 执行多条SQL语句,实现数据库事务。
  265. /// </summary>
  266. /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
  267. public static void ExecuteSqlTran(Hashtable SQLStringList)
  268. {
  269. Database db = DatabaseFactory.CreateDatabase();
  270. using (DbConnection dbconn = db.CreateConnection())
  271. {
  272. dbconn.Open();
  273. DbTransaction dbtran = dbconn.BeginTransaction();
  274. try
  275. {
  276. //执行语句
  277. foreach (DictionaryEntry myDE in SQLStringList)
  278. {
  279. string strsql = myDE.Key.ToString();
  280. SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
  281. if (strsql.Trim().Length > 1)
  282. {
  283. DbCommand dbCommand = db.GetSqlStringCommand(strsql);
  284. BuildDBParameter(db, dbCommand, cmdParms);
  285. db.ExecuteNonQuery(dbCommand);
  286. }
  287. }
  288. dbtran.Commit();
  289. }
  290. catch
  291. {
  292. dbtran.Rollback();
  293. }
  294. finally
  295. {
  296. dbconn.Close();
  297. }
  298. }
  299. }
  300. /// <summary>
  301. /// 执行一条计算查询结果语句,返回查询结果(object)。
  302. /// </summary>
  303. /// <param name="strSql">计算查询结果语句</param>
  304. /// <returns>查询结果(object)</returns>
  305. public static object GetSingle(string strSql,params SqlParameter[] cmdParms)
  306. {
  307. Database db = DatabaseFactory.CreateDatabase();
  308. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  309. BuildDBParameter(db, dbCommand, cmdParms);
  310. object obj = db.ExecuteScalar(dbCommand);
  311. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  312. {
  313. return null;
  314. }
  315. else
  316. {
  317. return obj;
  318. }
  319. }
  320. /// <summary>
  321. /// 执行查询语句,返回SqlDataReader ( 注意:使用后一定要对SqlDataReader进行Close )
  322. /// </summary>
  323. /// <param name="strSql">查询语句</param>
  324. /// <returns>SqlDataReader</returns>
  325. public static SqlDataReader ExecuteReader(string strSql,params SqlParameter[] cmdParms)
  326. {
  327. Database db = DatabaseFactory.CreateDatabase();
  328. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  329. BuildDBParameter(db, dbCommand, cmdParms);
  330. SqlDataReader dr = (SqlDataReader)db.ExecuteReader(dbCommand);
  331. return dr;
  332. }
  333. /// <summary>
  334. /// 执行查询语句,返回DataSet
  335. /// </summary>
  336. /// <param name="strSql">查询语句</param>
  337. /// <returns>DataSet</returns>
  338. public static DataSet Query(string strSql,params SqlParameter[] cmdParms)
  339. {
  340. Database db = DatabaseFactory.CreateDatabase();
  341. DbCommand dbCommand = db.GetSqlStringCommand(strSql);
  342. BuildDBParameter(db, dbCommand, cmdParms);
  343. return db.ExecuteDataSet(dbCommand);
  344. }
  345. private static void PrepareCommand(SqlCommand cmd,SqlConnection conn,SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
  346. {
  347. if (conn.State != ConnectionState.Open)
  348. conn.Open();
  349. cmd.Connection = conn;
  350. cmd.CommandText = cmdText;
  351. if (trans != null)
  352. cmd.Transaction = trans;
  353. cmd.CommandType = CommandType.Text;//cmdType;
  354. if (cmdParms != null)
  355. {
  356. foreach (SqlParameter parameter in cmdParms)
  357. {
  358. if ( ( parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input ) &&
  359. (parameter.Value == null))
  360. {
  361. parameter.Value = DBNull.Value;
  362. }
  363. cmd.Parameters.Add(parameter);
  364. }
  365. }
  366. }
  367. #endregion
  368. #region 存储过程操作
  369. /// <summary>
  370. /// 执行存储过程,返回影响的行数
  371. /// </summary>
  372. public static int RunProcedure(string storedProcName)
  373. {
  374. Database db = DatabaseFactory.CreateDatabase();
  375. DbCommand dbCommand = db.GetStoredProcCommand(storedProcName);
  376. return db.ExecuteNonQuery(dbCommand);
  377. }
  378. /// <summary>
  379. /// 执行存储过程,返回输出参数的值和影响的行数
  380. /// </summary>
  381. /// <param name="storedProcName">存储过程名</param>
  382. /// <param name="parameters">存储过程参数</param>
  383. /// <param name="OutParameter">输出参数名称</param>
  384. /// <param name="rowsAffected">影响的行数</param>
  385. /// <returns></returns>
  386. public static object RunProcedure(string storedProcName, IDataParameter[] InParameters, SqlParameter OutParameter, int rowsAffected)
  387. {
  388. Database db = DatabaseFactory.CreateDatabase();
  389. DbCommand dbCommand = db.GetStoredProcCommand(storedProcName);
  390. BuildDBParameter(db, dbCommand, (SqlParameter[])InParameters);
  391. db.AddOutParameter(dbCommand, OutParameter.ParameterName, OutParameter.DbType, OutParameter.Size);
  392. rowsAffected = db.ExecuteNonQuery(dbCommand);
  393. return db.GetParameterValue(dbCommand,"@" + OutParameter.ParameterName); //得到输出参数的值
  394. }
  395. /// <summary>
  396. /// 执行存储过程,返回SqlDataReader ( 注意:使用后一定要对SqlDataReader进行Close )
  397. /// </summary>
  398. /// <param name="storedProcName">存储过程名</param>
  399. /// <param name="parameters">存储过程参数</param>
  400. /// <returns>SqlDataReader</returns>
  401. public static SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters )
  402. {
  403. Database db = DatabaseFactory.CreateDatabase();
  404. DbCommand dbCommand = db.GetStoredProcCommand(storedProcName, parameters);
  405. //BuildDBParameter(db, dbCommand, parameters);
  406. return (SqlDataReader)db.ExecuteReader(dbCommand);
  407. }
  408. /// <summary>
  409. /// 执行存储过程,返回DataSet
  410. /// </summary>
  411. /// <param name="storedProcName">存储过程名</param>
  412. /// <param name="parameters">存储过程参数</param>
  413. /// <param name="tableName">DataSet结果中的表名</param>
  414. /// <returns>DataSet</returns>
  415. public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName )
  416. {
  417. Database db = DatabaseFactory.CreateDatabase();
  418. DbCommand dbCommand = db.GetStoredProcCommand(storedProcName, parameters);
  419. //BuildDBParameter(db, dbCommand, parameters);
  420. return db.ExecuteDataSet(dbCommand);
  421. }
  422. /// <summary>
  423. /// 执行存储过程,返回DataSet(设定等待时间)
  424. /// </summary>
  425. public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName ,int Times)
  426. {
  427. Database db = DatabaseFactory.CreateDatabase();
  428. DbCommand dbCommand = db.GetStoredProcCommand(storedProcName, parameters);
  429. dbCommand.CommandTimeout = Times;
  430. //BuildDBParameter(db, dbCommand, parameters);
  431. return db.ExecuteDataSet(dbCommand);
  432. }
  433. /// <summary>
  434. /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
  435. /// </summary>
  436. /// <param name="connection">数据库连接</param>
  437. /// <param name="storedProcName">存储过程名</param>
  438. /// <param name="parameters">存储过程参数</param>
  439. /// <returns>SqlCommand</returns>
  440. private static SqlCommand BuildQueryCommand(SqlConnection connection,string storedProcName, IDataParameter[] parameters)
  441. {
  442. SqlCommand command = new SqlCommand( storedProcName, connection );
  443. command.CommandType = CommandType.StoredProcedure;
  444. foreach (SqlParameter parameter in parameters)
  445. {
  446. if( parameter != null )
  447. {
  448. // 检查未分配值的输出参数,将其分配以DBNull.Value.
  449. if ( ( parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input ) &&
  450. (parameter.Value == null))
  451. {
  452. parameter.Value = DBNull.Value;
  453. }
  454. command.Parameters.Add(parameter);
  455. }
  456. }
  457. return command;
  458. }
  459. /// <summary>
  460. /// 创建 SqlCommand 对象实例(用来返回一个整数值)
  461. /// </summary>
  462. /// <param name="storedProcName">存储过程名</param>
  463. /// <param name="parameters">存储过程参数</param>
  464. /// <returns>SqlCommand 对象实例</returns>
  465. private static SqlCommand BuildIntCommand(SqlConnection connection,string storedProcName, IDataParameter[] parameters)
  466. {
  467. SqlCommand command = BuildQueryCommand(connection,storedProcName, parameters );
  468. command.Parameters.Add( new SqlParameter ( "ReturnValue",
  469. SqlDbType.Int,4,ParameterDirection.ReturnValue,
  470. false,0,0,string.Empty,DataRowVersion.Default,null ));
  471. return command;
  472. }
  473. #endregion
  474. }
  475. }