当前位置:Gxlcms > 数据库问题 > C# 数据库访问公共类

C# 数据库访问公共类

时间:2021-07-01 10:21:17 帮助过:8人阅读

  1. <appSettings>
  2. <!--数据连接字符串-->
  3. <add key="DbProviderType" value="Oracle" />
  4. <add key="ConnectionString" value="Data Source=(DESCRIPTION=
  5. (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.88)(PORT=1521)))
  6. (CONNECT_DATA=(SERVICE_NAME=mestest)));
  7. User Id=hmcs;Password=hmcstest;"/>
  8. </appSettings>
  9. <system.data>
  10. <DbProviderFactories>
  11. <add name="Odbc Data Provider" invariant="System.Data.Odbc" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  12. <add name="OleDb Data Provider" invariant="System.Data.OleDb" description=".Net Framework Data Provider for OleDb" type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  13. <add name="OracleClient Data Provider" invariant="System.Data.OracleClient" description=".Net Framework Data Provider for Oracle" type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  14. <add name="SqlClient Data Provider" invariant="System.Data.SqlClient" description=".Net Framework Data Provider for SqlServer" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  15. <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.6.20, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  16. <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.58.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>
  17. <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Framework Data Provider for PostgreSQL Database" type="Npgsql.NpgsqlFactory, Npgsql, Version=1.98.4.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
  18. </DbProviderFactories>
  19. </system.data>

 

数据库公共类调用方法

  1. DataTable dt = DbUtility.DbUtility.GetInstance().ExecuteDataTable(sql);

 

