MSSqlDataAccess.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Data.SqlClient;
  5. using System.Data;
  6. using System.Data.Common;
  7. using System.Xml;
  8. using System.Configuration;
  9. using Ant.Common;
  10. namespace Ant.Data
  11. {
  12. public sealed class MSSqlDataAccess : BaseDataAccess
  13. {
  14. private SqlConnection DbConnection;
  15. private SqlTransaction trans;
  16. private DataAccess da;
  17. /// <summary>
  18. /// 构造函数
  19. /// </summary>
  20. /// <param name="connString">数据库连接字符串</param>
  21. public MSSqlDataAccess(string connString)
  22. {
  23. this.DbConnection = new SqlConnection(connString);
  24. }
  25. #region 数据库连接
  26. /// <summary>
  27. /// 数据库连接
  28. /// </summary>
  29. public override string ConnectionString
  30. {
  31. get
  32. {
  33. if (this.DbConnection.IsNull())
  34. return "";
  35. else
  36. return this.DbConnection.ConnectionString;
  37. }
  38. set
  39. {
  40. this.DbConnection.ConnectionString = value;
  41. }
  42. }
  43. public override DatabaseType DatabaseType
  44. {
  45. get { return DatabaseType.MSSQLServer; }
  46. }
  47. /// <summary>
  48. /// 获取事务
  49. /// </summary>
  50. public override DbTransaction Trans
  51. {
  52. get
  53. {
  54. if (this.trans != null)
  55. return trans;
  56. else
  57. return null;
  58. }
  59. }
  60. /// <summary>
  61. /// 数据库连接是否不可用
  62. /// </summary>
  63. public override bool IsUnEnable
  64. {
  65. get
  66. {
  67. if (this.DbConnection == null)
  68. {
  69. return true;
  70. }
  71. else
  72. {
  73. if (this.DbConnection.ConnectionString.IsEmpty())
  74. {
  75. return true;
  76. }
  77. else
  78. {
  79. return false;
  80. }
  81. }
  82. }
  83. }
  84. /// <summary>
  85. /// 数据库是否关闭
  86. /// </summary>
  87. public override bool IsClosed
  88. {
  89. get
  90. {
  91. if (this.DbConnection.IsNull())
  92. {
  93. return true;
  94. }
  95. if (this.DbConnection.State == ConnectionState.Closed)
  96. {
  97. return true;
  98. }
  99. else
  100. {
  101. return false;
  102. }
  103. }
  104. }
  105. /// <summary>
  106. /// 打开数据库
  107. /// </summary>
  108. public override void Open()
  109. {
  110. if (string.IsNullOrEmpty(DbConnection.ConnectionString))
  111. {
  112. da = DataAccessFactory.GetWriteDataDefault;
  113. this.DbConnection = new SqlConnection(da.ConnectionString);
  114. }
  115. if (this.DbConnection.State != ConnectionState.Open)
  116. {
  117. this.DbConnection.Open();
  118. }
  119. }
  120. /// <summary>
  121. /// 关闭数据库
  122. /// </summary>
  123. public override void Close()
  124. {
  125. if (this.DbConnection != null && this.DbConnection.State != ConnectionState.Closed && trans == null)
  126. {
  127. this.DbConnection.Close();
  128. //this.DbConnection.Dispose();
  129. //this.DbConnection = null;
  130. }
  131. }
  132. /// <summary>
  133. /// 释放资源
  134. /// </summary>
  135. public override void Dispose()
  136. {
  137. if (this.DbConnection != null)
  138. {
  139. this.DbConnection.Dispose();
  140. this.DbConnection = null;
  141. }
  142. if (this.trans != null)
  143. {
  144. this.trans.Dispose();
  145. this.trans = null;
  146. }
  147. }
  148. /// <summary>
  149. /// 开户数据库事务
  150. /// </summary>
  151. public override void BeginTransaction()
  152. {
  153. this.Open();
  154. if (trans == null) trans = this.DbConnection.BeginTransaction(IsolationLevel.ReadCommitted);
  155. }
  156. /// <summary>
  157. /// 提交数据库事务
  158. /// </summary>
  159. public override void Commit()
  160. {
  161. try
  162. {
  163. if (null != this.trans)
  164. {
  165. this.trans.Commit();
  166. this.trans.Dispose();
  167. this.trans = null;
  168. }
  169. }
  170. finally
  171. {
  172. this.Close();
  173. }
  174. }
  175. /// <summary>
  176. /// 回滚数据库事务
  177. /// </summary>
  178. public override void RollBack()
  179. {
  180. try
  181. {
  182. if (trans != null)
  183. {
  184. this.trans.Rollback();
  185. this.trans.Dispose();
  186. this.trans = null;
  187. }
  188. }
  189. finally
  190. {
  191. this.Close();
  192. }
  193. }
  194. #endregion
  195. #region 执行SQL语句和存储过程
  196. #region int ExecuteNonQuery
  197. /// <summary>
  198. /// 执行SQL命令,并返回受影响的行数
  199. /// </summary>
  200. /// <param name="commandText">SQL命令</param>
  201. /// <param name="commandType">SQL命令类型</param>
  202. /// <param name="Parameters">命令参数集合</param>
  203. /// <returns>返回受影响的行数</returns>
  204. public override int ExecuteNonQuery(string commandText, System.Data.CommandType commandType, QueryParameterCollection Parameters)
  205. {
  206. try
  207. {
  208. SqlCommand cmd = new SqlCommand();
  209. cmd.CommandText = commandText;
  210. cmd.CommandType = commandType;
  211. cmd.Connection = this.DbConnection;
  212. cmd.CommandTimeout = 60;
  213. if (trans != null)
  214. {
  215. cmd.Transaction = trans;
  216. }
  217. Open();
  218. if (Parameters != null)
  219. {
  220. foreach (QueryParameter q in Parameters)
  221. {
  222. cmd.Parameters.Add(ToSqlParameter(q));
  223. }
  224. }
  225. int tmpValue = cmd.ExecuteNonQuery();
  226. //Parameters.Clear();
  227. //foreach (SqlParameter p in cmd.Parameters)
  228. //{
  229. // Parameters[p.ParameterName] = ToQueryParameter(p);
  230. //}
  231. return tmpValue;
  232. }
  233. finally
  234. {
  235. Close();
  236. }
  237. }
  238. #endregion
  239. /// <summary>
  240. /// 执行SQL命令,并返回受影响的行数
  241. /// </summary>
  242. /// <param name="commandText">SQL命令</param>
  243. /// <param name="commandType">SQL命令类型</param>
  244. /// <param name="Parameters">命令参数集合</param>
  245. /// <returns>返回受影响的行数</returns>
  246. public override int ExecuteNonQuery(string commandText, DbParam[] parameters, System.Data.CommandType commandType)
  247. {
  248. //try
  249. //{
  250. // SqlCommand cmd = this.DbConnection.CreateCommand();
  251. // if (trans != null)
  252. // {
  253. // cmd.Transaction = trans;
  254. // }
  255. // Open();
  256. // this.PrepareCommand(cmd, commandText, parameters, commandType);
  257. // cmd.CommandTimeout = 60;
  258. // int tmpValue = cmd.ExecuteNonQuery();
  259. // return tmpValue;
  260. //}
  261. //finally
  262. //{
  263. // Close();
  264. //}
  265. //return 1;
  266. try
  267. {
  268. SqlCommand cmd = this.DbConnection.CreateCommand();
  269. if (trans != null)
  270. {
  271. cmd.Transaction = trans;
  272. }
  273. Open();
  274. this.PrepareCommand(cmd, commandText, parameters, commandType);
  275. cmd.CommandTimeout = 60;
  276. int tmpValue = cmd.ExecuteNonQuery();
  277. return tmpValue;
  278. }
  279. finally
  280. {
  281. Close();
  282. }
  283. }
  284. /// <summary>
  285. /// 执行查询,并返回查询所返回的结果集中第一行的第一列
  286. /// </summary>
  287. /// <param name="commandText"></param>
  288. /// <param name="commandType"></param>
  289. /// <param name="parameters"></param>
  290. /// <returns></returns>
  291. public override object ExecuteScalar(string commandText, DbParam[] parameters, CommandType commandType)
  292. {
  293. try
  294. {
  295. SqlCommand cmd = this.DbConnection.CreateCommand();
  296. if (trans != null)
  297. {
  298. cmd.Transaction = trans;
  299. }
  300. Open();
  301. this.PrepareCommand(cmd, commandText, parameters, commandType);
  302. cmd.CommandTimeout = 60;
  303. return cmd.ExecuteScalar();
  304. }
  305. finally
  306. {
  307. Close();
  308. }
  309. }
  310. public override DbDataReader ExecuteReader(string cmdText, DbParam[] parameters, CommandType cmdType)
  311. {
  312. try
  313. {
  314. Open();
  315. SqlCommand cmd = this.DbConnection.CreateCommand();
  316. if (trans != null)
  317. {
  318. cmd.Transaction = trans;
  319. }
  320. this.PrepareCommand(cmd, cmdText, parameters, cmdType);
  321. cmd.CommandTimeout = 60;
  322. SqlDataReader reader = cmd.ExecuteReader();
  323. return reader;
  324. }
  325. finally { }
  326. }
  327. #region ExecuteDataReader
  328. /// <summary>
  329. ///
  330. /// </summary>
  331. /// <param name="commandText"></param>
  332. /// <param name="commandType"></param>
  333. /// <param name="Parameters"></param>
  334. /// <returns></returns>
  335. public override DbDataReader ExecuteDataReader(string commandText, CommandType commandType, QueryParameterCollection Parameters)
  336. {
  337. try
  338. {
  339. Open();
  340. SqlCommand cmd = this.DbConnection.CreateCommand();
  341. cmd.CommandText = commandText;
  342. cmd.CommandType = commandType;
  343. cmd.CommandTimeout = 60;
  344. if (trans != null)
  345. {
  346. cmd.Transaction = trans;
  347. }
  348. if (Parameters != null)
  349. {
  350. foreach (QueryParameter p in Parameters)
  351. {
  352. cmd.Parameters.Add(ToSqlParameter(p));
  353. }
  354. }
  355. SqlDataReader reader = cmd.ExecuteReader();
  356. //foreach (SqlParameter p in cmd.Parameters)
  357. //{
  358. // Parameters[p.ParameterName] = ToQueryParameter(p);
  359. //}
  360. return reader;
  361. }
  362. finally
  363. {
  364. //Close();
  365. }
  366. }
  367. #endregion
  368. #region ExecuteDataTable
  369. /// <summary>
  370. /// 返回DataTable
  371. /// </summary>
  372. /// <param name="commandText"></param>
  373. /// <param name="commandType"></param>
  374. /// <param name="Parameters"></param>
  375. /// <param name="tableName"></param>
  376. /// <param name="startRecord"></param>
  377. /// <param name="maxRecords"></param>
  378. /// <returns></returns>
  379. public override DataTable ExecuteDataTable(string commandText, CommandType commandType, QueryParameterCollection Parameters, string tableName, int startRecord, int maxRecords)
  380. {
  381. try
  382. {
  383. DataTable dt = new DataTable(tableName);
  384. SqlDataAdapter sda = new SqlDataAdapter();
  385. Open();
  386. SqlCommand cmd = this.DbConnection.CreateCommand();
  387. cmd.CommandText = commandText;
  388. cmd.CommandType = commandType;
  389. cmd.CommandTimeout = 60;
  390. if (trans != null)
  391. {
  392. cmd.Transaction = trans;
  393. }
  394. if (Parameters != null)
  395. {
  396. foreach (QueryParameter q in Parameters)
  397. {
  398. cmd.Parameters.Add(ToSqlParameter(q));
  399. }
  400. }
  401. sda.SelectCommand = cmd;
  402. //sda.Fill(startRecord, maxRecords, dt);
  403. sda.Fill(dt);
  404. //foreach (SqlParameter p in sda.SelectCommand.Parameters)
  405. //{
  406. // Parameters[p.ParameterName] = ToQueryParameter(p);
  407. //}
  408. return dt;
  409. }
  410. finally
  411. {
  412. Close();
  413. }
  414. }
  415. #endregion
  416. #region ExecuteDataSet
  417. /// <summary>
  418. /// 返回DataSet数据集
  419. /// </summary>
  420. /// <param name="commandText"></param>
  421. /// <param name="commandType"></param>
  422. /// <param name="Parameters"></param>
  423. /// <param name="tableName"></param>
  424. /// <param name="startRecord"></param>
  425. /// <param name="maxRecords"></param>
  426. /// <returns></returns>
  427. public override DataSet ExecuteDataSet(string commandText, CommandType commandType, QueryParameterCollection Parameters, string tableName, int startRecord, int maxRecords)
  428. {
  429. try
  430. {
  431. DataSet ds = new DataSet();
  432. SqlDataAdapter sda = new SqlDataAdapter();
  433. Open();
  434. SqlCommand cmd = this.DbConnection.CreateCommand();
  435. cmd.CommandText = commandText;
  436. cmd.CommandType = commandType;
  437. cmd.CommandTimeout = 60;
  438. if (trans != null)
  439. {
  440. cmd.Transaction = trans;
  441. }
  442. if (Parameters != null)
  443. {
  444. foreach (QueryParameter q in Parameters)
  445. {
  446. cmd.Parameters.Add(ToSqlParameter(q));
  447. }
  448. }
  449. sda.SelectCommand = cmd;
  450. if (maxRecords > 0)
  451. {
  452. sda.Fill(ds, startRecord, maxRecords, tableName);
  453. }
  454. else
  455. {
  456. if (!string.IsNullOrEmpty(tableName))
  457. sda.Fill(ds, tableName);
  458. else
  459. sda.Fill(ds);
  460. }
  461. //foreach (SqlParameter p in sda.SelectCommand.Parameters)
  462. //{
  463. // Parameters[p.ParameterName] = ToQueryParameter(p);
  464. //}
  465. return ds;
  466. }
  467. finally
  468. {
  469. Close();
  470. }
  471. }
  472. /// <summary>
  473. /// 获取视图
  474. /// </summary>
  475. /// <param name="commandText"></param>
  476. /// <param name="commandType"></param>
  477. /// <param name="Parameters"></param>
  478. /// <param name="tableName"></param>
  479. /// <param name="startRecord"></param>
  480. /// <param name="maxRecords"></param>
  481. /// <returns></returns>
  482. public override DataView ExecuteDataView(string commandText, CommandType commandType, QueryParameterCollection Parameters, string tableName, int startRecord, int maxRecords)
  483. {
  484. try
  485. {
  486. DataSet ds = new DataSet();
  487. SqlDataAdapter sda = new SqlDataAdapter();
  488. Open();
  489. SqlCommand cmd = this.DbConnection.CreateCommand();
  490. cmd.CommandText = commandText;
  491. cmd.CommandType = commandType;
  492. cmd.CommandTimeout = 60;
  493. if (trans != null)
  494. {
  495. cmd.Transaction = trans;
  496. }
  497. if (Parameters != null)
  498. {
  499. foreach (QueryParameter q in Parameters)
  500. {
  501. cmd.Parameters.Add(ToSqlParameter(q));
  502. }
  503. }
  504. sda.SelectCommand = cmd;
  505. if (maxRecords > 0)
  506. {
  507. sda.Fill(ds, startRecord, maxRecords, tableName);
  508. }
  509. else
  510. {
  511. if (!string.IsNullOrEmpty(tableName))
  512. sda.Fill(ds, tableName);
  513. else
  514. sda.Fill(ds);
  515. }
  516. //foreach (SqlParameter p in sda.SelectCommand.Parameters)
  517. //{
  518. // Parameters[p.ParameterName] = ToQueryParameter(p);
  519. //}
  520. return ds.Tables[0].DefaultView;
  521. }
  522. finally
  523. {
  524. Close();
  525. }
  526. }
  527. #endregion
  528. #region object ExecuteScalar
  529. /// <summary>
  530. /// 执行查询,并返回查询所返回的结果集中第一行的第一列
  531. /// </summary>
  532. /// <param name="commandText"></param>
  533. /// <param name="commandType"></param>
  534. /// <param name="parameters"></param>
  535. /// <returns></returns>
  536. public override object ExecuteScalar(string commandText, CommandType commandType, QueryParameterCollection parameters)
  537. {
  538. try
  539. {
  540. Open();
  541. SqlCommand cmd = this.DbConnection.CreateCommand();
  542. cmd.CommandText = commandText;
  543. cmd.CommandType = commandType;
  544. cmd.CommandTimeout = 60;
  545. if (trans != null)
  546. {
  547. cmd.Transaction = trans;
  548. }
  549. if (!object.Equals(parameters, null))
  550. {
  551. foreach (QueryParameter p in parameters)
  552. {
  553. cmd.Parameters.Add(ToSqlParameter(p));
  554. }
  555. }
  556. return cmd.ExecuteScalar();
  557. }
  558. catch (Exception ex)
  559. {
  560. throw (ex);
  561. }
  562. finally
  563. {
  564. Close();
  565. }
  566. }
  567. #endregion
  568. /// <summary>
  569. /// C#代码验证sql语句是否正确(只验证不执行sql)的方法
  570. /// </summary>
  571. /// <param name="sql"></param>
  572. /// <returns></returns>
  573. public override bool ValidateSQL(string sql)
  574. {
  575. bool bResult;
  576. SqlCommand cmd = this.DbConnection.CreateCommand();
  577. cmd.CommandText = "SET PARSEONLY ON";
  578. cmd.ExecuteNonQuery();
  579. try
  580. {
  581. cmd.CommandText = sql;
  582. cmd.ExecuteNonQuery();
  583. bResult = true;
  584. }
  585. catch (Exception ex)
  586. {
  587. bResult = false;
  588. }
  589. finally
  590. {
  591. cmd.CommandText = "SET PARSEONLY OFF";
  592. cmd.ExecuteNonQuery();
  593. }
  594. return bResult;
  595. }
  596. #endregion
  597. #region 参数类转换
  598. /// <summary>
  599. /// 获取参数
  600. /// </summary>
  601. /// <param name="cmd"></param>
  602. /// <param name="cmdText"></param>
  603. /// <param name="parameters"></param>
  604. /// <param name="cmdType"></param>
  605. void PrepareCommand(IDbCommand cmd, string cmdText, DbParam[] parameters, CommandType cmdType)
  606. {
  607. cmd.CommandText = cmdText;
  608. cmd.CommandType = cmdType;
  609. if (parameters != null)
  610. {
  611. for (int i = 0; i < parameters.Length; i++)
  612. {
  613. var param = parameters[i];
  614. if (param == null)
  615. continue;
  616. var parameter = cmd.CreateParameter();
  617. parameter.ParameterName = param.Name;
  618. Type parameterType;
  619. if (param.Value == null || param.Value == DBNull.Value)
  620. {
  621. parameter.Value = DBNull.Value;
  622. parameterType = param.Type;
  623. }
  624. else
  625. {
  626. parameter.Value = param.Value;
  627. parameterType = param.Value.GetType();
  628. }
  629. if (param.Precision != null)
  630. parameter.Precision = param.Precision.Value;
  631. if (param.Scale != null)
  632. parameter.Scale = param.Scale.Value;
  633. if (param.Size != null)
  634. parameter.Size = param.Size.Value;
  635. DbType? dbType = AntUtils.TryGetDbType(parameterType);
  636. if (dbType != null)
  637. parameter.DbType = dbType.Value;
  638. cmd.Parameters.Add(parameter);
  639. }
  640. }
  641. }
  642. /// <summary>
  643. /// 参数类转换
  644. /// </summary>
  645. /// <param name="parameter"></param>
  646. /// <returns></returns>
  647. private SqlParameter ToSqlParameter(QueryParameter parameter)
  648. {
  649. SqlParameter sqlParameter = new SqlParameter();
  650. sqlParameter.DbType = parameter.DbType;
  651. sqlParameter.Direction = parameter.Direction;
  652. sqlParameter.IsNullable = parameter.IsNullable;
  653. sqlParameter.ParameterName = parameter.ParameterName;
  654. sqlParameter.Precision = parameter.Precision;
  655. sqlParameter.Scale = parameter.Scale;
  656. sqlParameter.Size = parameter.Size;
  657. sqlParameter.SourceColumn = parameter.SourceColumn;
  658. sqlParameter.SourceVersion = parameter.SourceVersion;
  659. sqlParameter.Value = parameter.Value;
  660. return sqlParameter;
  661. }
  662. /// <summary>
  663. /// 将SqlParameter转化为QueryParameter
  664. /// </summary>
  665. /// <param name="parameter"></param>
  666. /// <returns></returns>
  667. private QueryParameter ToQueryParameter(SqlParameter parameter)
  668. {
  669. QueryParameter queryParameter = new QueryParameter();
  670. queryParameter.DbType = parameter.DbType;
  671. queryParameter.Direction = parameter.Direction;
  672. queryParameter.IsNullable = parameter.IsNullable;
  673. queryParameter.ParameterName = parameter.ParameterName;
  674. queryParameter.Precision = parameter.Precision;
  675. queryParameter.Scale = parameter.Scale;
  676. queryParameter.Size = parameter.Size;
  677. queryParameter.SourceColumn = parameter.SourceColumn;
  678. queryParameter.SourceVersion = parameter.SourceVersion;
  679. queryParameter.Value = parameter.Value;
  680. return queryParameter;
  681. }
  682. #endregion
  683. }
  684. }