数据库公共类

  1. using System;
  2. using System.Data.Common;
  3. using System.Data;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Configuration;
  7. namespace DbUtility
  8. {
  9. /// <summary>
  10. /// 单例模式实例化数据库操作辅助类
  11. /// </summary>
  12. public class DbUtility
  13. {
  14. #region 私有字段
  15. private static readonly string connectionString = ConfigurationManager.AppSettings["ConnectionString"];
  16. private static readonly string strDbProviderType = ConfigurationManager.AppSettings["DbProviderType"];
  17. private readonly DbProviderFactory providerFactory;
  18. #endregion
  19. #region 公共字段
  20. /// <summary>
  21. /// 获取 Web.config文件中配置的 MSSQL 连接的字符串
  22. /// </summary>
  23. public string ConnectionString
  24. {
  25. get;
  26. private set;
  27. }
  28. #endregion
  29. #region 创建通用数据库操作类的单一实例
  30. static volatile DbUtility instance = null;
  31. static readonly object padlock = new object();
  32. /// <summary>
  33. /// 单例模式实例化数据库操作通用类
  34. /// </summary>
  35. private DbUtility()
  36. {
  37. ConnectionString = connectionString;
  38. providerFactory = ProviderFactory.GetDbProviderFactory(DbProviderType.SqlServer);
  39. if (providerFactory == null)
  40. {
  41. throw new ArgumentException("Can‘t load DbProviderFactory for given value of providerType");
  42. }
  43. }
  44. /// <summary>
  45. /// 单例模式实例化数据库操作通用类
  46. /// </summary>
  47. /// <param name="connectionString">数据库连接字符串</param>
  48. /// <param name="providerType">数据库类型枚举</param>
  49. private DbUtility(string connectionString, DbProviderType providerType)
  50. {
  51. ConnectionString = connectionString;
  52. providerFactory = ProviderFactory.GetDbProviderFactory(providerType);
  53. if (providerFactory == null)
  54. {
  55. throw new ArgumentException("Can‘t load DbProviderFactory for given value of providerType");
  56. }
  57. }
  58. /// <summary>
  59. /// 创建MSSQL数据库操作通用类的单一实例
  60. /// </summary>
  61. /// <returns>获取<see cref="LiFeiLin.DBUtility.DbUtility"/>的实例</returns>
  62. public static DbUtility GetInstance()
  63. {
  64. // return GetInstance(connectionString, DbProviderType.SqlServer);
  65. return GetInstance(connectionString,(DbProviderType)Enum.Parse(typeof(DbProviderType), strDbProviderType));
  66. }
  67. /// <summary>
  68. /// 创建通用数据库操作类的单一实例
  69. /// </summary>
  70. /// <param name="connectionString">数据库连接字符串</param>
  71. /// <param name="providerType">数据库类型枚举</param>
  72. /// <returns>获取<see cref="LiFeiLin.DBUtility.DbUtility"/>的实例</returns>
  73. public static DbUtility GetInstance(string connectionString, DbProviderType providerType)
  74. {
  75. if (instance == null)
  76. {
  77. lock (padlock)
  78. {
  79. if (instance == null)
  80. {
  81. instance = new DbUtility(connectionString, providerType);
  82. }
  83. }
  84. }
  85. return instance;
  86. }
  87. #endregion
  88. #region 获取某个表的记录数量
  89. /// <summary>
  90. /// 获取某个表的记录数量
  91. /// </summary>
  92. /// <param name="tableName"></param>
  93. /// <returns></returns>
  94. public int GetDataRecordCount(string tableName)
  95. {
  96. return GetDataRecordCount(tableName);
  97. }
  98. /// <summary>
  99. /// 获取某个表的记录数量
  100. /// </summary>
  101. /// <param name="tableName">表名</param>
  102. /// <param name="where">条件</param>
  103. /// <returns></returns>
  104. public int GetDataRecordCount(string tableName, string where)
  105. {
  106. string strsql = "select count(1) from " + tableName;
  107. if (where != "")
  108. {
  109. strsql += " where " + where;
  110. }
  111. object obj = ExecuteScalar(strsql);
  112. if (obj == null)
  113. {
  114. return 1;
  115. }
  116. else
  117. {
  118. return int.Parse(obj.ToString());
  119. }
  120. }
  121. #endregion
  122. #region 获取指定表中指定列的最大值
  123. /// <summary>
  124. /// 获取指定表中指定列的最大值
  125. /// </summary>
  126. /// <param name="fieldName">字段名</param>
  127. /// <param name="tableName">表名</param>
  128. /// <returns></returns>
  129. public int GetMaxID(string fieldName, string tableName)
  130. {
  131. string strsql = "select max(" + fieldName + ")+1 from " + tableName;
  132. object obj = ExecuteScalar(strsql);
  133. if (obj == null)
  134. {
  135. return 1;
  136. }
  137. else
  138. {
  139. return int.Parse(obj.ToString());
  140. }
  141. }
  142. #endregion
  143. #region 执行一个查询 SQL 语句,并根据返回值判断执行结果是否存在
  144. /// <summary>
  145. /// 执行一个查询 SQL 语句,并根据返回值判断执行结果是否存在
  146. /// </summary>
  147. /// <param name="strSql"></param>
  148. /// <returns></returns>
  149. public bool Exists(string strSql)
  150. {
  151. object obj = ExecuteScalar(strSql);
  152. int cmdresult;
  153. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  154. {
  155. cmdresult = 0;
  156. }
  157. else
  158. {
  159. cmdresult = int.Parse(obj.ToString());
  160. }
  161. if (cmdresult == 0)
  162. {
  163. return false;
  164. }
  165. else
  166. {
  167. return true;
  168. }
  169. }
  170. /// <summary>
  171. /// 执行一个查询 SQL 语句,并根据返回值判断执行结果是否存在
  172. /// </summary>
  173. /// <param name="strSql">需要执行的 SQL 查询语句</param>
  174. /// <param name="cmdParms">结构化参数数组</param>
  175. /// <returns></returns>
  176. public bool Exists(string strSql, params DbParameter[] cmdParms)
  177. {
  178. object obj = ExecuteScalar(strSql, cmdParms);
  179. int cmdresult;
  180. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  181. {
  182. cmdresult = 0;
  183. }
  184. else
  185. {
  186. cmdresult = int.Parse(obj.ToString());
  187. }
  188. if (cmdresult == 0)
  189. {
  190. return false;
  191. }
  192. else
  193. {
  194. return true;
  195. }
  196. }
  197. /// <summary>
  198. /// 表是否存在
  199. /// </summary>
  200. /// <param name="tableName">表名</param>
  201. /// <returns></returns>
  202. public bool TabExists(string tableName)
  203. {
  204. string strsql = "select count(*) from sysobjects where id = object_id(N‘[" + tableName + "]‘) and OBJECTPROPERTY(id, N‘IsUserTable‘) = 1";
  205. object obj = ExecuteScalar(strsql);
  206. int cmdresult;
  207. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  208. {
  209. cmdresult = 0;
  210. }
  211. else
  212. {
  213. cmdresult = int.Parse(obj.ToString());
  214. }
  215. if (cmdresult == 0)
  216. {
  217. return false;
  218. }
  219. else
  220. {
  221. return true;
  222. }
  223. }
  224. #endregion
  225. #region 执行多条SQL语句,实现数据库事务
  226. /// <summary>
  227. /// 执行多条SQL语句,实现数据库事务。
  228. /// </summary>
  229. /// <param name="sqlStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
  230. public void ExecuteSqlTran(Hashtable sqlStringList)
  231. {
  232. using (DbConnection connection = providerFactory.CreateConnection())
  233. {
  234. connection.Open();
  235. using (DbTransaction trans = connection.BeginTransaction())
  236. {
  237. DbCommand command = null;
  238. try
  239. {
  240. foreach (DictionaryEntry myDE in sqlStringList)
  241. {
  242. string cmdText = myDE.Key.ToString();
  243. DbParameter[] cmdParms = (DbParameter[])myDE.Value;
  244. CreateDbCommand(command, connection, trans, cmdText, cmdParms);
  245. command.ExecuteNonQuery();
  246. command.Parameters.Clear();
  247. }
  248. trans.Commit();
  249. }
  250. catch
  251. {
  252. trans.Rollback();
  253. throw;
  254. }
  255. }
  256. }
  257. }
  258. #endregion
  259. #region 执行一个查询语句,返回一个关联的DataReader实例
  260. /// <summary>
  261. /// 执行一个查询语句,返回一个关联的DataReader实例
  262. /// </summary>
  263. /// <param name="sqlString">要执行的查询语句</param>
  264. /// <returns></returns>
  265. public DbDataReader ExecuteReader(string sqlString)
  266. {
  267. return ExecuteReader(sqlString, CommandType.Text, 0, null);
  268. }
  269. /// <summary>
  270. /// 执行一个查询语句,返回一个关联的DataReader实例
  271. /// </summary>
  272. /// <param name="sqlString">要执行的查询语句</param>
  273. /// <param name="parameters">执行SQL查询语句所需要的参数</param>
  274. /// <returns></returns>
  275. public DbDataReader ExecuteReader(string sqlString, DbParameter[] parameters)
  276. {
  277. return ExecuteReader(sqlString, CommandType.Text, 0, parameters);
  278. }
  279. /// <summary>
  280. /// 执行一个查询语句,返回一个关联的DataReader实例
  281. /// </summary>
  282. /// <param name="sqlString">要执行的查询语句</param>
  283. /// <param name="commandType">要执行查询语句的类型,如存储过程或者SQl文本命令</param>
  284. /// <returns></returns>
  285. public DbDataReader ExecuteReader(string sqlString, CommandType commandType)
  286. {
  287. return ExecuteReader(sqlString, commandType, 0, null);
  288. }
  289. /// <summary>
  290. /// 执行一个查询语句,返回一个关联的DataReader实例
  291. /// </summary>
  292. /// <param name="sqlString">要执行的查询语句</param>
  293. /// <param name="times">超时时间</param>
  294. /// <param name="parameters">执行SQL查询语句所需要的参数</param>
  295. /// <returns>SqlDataReader</returns>
  296. public DbDataReader ExecuteReader(string sqlString, int times, params DbParameter[] parameters)
  297. {
  298. return ExecuteReader(sqlString, CommandType.Text, times, parameters);
  299. }
  300. /// <summary>
  301. /// 执行一个查询语句,返回一个关联的DataReader实例
  302. /// </summary>
  303. /// <param name="sqlString">要执行的查询语句</param>
  304. /// <param name="parameters">执行SQL查询语句所需要的参数</param>
  305. /// <param name="commandType">执行的SQL语句的类型</param>
  306. /// <param name="times">超时时间</param>
  307. /// <returns></returns>
  308. public DbDataReader ExecuteReader(string sqlString, CommandType commandType, int times, DbParameter[] parameters)
  309. {
  310. DbCommand command = CreateDbCommand(sqlString, commandType, times, parameters);
  311. command.Connection.Open();
  312. return command.ExecuteReader(CommandBehavior.CloseConnection);
  313. }
  314. #endregion
  315. #region 执行存储过程
  316. /// <summary>
  317. /// 执行存储过程 (使用该方法切记要手工关闭SqlDataReader和连接)
  318. /// </summary>
  319. /// <param name="storedProcName">存储过程名</param>
  320. /// <param name="parameters">存储过程参数</param>
  321. /// <returns>SqlDataReader</returns>
  322. public DbDataReader RunProcedure(string storedProcName, IDbDataParameter[] parameters)
  323. {
  324. DbConnection connection = providerFactory.CreateConnection();
  325. connection.ConnectionString = ConnectionString;
  326. DbDataReader returnReader;
  327. connection.Open();
  328. DbCommand command = CreateDbQueryCommand(connection, storedProcName, parameters);
  329. command.CommandType = CommandType.StoredProcedure;
  330. returnReader = command.ExecuteReader();
  331. //Connection.Close(); 不能在此关闭,否则,返回的对象将无法使用
  332. return returnReader;
  333. }
  334. /// <summary>
  335. /// 执行存储过程
  336. /// </summary>
  337. /// <param name="storedProcName">存储过程名</param>
  338. /// <param name="parameters">存储过程参数</param>
  339. /// <param name="tableName">DataSet结果中的表名</param>
  340. /// <returns>DataSet</returns>
  341. public DataSet RunProcedure(string storedProcName, IDbDataParameter[] parameters, string tableName)
  342. {
  343. using (DbConnection connection = providerFactory.CreateConnection())
  344. {
  345. DataSet dataSet = new DataSet();
  346. connection.ConnectionString = ConnectionString;
  347. connection.Open();
  348. DbDataAdapter sqlDA = providerFactory.CreateDataAdapter();
  349. sqlDA.SelectCommand = CreateDbQueryCommand(connection, storedProcName, parameters);
  350. sqlDA.Fill(dataSet, tableName);
  351. connection.Close();
  352. return dataSet;
  353. }
  354. }
  355. /// <summary>
  356. /// 执行存储过程
  357. /// </summary>
  358. /// <param name="storedProcName">存储过程名</param>
  359. /// <param name="parameters">存储过程参数</param>
  360. /// <param name="tableName">DataSet结果中的表名</param>
  361. /// <param name="times">储存过程执行超时时间</param>
  362. /// <returns>DataSet</returns>
  363. public DataSet RunProcedure(string storedProcName, IDbDataParameter[] parameters, string tableName, int times)
  364. {
  365. using (DbConnection connection = providerFactory.CreateConnection())
  366. {
  367. connection.ConnectionString = ConnectionString;
  368. DataSet dataSet = new DataSet();
  369. connection.Open();
  370. DbDataAdapter sqlDA = providerFactory.CreateDataAdapter();
  371. sqlDA.SelectCommand = CreateDbQueryCommand(connection, storedProcName, parameters);
  372. sqlDA.SelectCommand.CommandTimeout = times;
  373. sqlDA.Fill(dataSet, tableName);
  374. connection.Close();
  375. return dataSet;
  376. }
  377. }
  378. /// <summary>
  379. /// 执行存储过程后返回执行结果(标识)
  380. /// </summary>
  381. /// <param name="storedProcName">储存过程名称</param>
  382. /// <param name="parameters">储存过程参数</param>
  383. /// <returns></returns>
  384. public string RunProcedureState(string storedProcName, IDbDataParameter[] parameters)
  385. {
  386. using (DbConnection connection = providerFactory.CreateConnection())
  387. {
  388. connection.ConnectionString = ConnectionString;
  389. connection.Open();
  390. DbDataAdapter sqlDA = providerFactory.CreateDataAdapter();
  391. DbParameter parameter = providerFactory.CreateParameter();
  392. parameter.ParameterName = "ReturnValue";
  393. parameter.DbType = DbType.Int32;
  394. parameter.Size = 4;
  395. parameter.Direction = ParameterDirection.ReturnValue;
  396. parameter.SourceColumnNullMapping = false;
  397. parameter.SourceColumn = string.Empty;
  398. parameter.SourceVersion = DataRowVersion.Default;
  399. parameter.Value = null;
  400. sqlDA.SelectCommand = CreateDbQueryCommand(connection, storedProcName, parameters);
  401. sqlDA.SelectCommand.Parameters.Add(parameter); //增加存储过程的返回值参数
  402. sqlDA.SelectCommand.ExecuteNonQuery();
  403. connection.Close();
  404. return sqlDA.SelectCommand.Parameters["ReturnValue"].Value.ToString();
  405. }
  406. }
  407. /// <summary>
  408. /// 执行存储过程,返回影响的行数
  409. /// </summary>
  410. /// <param name="storedProcName">存储过程名</param>
  411. /// <param name="parameters">存储过程参数</param>
  412. /// <param name="rowsAffected">影响的行数</param>
  413. /// <returns></returns>
  414. public int RunProcedure(string storedProcName, IDbDataParameter[] parameters, out int rowsAffected)
  415. {
  416. using (DbConnection connection = providerFactory.CreateConnection())
  417. {
  418. connection.ConnectionString = ConnectionString;
  419. int result;
  420. connection.Open();
  421. DbCommand command = CreateDbCommand(connection, storedProcName, parameters);
  422. rowsAffected = command.ExecuteNonQuery();
  423. result = (int)command.Parameters["ReturnValue"].Value;
  424. return result;
  425. }
  426. }
  427. #endregion
  428. #region 执行查询语句并返回DataSet
  429. /// <summary>
  430. /// 执行查询语句并返回 <see cref="System.Data.DataSet"/> 对象
  431. /// </summary>
  432. /// <param name="sqlString">查询语句</param>
  433. /// <returns>DataSet</returns>
  434. public DataSet ExecuteQuery(string sqlString)
  435. {
  436. return ExecuteQuery(sqlString, CommandType.Text, 0, null);
  437. }
  438. /// <summary>
  439. ///执行查询语句并返回 <see cref="System.Data.DataSet"/> 对象
  440. /// </summary>
  441. /// <param name="sqlString"></param>
  442. /// <param name="times"></param>
  443. /// <returns></returns>
  444. public DataSet ExecuteQuery(string sqlString, int times)
  445. {
  446. return ExecuteQuery(sqlString, CommandType.Text, times, null);
  447. }
  448. /// <summary>
  449. /// 执行查询语句并返回 <see cref="System.Data.DataSet"/> 对象
  450. /// </summary>
  451. /// <param name="sqlString">查询语句</param>
  452. /// <param name="cmdParms">结构化参数</param>
  453. /// <returns>DataSet</returns>
  454. public DataSet ExecuteQuery(string sqlString, DbParameter[] parameters)
  455. {
  456. return ExecuteQuery(sqlString, CommandType.Text, 0, parameters);
  457. }
  458. /// <summary>
  459. /// 执行查询语句并返回 <see cref="System.Data.DataSet"/> 对象
  460. /// </summary>
  461. /// <param name="sqlString"></param>
  462. /// <param name="times"></param>
  463. /// <param name="cmdParms"></param>
  464. /// <returns></returns>
  465. public DataSet ExecuteQuery(string sqlString, CommandType commandType, int times, DbParameter[] parameters)
  466. {
  467. using (DbCommand command = CreateDbCommand(sqlString, commandType, times, parameters))
  468. {
  469. command.Connection.Open();
  470. using (DbDataAdapter da = providerFactory.CreateDataAdapter())
  471. {
  472. da.SelectCommand = command;
  473. DataSet ds = new DataSet();
  474. da.Fill(ds, "ds");
  475. command.Parameters.Clear();
  476. command.Connection.Close();
  477. return ds;
  478. }
  479. }
  480. }
  481. #endregion
  482. #region 对数据库执行增删改操作,返回受影响的行数。
  483. /// <summary>
  484. /// 对数据库执行增删改操作,返回受影响的行数。
  485. /// </summary>
  486. /// <param name="sqlString">要执行的sql命令</param>
  487. /// <returns></returns>
  488. public int ExecuteNonQuery(string sqlString)
  489. {
  490. return ExecuteNonQuery(sqlString, CommandType.Text, 0, null);
  491. }
  492. /// <summary>
  493. /// 对数据库执行增删改操作,返回受影响的行数。
  494. /// </summary>
  495. /// <param name="sqlString">要执行的增删改的SQL语句</param>
  496. /// <param name="times">超时时间</param>
  497. /// <returns></returns>
  498. public int ExecuteNonQuery(string sqlString, int times)
  499. {
  500. return ExecuteNonQuery(sqlString, CommandType.Text, times, null);
  501. }
  502. /// <summary>
  503. /// 对数据库执行增删改操作,返回受影响的行数。
  504. /// </summary>
  505. /// <param name="sqlString">要执行的增删改的SQL语句</param>
  506. /// <param name="parameters">结构化的参数列表</param>
  507. /// <returns></returns>
  508. public int ExecuteNonQuery(string sqlString, DbParameter[] parameters)
  509. {
  510. return ExecuteNonQuery(sqlString, CommandType.Text, 0, parameters);
  511. }
  512. /// <summary>
  513. /// 对数据库执行增删改操作,返回受影响的行数。
  514. /// </summary>
  515. /// <param name="sqlString">要执行的增删改的SQL语句</param>
  516. /// <param name="commandType">要执行查询语句的类型,如存储过程或者sql文本命令</param>
  517. /// <returns></returns>
  518. public int ExecuteNonQuery(string sqlString, CommandType commandType)
  519. {
  520. return ExecuteNonQuery(sqlString, commandType, 0, null);
  521. }
  522. /// <summary>
  523. /// 对数据库执行增删改操作,返回受影响的行数。
  524. /// </summary>
  525. /// <param name="sqlString">要执行的增删改的SQL语句</param>
  526. /// <param name="commandType">执行的SQL语句的类型</param>
  527. /// <param name="times">超时时间</param>
  528. /// <param name="parameters">执行增删改语句所需要的参数</param>
  529. /// <returns></returns>
  530. public int ExecuteNonQuery(string sqlString, CommandType commandType, int times, DbParameter[] parameters)
  531. {
  532. using (DbCommand command = CreateDbCommand(sqlString, commandType, times, parameters))
  533. {
  534. command.Connection.Open();
  535. int affectedRows = command.ExecuteNonQuery();
  536. command.Connection.Close();
  537. return affectedRows;
  538. }
  539. }
  540. #endregion
  541. #region 执行一个查询,返回结果集的首行首列。忽略其他行,其他列
  542. /// <summary>
  543. /// 执行一个查询,返回结果集的首行首列。忽略其他行,其他列
  544. /// </summary>
  545. /// <param name="sqlString">要执行的SQl命令</param>
  546. /// <returns></returns>
  547. public Object ExecuteScalar(string sqlString)
  548. {
  549. return ExecuteScalar(sqlString, CommandType.Text, 0, null);
  550. }
  551. /// <summary>
  552. /// 执行一个查询,返回结果集的首行首列。忽略其他行,其他列
  553. /// </summary>
  554. /// <param name="sqlString">要执行的SQl命令</param>
  555. /// <param name="times">执行超时时间</param>
  556. /// <returns></returns>
  557. public Object ExecuteScalar(string sqlString, int times)
  558. {
  559. return ExecuteScalar(sqlString, CommandType.Text, times, null);
  560. }
  561. /// <summary>
  562. /// 执行一个查询,返回结果集的首行首列。忽略其他行,其他列
  563. /// </summary>
  564. /// <param name="sqlString">要执行的SQl命令</param>
  565. /// <param name="cmdParms">结构化的查询语句</param>
  566. /// <returns></returns>
  567. public object ExecuteScalar(string sqlString, params DbParameter[] cmdParms)
  568. {
  569. return ExecuteScalar(sqlString, CommandType.Text, 0, cmdParms);
  570. }
  571. /// <summary>
  572. /// 执行一个查询语句,返回查询结果的第一行第一列
  573. /// </summary>
  574. /// <param name="sql">要执行的查询语句</param>
  575. /// <param name="parameters">执行SQL查询语句所需要的参数</param>
  576. /// <param name="commandType">执行的SQL语句的类型</param>
  577. /// <returns></returns>
  578. public Object ExecuteScalar(string sqlString, CommandType commandType, int times, DbParameter[] parameters)
  579. {
  580. using (DbCommand command = CreateDbCommand(sqlString, commandType, times, parameters))
  581. {
  582. command.Connection.Open();
  583. object result = command.ExecuteScalar();
  584. command.Connection.Close();
  585. return result;
  586. }
  587. }
  588. #endregion
  589. #region 执行一个查询语句,返回一个包含查询结果的DataTable
  590. /// <summary>
  591. /// 执行一个查询语句,返回一个包含查询结果的DataTable
  592. /// </summary>
  593. /// <param name="sql">要执行的sql文本命令</param>
  594. /// <returns>返回查询的结果集</returns>
  595. public DataTable ExecuteDataTable(string sql)
  596. {
  597. return ExecuteDataTable(sql, CommandType.Text, 0, null);
  598. }
  599. /// <summary>
  600. /// 执行一个查询语句,返回一个包含查询结果的DataTable
  601. /// </summary>
  602. /// <param name="sqlString">要执行的sql文本命令</param>
  603. /// <param name="parameters">执行SQL查询语句所需要的参数</param>
  604. /// <returns></returns>
  605. public DataTable ExecuteDataTable(string sqlString, DbParameter[] parameters)
  606. {
  607. return ExecuteDataTable(sqlString, CommandType.Text, 0, parameters);
  608. }
  609. /// <summary>
  610. /// 执行一个查询语句,返回一个包含查询结果的DataTable
  611. /// </summary>
  612. /// <param name="sqlString">要执行的sql语句</param>
  613. /// <param name="commandType">要执行的查询语句的类型,如存储过程或者sql文本命令</param>
  614. /// <returns>返回查询结果集</returns>
  615. public DataTable ExecuteDataTable(string sqlString, CommandType commandType)
  616. {
  617. return ExecuteDataTable(sqlString, commandType, 0, null);
  618. }
  619. /// <summary>
  620. /// 执行一个查询语句,返回一个包含查询结果的DataTable
  621. /// </summary>
  622. /// <param name="sqlString">要执行的sql语句</param>
  623. /// <param name="commandType">要执行的查询语句的类型</param>
  624. /// <param name="times">超时时间</param>
  625. /// <returns></returns>
  626. public DataTable ExecuteDataTable(string sqlString, CommandType commandType, int times)
  627. {
  628. return ExecuteDataTable(sqlString, commandType, times, null);
  629. }
  630. /// <summary>
  631. /// 执行一个查询语句,返回一个包含查询结果的DataTable
  632. /// </summary>
  633. /// <param name="sqlString">要执行的查询语句</param>
  634. /// <param name="times">超时时间</param>
  635. /// <param name="commandType">执行的SQL语句的类型</param>
  636. /// <param name="parameters">执行SQL查询语句所需要的参数</param>
  637. /// <returns></returns>
  638. public DataTable ExecuteDataTable(string sqlString, CommandType commandType, int times, DbParameter[] parameters)
  639. {
  640. using (DbCommand command = CreateDbCommand(sqlString, commandType, times, parameters))
  641. {
  642. using (DbDataAdapter adapter = providerFactory.CreateDataAdapter())
  643. {
  644. adapter.SelectCommand = command;
  645. DataTable data = new DataTable();
  646. adapter.Fill(data);
  647. return data;
  648. }
  649. }
  650. }
  651. #endregion
  652. #region 内部私有方法
  653. /// <summary>
  654. /// 构建 DbCommand 对象(用来返回一个结果集,而不是一个整数值)
  655. /// </summary>
  656. /// <param name="connection"></param>
  657. /// <param name="storedProcName"></param>
  658. /// <param name="parameters"></param>
  659. /// <returns></returns>
  660. private DbCommand CreateDbQueryCommand(DbConnection connection, string storedProcName, IDbDataParameter[] parameters)
  661. {
  662. DbCommand command = providerFactory.CreateCommand();
  663. command.CommandText = storedProcName;
  664. command.Connection = connection;
  665. command.CommandType = CommandType.StoredProcedure;
  666. foreach (DbParameter parameter in parameters)
  667. {
  668. if (parameter != null)
  669. {
  670. // 检查未分配值的输出参数,将其分配以DBNull.Value.
  671. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null))
  672. {
  673. parameter.Value = DBNull.Value;
  674. }
  675. command.Parameters.Add(((ICloneable)parameter).Clone());
  676. }
  677. }
  678. return command;
  679. }
  680. /// <summary>
  681. ///
  682. /// </summary>
  683. /// <param name="connection"></param>
  684. /// <param name="storedProcName"></param>
  685. /// <param name="parameters"></param>
  686. /// <returns></returns>
  687. private DbCommand CreateDbCommand(DbConnection connection, string storedProcName, IDbDataParameter[] parameters)
  688. {
  689. DbCommand command = CreateDbQueryCommand(connection, storedProcName, parameters);
  690. DbParameter parameter = providerFactory.CreateParameter();
  691. parameter.ParameterName = "ReturnValue";
  692. parameter.DbType = DbType.Int32;
  693. parameter.Size = 4;
  694. parameter.Direction = ParameterDirection.ReturnValue;
  695. parameter.SourceColumnNullMapping = false;
  696. parameter.SourceColumn = string.Empty;
  697. parameter.SourceVersion = DataRowVersion.Default;
  698. parameter.Value = null;
  699. command.Parameters.Add(((ICloneable)parameter).Clone());
  700. return command;
  701. }
  702. /// <summary>
  703. /// 创建一个DbCommand对象
  704. /// </summary>
  705. /// <param name="cmd">DbCommand对象</param>
  706. /// <param name="conn">DbConnection数据库连接</param>
  707. /// <param name="trans">DbTransaction事务对象</param>
  708. /// <param name="cmdText">执行的SQL语句</param>
  709. /// <param name="cmdParms">DbParameter参数数组</param>
  710. private void CreateDbCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, string cmdText, DbParameter[] cmdParms)
  711. {
  712. if (conn.State != ConnectionState.Open)
  713. {
  714. conn.Open();
  715. }
  716. cmd.Connection = conn;
  717. cmd.CommandText = cmdText;
  718. if (trans != null)
  719. {
  720. cmd.Transaction = trans;
  721. }
  722. cmd.CommandType = CommandType.Text;//cmdType;
  723. if (cmdParms != null)
  724. {
  725. foreach (DbParameter parameter in cmdParms)
  726. {
  727. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  728. (parameter.Value == null))
  729. {
  730. parameter.Value = DBNull.Value;
  731. }
  732. cmd.Parameters.Add(((ICloneable)parameter).Clone());
  733. }
  734. }
  735. }
  736. /// <summary>
  737. /// 创建一个DbCommand对象
  738. /// </summary>
  739. /// <param name="sqlString">要执行的查询语句</param>
  740. /// <param name="parameters">执行SQL查询语句所需要的参数</param>
  741. /// <param name="commandType">执行的SQL语句的类型</param>
  742. /// <returns></returns>
  743. private DbCommand CreateDbCommand(string sqlString, CommandType commandType, int times, DbParameter[] parameters)
  744. {
  745. DbConnection connection = providerFactory.CreateConnection();
  746. DbCommand command = providerFactory.CreateCommand();
  747. connection.ConnectionString = ConnectionString;
  748. command.CommandText = sqlString;
  749. command.CommandType = commandType;
  750. command.Connection = connection;
  751. if (times > 0) { command.CommandTimeout = times; }
  752. if (!(parameters == null || parameters.Length == 0))
  753. {
  754. foreach (DbParameter parameter in parameters)
  755. {
  756. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  757. (parameter.Value == null))
  758. {
  759. parameter.Value = DBNull.Value;
  760. }
  761. command.Parameters.Add(((ICloneable)parameter).Clone());
  762. }
  763. }
  764. return command;
  765. }
  766. /// <summary>
  767. /// 创建一个DbCommand对象
  768. /// </summary>
  769. /// <param name="sqlString">要执行的查询语句</param>
  770. /// <param name="times">超时时间</param>
  771. /// <param name="parameters">执行SQL查询语句所需要的参数</param>
  772. /// <returns></returns>
  773. private DbCommand CreateDbCommand(string sqlString, int times, DbParameter[] parameters)
  774. {
  775. DbConnection connection = providerFactory.CreateConnection();
  776. DbCommand command = providerFactory.CreateCommand();
  777. connection.ConnectionString = ConnectionString;
  778. command.CommandText = sqlString;
  779. command.CommandType = CommandType.Text;
  780. command.Connection = connection;
  781. command.Transaction = connection.BeginTransaction();
  782. if (times > 0) { command.CommandTimeout = times; }
  783. if (!(parameters == null || parameters.Length == 0))
  784. {
  785. foreach (DbParameter parameter in parameters)
  786. {
  787. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  788. (parameter.Value == null))
  789. {
  790. parameter.Value = DBNull.Value;
  791. }
  792. command.Parameters.Add(((ICloneable)parameter).Clone());
  793. }
  794. }
  795. return command;
  796. }
  797. #endregion
  798. #region 获取安全的SQL字符串
  799. /// <summary>
  800. /// 获取安全的SQL字符串
  801. /// </summary>
  802. /// <param name="sql"></param>
  803. /// <returns></returns>
  804. public string GetSafeSQLString(string sql)
  805. {
  806. sql = sql.Replace(",", ",");
  807. sql = sql.Replace(".", "。");
  808. sql = sql.Replace("(", "(");
  809. sql = sql.Replace(")", ")");
  810. sql = sql.Replace(">", ">");
  811. sql = sql.Replace("<", "<");
  812. sql = sql.Replace("-", "-");
  813. sql = sql.Replace("+", "+");
  814. sql = sql.Replace("=", "=");
  815. sql = sql.Replace("?", "?");
  816. sql = sql.Replace("*", "*");
  817. sql = sql.Replace("|", "|");
  818. sql = sql.Replace("&", "&");
  819. return sql;
  820. }
  821. #endregion
  822. #region 返回当前连接的数据库中所有用户创建的数据库
  823. /// <summary>
  824. /// 返回当前连接的数据库中所有用户创建的数据库
  825. /// </summary>
  826. /// <returns></returns>
  827. public DataTable GetTables()
  828. {
  829. DataTable table = null;
  830. using (DbConnection con = providerFactory.CreateConnection())
  831. {
  832. con.Open();
  833. table = con.GetSchema("Tables");
  834. }
  835. return table;
  836. }
  837. #endregion
  838. }
  839. #region 数据库类型枚举
  840. /// <summary>
  841. /// 数据库类型枚举
  842. /// </summary>
  843. public enum DbProviderType : byte
  844. {
  845. /// <summary>
  846. /// 微软 SqlServer 数据库
  847. /// </summary>
  848. SqlServer,
  849. /// <summary>
  850. /// 开源 MySql数据库
  851. /// </summary>
  852. MySql,
  853. /// <summary>
  854. /// 嵌入式轻型数据库 SQLite
  855. /// </summary>
  856. SQLite,
  857. /// <summary>
  858. /// 甲骨文 Oracle
  859. /// </summary>
  860. Oracle,
  861. /// <summary>
  862. /// 开放数据库互连
  863. /// </summary>
  864. ODBC,
  865. /// <summary>
  866. /// 面向不同的数据源的低级应用程序接口
  867. /// </summary>
  868. OleDb,
  869. /// <summary>
  870. /// 跨平台的关系数据库系统 Firebird
  871. /// </summary>
  872. Firebird,
  873. /// <summary>
  874. ///加州大学伯克利分校计算机系开发的关系型数据库 PostgreSql
  875. /// </summary>
  876. PostgreSql,
  877. /// <summary>
  878. /// IBM出口的一系列关系型数据库管理系统 DB2
  879. /// </summary>
  880. DB2,
  881. /// <summary>
  882. /// IBM公司出品的关系数据库管理系统(RDBMS)家族 Informix
  883. /// </summary>
  884. Informix,
  885. /// <summary>
  886. /// 微软推出的一个适用于嵌入到移动应用的精简数据库产品 SqlServerCe
  887. /// </summary>
  888. SqlServerCe
  889. }
  890. #endregion
  891. #region DbProviderFactory工厂类
  892. /// <summary>
  893. /// DbProviderFactory工厂类
  894. /// </summary>
  895. public class ProviderFactory
  896. {
  897. private readonly static Dictionary<DbProviderType, string> providerInvariantNames = new Dictionary<DbProviderType, string>();
  898. private readonly static Dictionary<DbProviderType, DbProviderFactory> providerFactoies = new Dictionary<DbProviderType, DbProviderFactory>(20);
  899. /// <summary>
  900. /// 加载已知的数据库访问类的程序集
  901. /// </summary>
  902. static ProviderFactory()
  903. {
  904. providerInvariantNames.Add(DbProviderType.SqlServer, "System.Data.SqlClient");
  905. providerInvariantNames.Add(DbProviderType.OleDb, "System.Data.OleDb");
  906. providerInvariantNames.Add(DbProviderType.ODBC, "System.Data.ODBC");
  907. providerInvariantNames.Add(DbProviderType.Oracle, "Oracle.DataAccess.Client");
  908. providerInvariantNames.Add(DbProviderType.MySql, "MySql.Data.MySqlClient");
  909. providerInvariantNames.Add(DbProviderType.SQLite, "System.Data.SQLite");
  910. providerInvariantNames.Add(DbProviderType.Firebird, "FirebirdSql.Data.Firebird");
  911. providerInvariantNames.Add(DbProviderType.PostgreSql, "Npgsql");
  912. providerInvariantNames.Add(DbProviderType.DB2, "IBM.Data.DB2.iSeries");
  913. providerInvariantNames.Add(DbProviderType.Informix, "IBM.Data.Informix");
  914. providerInvariantNames.Add(DbProviderType.SqlServerCe, "System.Data.SqlServerCe");
  915. }
  916. /// <summary>
  917. /// 获取指定数据库类型对应的程序集名称
  918. /// </summary>
  919. /// <param name="providerType">数据库类型枚举</param>
  920. /// <returns></returns>
  921. public static string GetProviderInvariantName(DbProviderType providerType)
  922. {
  923. return providerInvariantNames[providerType];
  924. }
  925. /// <summary>
  926. /// 获取指定类型的数据库对应的DbProviderFactory
  927. /// </summary>
  928. /// <param name="providerType">数据库类型枚举</param>
  929. /// <returns></returns>
  930. public static DbProviderFactory GetDbProviderFactory(DbProviderType providerType)
  931. {
  932. //如果还没有加载,则加载该DbProviderFactory
  933. if (!providerFactoies.ContainsKey(providerType))
  934. {
  935. providerFactoies.Add(providerType, ImportDbProviderFactory(providerType));
  936. }
  937. return providerFactoies[providerType];
  938. }
  939. /// <summary>
  940. /// 加载指定数据库类型的DbProviderFactory
  941. /// </summary>
  942. /// <param name="providerType">数据库类型枚举</param>
  943. /// <returns></returns>
  944. private static DbProviderFactory ImportDbProviderFactory(DbProviderType providerType)
  945. {
  946. string providerName = providerInvariantNames[providerType];
  947. DbProviderFactory factory = null;
  948. try
  949. {
  950. //从全局程序集中查找
  951. factory = DbProviderFactories.GetFactory(providerName);
  952. }
  953. catch (ArgumentException e)
  954. {
  955. factory = null;
  956. }
  957. return factory;
  958. }
  959. }
  960. #endregion
  961. }

 

C# 数据库访问公共类

标签:

人气教程排行