自用类库整理之SqlHelper和MySqlHelper

自用的SQLHelper和MySqlHelper,除一些通用方法外,封装了一些很实用的批量操作方法,简单介绍下

SqlHelper

  • ExecuteEmptyDataTable
    获取空表结构,主要用于需要构造DataTable进行大批量数据插入时使用
  • BulkInsert
    大批量数据插入,使用SqlBulkCopy进行大批量数据导入,仅提供了DataTable方式,需要DataReader的请自行重载
  • BatchDelete、BatchUpdate
    批量数据更新、插入,使用SqlDataAdapter实现,需要进行较大数据量更新、插入时可以使用此方法,性能还不错BatchUpdate,BatchDelete:分批次批量删除、更新数据,此方法应用场景较少,用于需要删除、更新大量数据的同时不造成数据库阻塞且不影响数据库订阅、复制延时等
  • ExecutePageDataTable
    通用的分页方法,提供了CTE表达式的支持
  • SqlHelperExtension.cs(ExecuteObject、ExecuteObjects)
    提供了泛型获取对象方法支持,依赖依赖AutoMapper.dll实现,非常在意性能的慎用
  • SqlHelperSchemaExtension.cs
    SqlServer获取数据库、表、索引信息的封装,可以用来辅助写自己的代码生成器,查看数据库索引之类的

MySqlHelper

  • ExecuteEmptyDataTable
    获取空表结构,主要用于需要构造DataTable进行大批量数据插入时使用
  • BulkInsert
    使用MySqlBulkLoader进行大批量数据导入,仅提供了DataTable方式,需要DataReader的请自行重载
  • BatchUpdate
    批量数据更新、插入,使用MySqlDataAdapter实现,需要进行较大数据量更新、插入时可以使用此方法,性能还不错
  • MySqlHelperExtension.csExecuteObject、ExecuteObjects
    提供了泛型获取对象方法支持,依赖依赖AutoMapper.dll实现,非常在意性能的慎用
  1.  SqlHelper.cs
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Data.SqlClient;
  7. using System.Data;
  8. using System.Text.RegularExpressions;
  9. namespace Helpers
  10. {
  11. /// <summary>
  12. /// SqlHelper操作类
  13. /// </summary>
  14. public sealed partial class SqlHelper
  15. {
  16. /// <summary>
  17. /// 批量操作每批次记录数
  18. /// </summary>
  19. public static int BatchSize = 2000;
  20. /// <summary>
  21. /// 超时时间
  22. /// </summary>
  23. public static int CommandTimeOut = 600;
  24. /// <summary>
  25. ///初始化SqlHelper实例
  26. /// </summary>
  27. /// <param name="connectionString">数据库连接字符串</param>
  28. public SqlHelper(string connectionString)
  29. {
  30. this.ConnectionString = connectionString;
  31. }
  32. /// <summary>
  33. /// 数据库连接字符串
  34. /// </summary>
  35. public string ConnectionString { get; set; }
  36. #region 实例方法
  37. #region ExecuteNonQuery
  38. /// <summary>
  39. /// 执行SQL语句,返回影响的行数
  40. /// </summary>
  41. /// <param name="commandText">SQL语句</param>
  42. /// <param name="parms">查询参数</param>
  43. /// <returns>返回影响的行数</returns>
  44. public int ExecuteNonQuery(string commandText, params SqlParameter[] parms)
  45. {
  46. return ExecuteNonQuery(ConnectionString, CommandType.Text, commandText, parms);
  47. }
  48. /// <summary>
  49. /// 执行SQL语句,返回影响的行数
  50. /// </summary>
  51. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  52. /// <param name="commandText">SQL语句或存储过程名称</param>
  53. /// <param name="parms">查询参数</param>
  54. /// <returns>返回影响的行数</returns>
  55. public int ExecuteNonQuery(CommandType commandType, string commandText, params SqlParameter[] parms)
  56. {
  57. return ExecuteNonQuery(ConnectionString, commandType, commandText, parms);
  58. }
  59. #endregion ExecuteNonQuery
  60. #region ExecuteScalar
  61. /// <summary>
  62. /// 执行SQL语句,返回结果集中的第一行第一列
  63. /// </summary>
  64. /// <typeparam name="T">返回对象类型</typeparam>
  65. /// <param name="commandText">SQL语句</param>
  66. /// <param name="parms">查询参数</param>
  67. /// <returns>返回结果集中的第一行第一列</returns>
  68. public T ExecuteScalar<T>(string commandText, params SqlParameter[] parms)
  69. {
  70. return ExecuteScalar<T>(ConnectionString, commandText, parms);
  71. }
  72. /// <summary>
  73. /// 执行SQL语句,返回结果集中的第一行第一列
  74. /// </summary>
  75. /// <param name="commandText">SQL语句</param>
  76. /// <param name="parms">查询参数</param>
  77. /// <returns>返回结果集中的第一行第一列</returns>
  78. public object ExecuteScalar(string commandText, params SqlParameter[] parms)
  79. {
  80. return ExecuteScalar(ConnectionString, CommandType.Text, commandText, parms);
  81. }
  82. /// <summary>
  83. /// 执行SQL语句,返回结果集中的第一行第一列
  84. /// </summary>
  85. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  86. /// <param name="commandText">SQL语句或存储过程名称</param>
  87. /// <param name="parms">查询参数</param>
  88. /// <returns>返回结果集中的第一行第一列</returns>
  89. public object ExecuteScalar(CommandType commandType, string commandText, params SqlParameter[] parms)
  90. {
  91. return ExecuteScalar(ConnectionString, commandType, commandText, parms);
  92. }
  93. #endregion ExecuteScalar
  94. #region ExecuteDataReader
  95. /// <summary>
  96. /// 执行SQL语句,返回只读数据集
  97. /// </summary>
  98. /// <param name="commandText">SQL语句</param>
  99. /// <param name="parms">查询参数</param>
  100. /// <returns>返回只读数据集</returns>
  101. private SqlDataReader ExecuteDataReader(string commandText, params SqlParameter[] parms)
  102. {
  103. return ExecuteDataReader(ConnectionString, CommandType.Text, commandText, parms);
  104. }
  105. /// <summary>
  106. /// 执行SQL语句,返回只读数据集
  107. /// </summary>
  108. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  109. /// <param name="commandText">SQL语句或存储过程名称</param>
  110. /// <param name="parms">查询参数</param>
  111. /// <returns>返回只读数据集</returns>
  112. private SqlDataReader ExecuteDataReader(CommandType commandType, string commandText, params SqlParameter[] parms)
  113. {
  114. return ExecuteDataReader(ConnectionString, commandType, commandText, parms);
  115. }
  116. #endregion
  117. #region ExecuteDataRow
  118. /// <summary>
  119. /// 执行SQL语句,返回结果集中的第一行
  120. /// </summary>
  121. /// <param name="commandText">SQL语句</param>
  122. /// <param name="parms">查询参数</param>
  123. /// <returns>返回结果集中的第一行</returns>
  124. public DataRow ExecuteDataRow(string commandText, params SqlParameter[] parms)
  125. {
  126. return ExecuteDataRow(ConnectionString, CommandType.Text, commandText, parms);
  127. }
  128. /// <summary>
  129. /// 执行SQL语句,返回结果集中的第一行
  130. /// </summary>
  131. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  132. /// <param name="commandText">SQL语句或存储过程名称</param>
  133. /// <param name="parms">查询参数</param>
  134. /// <returns>返回结果集中的第一行</returns>
  135. public DataRow ExecuteDataRow(CommandType commandType, string commandText, params SqlParameter[] parms)
  136. {
  137. return ExecuteDataRow(ConnectionString, commandType, commandText, parms);
  138. }
  139. #endregion ExecuteDataRow
  140. #region ExecuteDataTable
  141. /// <summary>
  142. /// 执行SQL语句,返回结果集中的第一个数据表
  143. /// </summary>
  144. /// <param name="commandText">SQL语句</param>
  145. /// <param name="parms">查询参数</param>
  146. /// <returns>返回结果集中的第一个数据表</returns>
  147. public DataTable ExecuteDataTable(string commandText, params SqlParameter[] parms)
  148. {
  149. return ExecuteDataTable(ConnectionString, CommandType.Text, commandText, parms);
  150. }
  151. /// <summary>
  152. /// 执行SQL语句,返回结果集中的第一个数据表
  153. /// </summary>
  154. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  155. /// <param name="commandText">SQL语句或存储过程名称</param>
  156. /// <param name="parms">查询参数</param>
  157. /// <returns>返回结果集中的第一个数据表</returns>
  158. public DataTable ExecuteDataTable(CommandType commandType, string commandText, params SqlParameter[] parms)
  159. {
  160. return ExecuteDataSet(ConnectionString, commandType, commandText, parms).Tables[0];
  161. }
  162. /// <summary>
  163. /// 执行SQL语句,返回结果集中的第一个数据表
  164. /// </summary>
  165. /// <param name="sql">SQL语句</param>
  166. /// <param name="order">排序SQL,如"ORDER BY ID DESC"</param>
  167. /// <param name="pageSize">每页记录数</param>
  168. /// <param name="pageIndex">页索引</param>
  169. /// <param name="parms">查询参数</param>
  170. /// <param name="query">查询SQL</param>
  171. /// <returns></returns>
  172. public DataTable ExecutePageDataTable(string sql, string order, int pageSize, int pageIndex, SqlParameter[] parms = null, string query = null, string cte = null)
  173. {
  174. return ExecutePageDataTable(sql, order, pageSize, pageIndex, parms, query, cte);
  175. }
  176. #endregion ExecuteDataTable
  177. #region ExecuteDataSet
  178. /// <summary>
  179. /// 执行SQL语句,返回结果集
  180. /// </summary>
  181. /// <param name="commandText">SQL语句</param>
  182. /// <param name="parms">查询参数</param>
  183. /// <returns>返回结果集</returns>
  184. public DataSet ExecuteDataSet(string commandText, params SqlParameter[] parms)
  185. {
  186. return ExecuteDataSet(ConnectionString, CommandType.Text, commandText, parms);
  187. }
  188. /// <summary>
  189. /// 执行SQL语句,返回结果集
  190. /// </summary>
  191. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  192. /// <param name="commandText">SQL语句或存储过程名称</param>
  193. /// <param name="parms">查询参数</param>
  194. /// <returns>返回结果集</returns>
  195. public DataSet ExecuteDataSet(CommandType commandType, string commandText, params SqlParameter[] parms)
  196. {
  197. return ExecuteDataSet(ConnectionString, commandType, commandText, parms);
  198. }
  199. #endregion ExecuteDataSet
  200. #region 批量操作
  201. /// <summary>
  202. /// 大批量数据插入
  203. /// </summary>
  204. /// <param name="table">数据表</param>
  205. public void BulkInsert(DataTable table)
  206. {
  207. BulkInsert(ConnectionString, table);
  208. }
  209. /// <summary>
  210. /// 使用MySqlDataAdapter批量更新数据
  211. /// </summary>
  212. /// <param name="table">数据表</param>
  213. public void BatchUpdate(DataTable table)
  214. {
  215. BatchUpdate(ConnectionString, table);
  216. }
  217. /// <summary>
  218. /// 分批次批量删除数据
  219. /// </summary>
  220. /// <param name="sql">SQL语句</param>
  221. /// <param name="batchSize">每批次删除记录行数</param>
  222. /// <param name="interval">批次执行间隔(秒)</param>
  223. public void BatchDelete(string sql, int batchSize = 1000, int interval = 1)
  224. {
  225. BatchDelete(ConnectionString, sql, batchSize, interval);
  226. }
  227. /// <summary>
  228. /// 分批次批量更新数据
  229. /// </summary>
  230. /// <param name="sql">SQL语句</param>
  231. /// <param name="batchSize">每批次更新记录行数</param>
  232. /// <param name="interval">批次执行间隔(秒)</param>
  233. public void BatchUpdate(string sql, int batchSize = 1000, int interval = 1)
  234. {
  235. BatchUpdate(ConnectionString, sql, batchSize, interval);
  236. }
  237. #endregion 批量操作
  238. #endregion 实例方法
  239. #region 静态方法
  240. private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] parms)
  241. {
  242. if (connection.State != ConnectionState.Open) connection.Open();
  243. command.Connection = connection;
  244. command.CommandTimeout = CommandTimeOut;
  245. // 设置命令文本(存储过程名或SQL语句)
  246. command.CommandText = commandText;
  247. // 分配事务
  248. if (transaction != null)
  249. {
  250. command.Transaction = transaction;
  251. }
  252. // 设置命令类型.
  253. command.CommandType = commandType;
  254. if (parms != null && parms.Length > 0)
  255. {
  256. //预处理SqlParameter参数数组,将为NULL的参数赋值为DBNull.Value;
  257. foreach (SqlParameter parameter in parms)
  258. {
  259. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null))
  260. {
  261. parameter.Value = DBNull.Value;
  262. }
  263. }
  264. command.Parameters.AddRange(parms);
  265. }
  266. }
  267. #region ExecuteNonQuery
  268. /// <summary>
  269. /// 执行SQL语句,返回影响的行数
  270. /// </summary>
  271. /// <param name="connectionString">数据库连接字符串</param>
  272. /// <param name="commandText">SQL语句</param>
  273. /// <param name="parms">查询参数</param>
  274. /// <returns>返回影响的行数</returns>
  275. public static int ExecuteNonQuery(string connectionString, string commandText, params SqlParameter[] parms)
  276. {
  277. using (SqlConnection connection = new SqlConnection(connectionString))
  278. {
  279. return ExecuteNonQuery(connection, CommandType.Text, commandText, parms);
  280. }
  281. }
  282. /// <summary>
  283. /// 执行SQL语句,返回影响的行数
  284. /// </summary>
  285. /// <param name="connectionString">数据库连接字符串</param>
  286. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  287. /// <param name="commandText">SQL语句或存储过程名称</param>
  288. /// <param name="parms">查询参数</param>
  289. /// <returns>返回影响的行数</returns>
  290. public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] parms)
  291. {
  292. using (SqlConnection connection = new SqlConnection(connectionString))
  293. {
  294. return ExecuteNonQuery(connection, commandType, commandText, parms);
  295. }
  296. }
  297. /// <summary>
  298. /// 执行SQL语句,返回影响的行数
  299. /// </summary>
  300. /// <param name="connection">数据库连接</param>
  301. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  302. /// <param name="commandText">SQL语句或存储过程名称</param>
  303. /// <param name="parms">查询参数</param>
  304. /// <returns>返回影响的行数</returns>
  305. public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] parms)
  306. {
  307. return ExecuteNonQuery(connection, null, commandType, commandText, parms);
  308. }
  309. /// <summary>
  310. /// 执行SQL语句,返回影响的行数
  311. /// </summary>
  312. /// <param name="transaction">事务</param>
  313. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  314. /// <param name="commandText">SQL语句或存储过程名称</param>
  315. /// <param name="parms">查询参数</param>
  316. /// <returns>返回影响的行数</returns>
  317. public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  318. {
  319. return ExecuteNonQuery(transaction.Connection, transaction, commandType, commandText, parms);
  320. }
  321. /// <summary>
  322. /// 执行SQL语句,返回影响的行数
  323. /// </summary>
  324. /// <param name="connection">数据库连接</param>
  325. /// <param name="transaction">事务</param>
  326. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  327. /// <param name="commandText">SQL语句或存储过程名称</param>
  328. /// <param name="parms">查询参数</param>
  329. /// <returns>返回影响的行数</returns>
  330. private static int ExecuteNonQuery(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  331. {
  332. SqlCommand command = new SqlCommand();
  333. PrepareCommand(command, connection, transaction, commandType, commandText, parms);
  334. int retval = command.ExecuteNonQuery();
  335. command.Parameters.Clear();
  336. return retval;
  337. }
  338. #endregion ExecuteNonQuery
  339. #region ExecuteScalar
  340. /// <summary>
  341. /// 执行SQL语句,返回结果集中的第一行第一列
  342. /// </summary>
  343. /// <typeparam name="T">返回对象类型</typeparam>
  344. /// <param name="connectionString">数据库连接字符串</param>
  345. /// <param name="commandText">SQL语句</param>
  346. /// <param name="parms">查询参数</param>
  347. /// <returns>返回结果集中的第一行第一列</returns>
  348. public static T ExecuteScalar<T>(string connectionString, string commandText, params SqlParameter[] parms)
  349. {
  350. object result = ExecuteScalar(connectionString, commandText, parms);
  351. if (result != null)
  352. {
  353. return (T)Convert.ChangeType(result, typeof(T)); ;
  354. }
  355. return default(T);
  356. }
  357. /// <summary>
  358. /// 执行SQL语句,返回结果集中的第一行第一列
  359. /// </summary>
  360. /// <param name="connectionString">数据库连接字符串</param>
  361. /// <param name="commandText">SQL语句</param>
  362. /// <param name="parms">查询参数</param>
  363. /// <returns>返回结果集中的第一行第一列</returns>
  364. public static object ExecuteScalar(string connectionString, string commandText, params SqlParameter[] parms)
  365. {
  366. using (SqlConnection connection = new SqlConnection(connectionString))
  367. {
  368. return ExecuteScalar(connection, CommandType.Text, commandText, parms);
  369. }
  370. }
  371. /// <summary>
  372. /// 执行SQL语句,返回结果集中的第一行第一列
  373. /// </summary>
  374. /// <param name="connectionString">数据库连接字符串</param>
  375. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  376. /// <param name="commandText">SQL语句或存储过程名称</param>
  377. /// <param name="parms">查询参数</param>
  378. /// <returns>返回结果集中的第一行第一列</returns>
  379. public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params SqlParameter[] parms)
  380. {
  381. using (SqlConnection connection = new SqlConnection(connectionString))
  382. {
  383. return ExecuteScalar(connection, commandType, commandText, parms);
  384. }
  385. }
  386. /// <summary>
  387. /// 执行SQL语句,返回结果集中的第一行第一列
  388. /// </summary>
  389. /// <param name="connection">数据库连接</param>
  390. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  391. /// <param name="commandText">SQL语句或存储过程名称</param>
  392. /// <param name="parms">查询参数</param>
  393. /// <returns>返回结果集中的第一行第一列</returns>
  394. public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] parms)
  395. {
  396. return ExecuteScalar(connection, null, commandType, commandText, parms);
  397. }
  398. /// <summary>
  399. /// 执行SQL语句,返回结果集中的第一行第一列
  400. /// </summary>
  401. /// <param name="transaction">事务</param>
  402. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  403. /// <param name="commandText">SQL语句或存储过程名称</param>
  404. /// <param name="parms">查询参数</param>
  405. /// <returns>返回结果集中的第一行第一列</returns>
  406. public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  407. {
  408. return ExecuteScalar(transaction.Connection, transaction, commandType, commandText, parms);
  409. }
  410. /// <summary>
  411. /// 执行SQL语句,返回结果集中的第一行第一列
  412. /// </summary>
  413. /// <param name="connection">数据库连接</param>
  414. /// <param name="transaction">事务</param>
  415. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  416. /// <param name="commandText">SQL语句或存储过程名称</param>
  417. /// <param name="parms">查询参数</param>
  418. /// <returns>返回结果集中的第一行第一列</returns>
  419. private static object ExecuteScalar(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  420. {
  421. SqlCommand command = new SqlCommand();
  422. PrepareCommand(command, connection, transaction, commandType, commandText, parms);
  423. object retval = command.ExecuteScalar();
  424. command.Parameters.Clear();
  425. return retval;
  426. }
  427. #endregion ExecuteScalar
  428. #region ExecuteDataReader
  429. /// <summary>
  430. /// 执行SQL语句,返回只读数据集
  431. /// </summary>
  432. /// <param name="connection">数据库连接</param>
  433. /// <param name="commandText">SQL语句</param>
  434. /// <param name="parms">查询参数</param>
  435. /// <returns>返回只读数据集</returns>
  436. private static SqlDataReader ExecuteDataReader(string connectionString, string commandText, params SqlParameter[] parms)
  437. {
  438. SqlConnection connection = new SqlConnection(connectionString);
  439. return ExecuteDataReader(connection, null, CommandType.Text, commandText, parms);
  440. }
  441. /// <summary>
  442. /// 执行SQL语句,返回只读数据集
  443. /// </summary>
  444. /// <param name="connection">数据库连接</param>
  445. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  446. /// <param name="commandText">SQL语句或存储过程名称</param>
  447. /// <param name="parms">查询参数</param>
  448. /// <returns>返回只读数据集</returns>
  449. private static SqlDataReader ExecuteDataReader(string connectionString, CommandType commandType, string commandText, params SqlParameter[] parms)
  450. {
  451. SqlConnection connection = new SqlConnection(connectionString);
  452. return ExecuteDataReader(connection, null, commandType, commandText, parms);
  453. }
  454. /// <summary>
  455. /// 执行SQL语句,返回只读数据集
  456. /// </summary>
  457. /// <param name="connection">数据库连接</param>
  458. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  459. /// <param name="commandText">SQL语句或存储过程名称</param>
  460. /// <param name="parms">查询参数</param>
  461. /// <returns>返回只读数据集</returns>
  462. private static SqlDataReader ExecuteDataReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] parms)
  463. {
  464. return ExecuteDataReader(connection, null, commandType, commandText, parms);
  465. }
  466. /// <summary>
  467. /// 执行SQL语句,返回只读数据集
  468. /// </summary>
  469. /// <param name="transaction">事务</param>
  470. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  471. /// <param name="commandText">SQL语句或存储过程名称</param>
  472. /// <param name="parms">查询参数</param>
  473. /// <returns>返回只读数据集</returns>
  474. private static SqlDataReader ExecuteDataReader(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  475. {
  476. return ExecuteDataReader(transaction.Connection, transaction, commandType, commandText, parms);
  477. }
  478. /// <summary>
  479. /// 执行SQL语句,返回只读数据集
  480. /// </summary>
  481. /// <param name="connection">数据库连接</param>
  482. /// <param name="transaction">事务</param>
  483. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  484. /// <param name="commandText">SQL语句或存储过程名称</param>
  485. /// <param name="parms">查询参数</param>
  486. /// <returns>返回只读数据集</returns>
  487. private static SqlDataReader ExecuteDataReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  488. {
  489. SqlCommand command = new SqlCommand();
  490. PrepareCommand(command, connection, transaction, commandType, commandText, parms);
  491. return command.ExecuteReader(CommandBehavior.CloseConnection);
  492. }
  493. #endregion
  494. #region ExecuteDataRow
  495. /// <summary>
  496. /// 执行SQL语句,返回结果集中的第一行
  497. /// </summary>
  498. /// <param name="connectionString">数据库连接字符串</param>
  499. /// <param name="commandText">SQL语句</param>
  500. /// <param name="parms">查询参数</param>
  501. /// <returns>,返回结果集中的第一行</returns>
  502. public static DataRow ExecuteDataRow(string connectionString, string commandText, params SqlParameter[] parms)
  503. {
  504. DataTable dt = ExecuteDataTable(connectionString, CommandType.Text, commandText, parms);
  505. return dt.Rows.Count > 0 ? dt.Rows[0] : null;
  506. }
  507. /// <summary>
  508. /// 执行SQL语句,返回结果集中的第一行
  509. /// </summary>
  510. /// <param name="connectionString">数据库连接字符串</param>
  511. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  512. /// <param name="commandText">SQL语句或存储过程名称</param>
  513. /// <param name="parms">查询参数</param>
  514. /// <returns>,返回结果集中的第一行</returns>
  515. public static DataRow ExecuteDataRow(string connectionString, CommandType commandType, string commandText, params SqlParameter[] parms)
  516. {
  517. DataTable dt = ExecuteDataTable(connectionString, commandType, commandText, parms);
  518. return dt.Rows.Count > 0 ? dt.Rows[0] : null;
  519. }
  520. /// <summary>
  521. /// 执行SQL语句,返回结果集中的第一行
  522. /// </summary>
  523. /// <param name="connection">数据库连接</param>
  524. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  525. /// <param name="commandText">SQL语句或存储过程名称</param>
  526. /// <param name="parms">查询参数</param>
  527. /// <returns>,返回结果集中的第一行</returns>
  528. public static DataRow ExecuteDataRow(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] parms)
  529. {
  530. DataTable dt = ExecuteDataTable(connection, commandType, commandText, parms);
  531. return dt.Rows.Count > 0 ? dt.Rows[0] : null;
  532. }
  533. /// <summary>
  534. /// 执行SQL语句,返回结果集中的第一行
  535. /// </summary>
  536. /// <param name="transaction">事务</param>
  537. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  538. /// <param name="commandText">SQL语句或存储过程名称</param>
  539. /// <param name="parms">查询参数</param>
  540. /// <returns>,返回结果集中的第一行</returns>
  541. public static DataRow ExecuteDataRow(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  542. {
  543. DataTable dt = ExecuteDataTable(transaction, commandType, commandText, parms);
  544. return dt.Rows.Count > 0 ? dt.Rows[0] : null;
  545. }
  546. #endregion ExecuteDataRow
  547. #region ExecuteDataTable
  548. /// <summary>
  549. /// 执行SQL语句,返回结果集中的第一个数据表
  550. /// </summary>
  551. /// <param name="connectionString">数据库连接字符串</param>
  552. /// <param name="commandText">SQL语句</param>
  553. /// <param name="parms">查询参数</param>
  554. /// <returns>返回结果集中的第一个数据表</returns>
  555. public static DataTable ExecuteDataTable(string connectionString, string commandText, params SqlParameter[] parms)
  556. {
  557. return ExecuteDataSet(connectionString, CommandType.Text, commandText, parms).Tables[0];
  558. }
  559. /// <summary>
  560. /// 执行SQL语句,返回结果集中的第一个数据表
  561. /// </summary>
  562. /// <param name="connectionString">数据库连接字符串</param>
  563. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  564. /// <param name="commandText">SQL语句或存储过程名称</param>
  565. /// <param name="parms">查询参数</param>
  566. /// <returns>返回结果集中的第一个数据表</returns>
  567. public static DataTable ExecuteDataTable(string connectionString, CommandType commandType, string commandText, params SqlParameter[] parms)
  568. {
  569. return ExecuteDataSet(connectionString, commandType, commandText, parms).Tables[0];
  570. }
  571. /// <summary>
  572. /// 执行SQL语句,返回结果集中的第一个数据表
  573. /// </summary>
  574. /// <param name="connection">数据库连接</param>
  575. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  576. /// <param name="commandText">SQL语句或存储过程名称</param>
  577. /// <param name="parms">查询参数</param>
  578. /// <returns>返回结果集中的第一个数据表</returns>
  579. public static DataTable ExecuteDataTable(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] parms)
  580. {
  581. return ExecuteDataSet(connection, commandType, commandText, parms).Tables[0];
  582. }
  583. /// <summary>
  584. /// 执行SQL语句,返回结果集中的第一个数据表
  585. /// </summary>
  586. /// <param name="transaction">事务</param>
  587. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  588. /// <param name="commandText">SQL语句或存储过程名称</param>
  589. /// <param name="parms">查询参数</param>
  590. /// <returns>返回结果集中的第一个数据表</returns>
  591. public static DataTable ExecuteDataTable(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  592. {
  593. return ExecuteDataSet(transaction, commandType, commandText, parms).Tables[0];
  594. }
  595. /// <summary>
  596. /// 获取空表结构
  597. /// </summary>
  598. /// <param name="connectionString">数据库连接字符串</param>
  599. /// <param name="tableName">数据表名称</param>
  600. /// <returns>返回结果集中的第一个数据表</returns>
  601. public static DataTable ExecuteEmptyDataTable(string connectionString, string tableName)
  602. {
  603. return ExecuteDataSet(connectionString, CommandType.Text, string.Format("select * from {0} where 1=-1", tableName)).Tables[0];
  604. }
  605. /// <summary>
  606. /// 执行SQL语句,返回结果集中的第一个数据表
  607. /// </summary>
  608. /// <param name="connectionString">数据库连接字符串</param>
  609. /// <param name="sql">SQL语句</param>
  610. /// <param name="order">排序SQL,如"ORDER BY ID DESC"</param>
  611. /// <param name="pageSize">每页记录数</param>
  612. /// <param name="pageIndex">页索引</param>
  613. /// <param name="parms">查询参数</param>
  614. /// <param name="query">查询SQL</param>
  615. /// <param name="cte">CTE表达式</param>
  616. /// <returns></returns>
  617. public static DataTable ExecutePageDataTable(string connectionString, string sql, string order, int pageSize, int pageIndex, SqlParameter[] parms = null, string query = null, string cte = null)
  618. {
  619. string psql = string.Format(@"
  620. {3}
  621. SELECT *
  622. FROM (
  623. SELECT ROW_NUMBER() OVER (ORDER BY {1}) RowNumber,*
  624. FROM (
  625. {0}
  626. ) t
  627. WHERE 1 = 1 {2}
  628. ) t
  629. WHERE RowNumber BETWEEN @RowNumber_Begin
  630. AND @RowNumber_End", sql, order, query, cte);
  631. List<SqlParameter> paramlist = new List<SqlParameter>()
  632. {
  633. new SqlParameter("@RowNumber_Begin", SqlDbType.Int){ Value = (pageIndex - 1) * pageSize + 1 },
  634. new SqlParameter("@RowNumber_End", SqlDbType.Int){ Value = pageIndex * pageSize }
  635. };
  636. if (parms != null) paramlist.AddRange(parms);
  637. return ExecuteDataTable(connectionString, psql, paramlist.ToArray());
  638. }
  639. #endregion ExecuteDataTable
  640. #region ExecuteDataSet
  641. /// <summary>
  642. /// 执行SQL语句,返回结果集
  643. /// </summary>
  644. /// <param name="connectionString">数据库连接字符串</param>
  645. /// <param name="commandText">SQL语句</param>
  646. /// <param name="parms">查询参数</param>
  647. /// <returns>返回结果集</returns>
  648. public static DataSet ExecuteDataSet(string connectionString, string commandText, params SqlParameter[] parms)
  649. {
  650. return ExecuteDataSet(connectionString, CommandType.Text, commandText, parms);
  651. }
  652. /// <summary>
  653. /// 执行SQL语句,返回结果集
  654. /// </summary>
  655. /// <param name="connectionString">数据库连接字符串</param>
  656. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  657. /// <param name="commandText">SQL语句或存储过程名称</param>
  658. /// <param name="parms">查询参数</param>
  659. /// <returns>返回结果集</returns>
  660. public static DataSet ExecuteDataSet(string connectionString, CommandType commandType, string commandText, params SqlParameter[] parms)
  661. {
  662. using (SqlConnection connection = new SqlConnection(connectionString))
  663. {
  664. return ExecuteDataSet(connection, commandType, commandText, parms);
  665. }
  666. }
  667. /// <summary>
  668. /// 执行SQL语句,返回结果集
  669. /// </summary>
  670. /// <param name="connection">数据库连接</param>
  671. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  672. /// <param name="commandText">SQL语句或存储过程名称</param>
  673. /// <param name="parms">查询参数</param>
  674. /// <returns>返回结果集</returns>
  675. public static DataSet ExecuteDataSet(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] parms)
  676. {
  677. return ExecuteDataSet(connection, null, commandType, commandText, parms);
  678. }
  679. /// <summary>
  680. /// 执行SQL语句,返回结果集
  681. /// </summary>
  682. /// <param name="transaction">事务</param>
  683. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  684. /// <param name="commandText">SQL语句或存储过程名称</param>
  685. /// <param name="parms">查询参数</param>
  686. /// <returns>返回结果集</returns>
  687. public static DataSet ExecuteDataSet(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  688. {
  689. return ExecuteDataSet(transaction.Connection, transaction, commandType, commandText, parms);
  690. }
  691. /// <summary>
  692. /// 执行SQL语句,返回结果集
  693. /// </summary>
  694. /// <param name="connection">数据库连接</param>
  695. /// <param name="transaction">事务</param>
  696. /// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
  697. /// <param name="commandText">SQL语句或存储过程名称</param>
  698. /// <param name="parms">查询参数</param>
  699. /// <returns>返回结果集</returns>
  700. private static DataSet ExecuteDataSet(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] parms)
  701. {
  702. SqlCommand command = new SqlCommand();
  703. PrepareCommand(command, connection, transaction, commandType, commandText, parms);
  704. SqlDataAdapter adapter = new SqlDataAdapter(command);
  705. DataSet ds = new DataSet();
  706. adapter.Fill(ds);
  707. if (commandText.IndexOf("@") > 0)
  708. {
  709. commandText = commandText.ToLower();
  710. int index = commandText.IndexOf("where ");
  711. if (index < 0)
  712. {
  713. index = commandText.IndexOf("\nwhere");
  714. }
  715. if (index > 0)
  716. {
  717. ds.ExtendedProperties.Add("SQL", commandText.Substring(0, index - 1)); //将获取的语句保存在表的一个附属数组里,方便更新时生成CommandBuilder
  718. }
  719. else
  720. {
  721. ds.ExtendedProperties.Add("SQL", commandText); //将获取的语句保存在表的一个附属数组里,方便更新时生成CommandBuilder
  722. }
  723. }
  724. else
  725. {
  726. ds.ExtendedProperties.Add("SQL", commandText); //将获取的语句保存在表的一个附属数组里,方便更新时生成CommandBuilder
  727. }
  728. foreach (DataTable dt in ds.Tables)
  729. {
  730. dt.ExtendedProperties.Add("SQL", ds.ExtendedProperties["SQL"]);
  731. }
  732. command.Parameters.Clear();
  733. return ds;
  734. }
  735. #endregion ExecuteDataSet
  736. #region 批量操作
  737. /// <summary>
  738. /// 大批量数据插入
  739. /// </summary>
  740. /// <param name="connectionString">数据库连接字符串</param>
  741. /// <param name="table">数据表</param>
  742. public static void BulkInsert(string connectionString, DataTable table)
  743. {
  744. if (string.IsNullOrEmpty(table.TableName)) throw new Exception("DataTable.TableName属性不能为空");
  745. using (SqlBulkCopy bulk = new SqlBulkCopy(connectionString))
  746. {
  747. bulk.BatchSize = BatchSize;
  748. bulk.BulkCopyTimeout = CommandTimeOut;
  749. bulk.DestinationTableName = table.TableName;
  750. foreach (DataColumn col in table.Columns)
  751. {
  752. bulk.ColumnMappings.Add(col.ColumnName, col.ColumnName);
  753. }
  754. bulk.WriteToServer(table);
  755. bulk.Close();
  756. }
  757. }
  758. /// <summary>
  759. /// 使用MySqlDataAdapter批量更新数据
  760. /// </summary>
  761. /// <param name="connectionString">数据库连接字符串</param>
  762. /// <param name="table">数据表</param>
  763. public static void BatchUpdate(string connectionString, DataTable table)
  764. {
  765. SqlConnection connection = new SqlConnection(connectionString);
  766. SqlCommand command = connection.CreateCommand();
  767. command.CommandTimeout = CommandTimeOut;
  768. command.CommandType = CommandType.Text;
  769. SqlDataAdapter adapter = new SqlDataAdapter(command);
  770. SqlCommandBuilder commandBulider = new SqlCommandBuilder(adapter);
  771. commandBulider.ConflictOption = ConflictOption.OverwriteChanges;
  772. SqlTransaction transaction = null;
  773. try
  774. {
  775. connection.Open();
  776. transaction = connection.BeginTransaction();
  777. //设置批量更新的每次处理条数
  778. adapter.UpdateBatchSize = BatchSize;
  779. //设置事物
  780. adapter.SelectCommand.Transaction = transaction;
  781. if (table.ExtendedProperties["SQL"] != null)
  782. {
  783. adapter.SelectCommand.CommandText = table.ExtendedProperties["SQL"].ToString();
  784. }
  785. adapter.Update(table);
  786. transaction.Commit();/////提交事务
  787. }
  788. catch (SqlException ex)
  789. {
  790. if (transaction != null) transaction.Rollback();
  791. throw ex;
  792. }
  793. finally
  794. {
  795. connection.Close();
  796. connection.Dispose();
  797. }
  798. }
  799. /// <summary>
  800. /// 分批次批量删除数据
  801. /// </summary>
  802. /// <param name="connectionString">数据库连接字符串</param>
  803. /// <param name="sql">SQL语句</param>
  804. /// <param name="batchSize">每批次更新记录行数</param>
  805. /// <param name="interval">批次执行间隔(秒)</param>
  806. public static void BatchDelete(string connectionString, string sql, int batchSize = 1000, int interval = 1)
  807. {
  808. sql = sql.ToLower();
  809. if (batchSize < 1000) batchSize = 1000;
  810. if (interval < 1) interval = 1;
  811. while (ExecuteScalar(connectionString, sql.Replace("delete", "select top 1 1")) != null)
  812. {
  813. ExecuteNonQuery(connectionString, CommandType.Text, sql.Replace("delete", string.Format("delete top ({0})", batchSize)));
  814. System.Threading.Thread.Sleep(interval * 1000);
  815. }
  816. }
  817. /// <summary>
  818. /// 分批次批量更新数据
  819. /// </summary>
  820. /// <param name="connectionString">数据库连接字符串</param>
  821. /// <param name="sql">SQL语句</param>
  822. /// <param name="batchSize">每批次更新记录行数</param>
  823. /// <param name="interval">批次执行间隔(秒)</param>
  824. public static void BatchUpdate(string connectionString, string sql, int batchSize = 1000, int interval = 1)
  825. {
  826. if (batchSize < 1000) batchSize = 1000;
  827. if (interval < 1) interval = 1;
  828. string existsSql = Regex.Replace(sql, @"[\w\s.=,']*from", "select top 1 1 from", RegexOptions.IgnoreCase);
  829. existsSql = Regex.Replace(existsSql, @"set[\w\s.=,']* where", "where", RegexOptions.IgnoreCase);
  830. existsSql = Regex.Replace(existsSql, @"update", "select top 1 1 from", RegexOptions.IgnoreCase);
  831. while (ExecuteScalar<int>(connectionString, existsSql) != 0)
  832. {
  833. ExecuteNonQuery(connectionString, CommandType.Text, Regex.Replace(sql, "update", string.Format("update top ({0})", batchSize), RegexOptions.IgnoreCase));
  834. System.Threading.Thread.Sleep(interval * 1000);
  835. }
  836. }
  837. #endregion 批量操作
  838. #endregion 静态方法
  839. }
  840. }
  841. SqlHelper.cs
 SqlHelperExtension.cs
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Collections.Generic;
using System.Threading;
using System.Text.RegularExpressions;
namespace Helpers
{
/// <summary>
/// SqlHelper扩展(依赖AutoMapper.dll)
/// </summary>
public sealed partial class SqlHelper
{
#region 实例方法
public T ExecuteObject<T>(string commandText, params SqlParameter[] parms)
{
return ExecuteObject<T>(this.ConnectionString, commandText, parms);
}
public List<T> ExecuteObjects<T>(string commandText, params SqlParameter[] parms)
{
return ExecuteObjects<T>(this.ConnectionString, commandText, parms);
}
#endregion
#region 静态方法
public static T ExecuteObject<T>(string connectionString, string commandText, params SqlParameter[] parms)
{
//DataTable dt = ExecuteDataTable(connectionString, commandText, parms);
//return AutoMapper.Mapper.DynamicMap<List<T>>(dt.CreateDataReader()).FirstOrDefault();
using (SqlDataReader reader = ExecuteDataReader(connectionString, commandText, parms))
{
return AutoMapper.Mapper.DynamicMap<List<T>>(reader).FirstOrDefault();
}
}
public static List<T> ExecuteObjects<T>(string connectionString, string commandText, params SqlParameter[] parms)
{
//DataTable dt = ExecuteDataTable(connectionString, commandText, parms);
//return AutoMapper.Mapper.DynamicMap<List<T>>(dt.CreateDataReader());
using (SqlDataReader reader = ExecuteDataReader(connectionString, commandText, parms))
{
return AutoMapper.Mapper.DynamicMap<List<T>>(reader);
}
}
#endregion
}
}
SqlHelperExtension.cs
 SqlHelperSchemaExtension.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace Helpers
{
public sealed partial class SqlHelper
{
#region Schema 数据库结构
/// <summary>
/// 执行指定数据库连接字符串的命令,返回服务器数据库名称数组
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <returns></returns>
public string[] GetDatabases(string connectionString)
{
string sql = "select name from sys.databases where name not in ('master','model','msdb','tempdb')";
DataTable dt = ExecuteDataTable(connectionString, sql);
return dt.Rows.Cast<DataRow>().Select(row => row["name"].ToString()).ToArray();
}
/// <summary>
/// 执行指定数据库连接字符串的命令,返回指定数据库的表信息
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="database"></param>
/// <returns></returns>
public List<DbTable> GetDbTables(string connectionString, string database)
{
#region SQL
string sql = string.Format(@"SELECT
obj.name tablename,
schem.name schemname,
idx.rows,
CAST
(
CASE
WHEN (SELECT COUNT(1) FROM sys.indexes WHERE object_id= obj.OBJECT_ID AND is_primary_key=1) >=1 THEN 1
ELSE 0
END
AS BIT) HasPrimaryKey
from {0}.sys.objects obj
inner join {0}.dbo.sysindexes idx on obj.object_id=idx.id and idx.indid<=1
INNER JOIN {0}.sys.schemas schem ON obj.schema_id=schem.schema_id
where type='U'
order by obj.name", database);
#endregion
DataTable dt = ExecuteDataTable(connectionString.Replace("master", database), sql);
return dt.Rows.Cast<DataRow>().Select(row => new DbTable
{
TableName = row.Field<string>("tablename"),
SchemaName = row.Field<string>("schemname"),
Rows = row.Field<int>("rows"),
HasPrimaryKey = row.Field<bool>("HasPrimaryKey")
}).ToList();
}
/// <summary>
/// 执行指定数据库连接字符串的命令,返回指定数据库、表的字段信息
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="database"></param>
/// <param name="tableName"></param>
/// <param name="schema"></param>
/// <returns></returns>
public List<DbColumn> GetDbColumns(string connectionString, string database, string tableName, string schema = "dbo")
{
#region SQL
string sql = string.Format(@"
WITH indexCTE AS
(
SELECT
ic.column_id,
ic.index_column_id,
ic.object_id
FROM {0}.sys.indexes idx
INNER JOIN {0}.sys.index_columns ic ON idx.index_id = ic.index_id AND idx.object_id = ic.object_id
WHERE idx.object_id =OBJECT_ID(@tableName) AND idx.is_primary_key=1
)
select
colm.column_id ColumnID,
CAST(CASE WHEN indexCTE.column_id IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey,
colm.name ColumnName,
systype.name ColumnType,
colm.is_identity IsIdentity,
colm.is_nullable IsNullable,
cast(colm.max_length as int) ByteLength,
(
case
when systype.name='nvarchar' and colm.max_length>0 then colm.max_length/2
when systype.name='nchar' and colm.max_length>0 then colm.max_length/2
when systype.name='ntext' and colm.max_length>0 then colm.max_length/2
else colm.max_length
end
) CharLength,
cast(colm.precision as int) Precision,
cast(colm.scale as int) Scale,
prop.value Remark
from {0}.sys.columns colm
inner join {0}.sys.types systype on colm.system_type_id=systype.system_type_id and colm.user_type_id=systype.user_type_id
left join {0}.sys.extended_properties prop on colm.object_id=prop.major_id and colm.column_id=prop.minor_id
LEFT JOIN indexCTE ON colm.column_id=indexCTE.column_id AND colm.object_id=indexCTE.object_id
where colm.object_id=OBJECT_ID(@tableName)
order by colm.column_id", database);
#endregion
SqlParameter param = new SqlParameter("@tableName", SqlDbType.NVarChar, 100) { Value = string.Format("{0}.{1}.{2}", database, schema, tableName) };
DataTable dt = ExecuteDataTable(connectionString, sql, param);
return dt.Rows.Cast<DataRow>().Select(row => new DbColumn()
{
ColumnID = row.Field<int>("ColumnID"),
IsPrimaryKey = row.Field<bool>("IsPrimaryKey"),
ColumnName = row.Field<string>("ColumnName"),
ColumnType = row.Field<string>("ColumnType"),
IsIdentity = row.Field<bool>("IsIdentity"),
IsNullable = row.Field<bool>("IsNullable"),
ByteLength = row.Field<int>("ByteLength"),
CharLength = row.Field<int>("CharLength"),
Scale = row.Field<int>("Scale"),
Remark = row["Remark"].ToString()
}).ToList();
}
/// <summary>
/// 执行指定数据库连接字符串的命令,返回指定数据库、表的索引信息
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="database"></param>
/// <param name="tableName"></param>
/// <param name="schema"></param>
/// <returns></returns>
public List<DbIndex> GetDbIndexs(string connectionString, string database, string tableName, string schema = "dbo")
{
#region SQL
string sql = string.Format(@"
select
idx.name IndexName
,idx.type_desc IndexType
,idx.is_primary_key IsPrimaryKey
,idx.is_unique IsUnique
,idx.is_unique_constraint IsUniqueConstraint
,STUFF(
(
SELECT ','+c.name from {0}.sys.index_columns ic
inner join {0}.sys.columns c on ic.column_id=c.column_id and ic.object_id=c.object_id
WHERE ic.is_included_column = 0 and ic.index_id=idx.index_id AND ic.object_id=idx.object_id
ORDER BY ic.key_ordinal
FOR XML PATH('')
),1,1,'') IndexColumns
,STUFF(
(
SELECT ','+c.name from {0}.sys.index_columns ic
inner join {0}.sys.columns c on ic.column_id=c.column_id and ic.object_id=c.object_id
WHERE ic.is_included_column = 1 and ic.index_id=idx.index_id AND ic.object_id=idx.object_id
ORDER BY ic.key_ordinal
FOR XML PATH('')
),1,1,'') IncludeColumns
from {0}.sys.indexes idx
where object_id =OBJECT_ID(@tableName)", database);
#endregion
SqlParameter param = new SqlParameter("@tableName", SqlDbType.NVarChar, 100) { Value = string.Format("{0}.{1}.{2}", database, schema, tableName) };
DataTable dt = ExecuteDataTable(connectionString, sql, param);
return dt.Rows.Cast<DataRow>().Select(row => new DbIndex()
{
IndexName = row.Field<string>("IndexName"),
IndexType = row.Field<string>("IndexType"),
IsPrimaryKey = row.Field<bool>("IsPrimaryKey"),
IsUnique = row.Field<bool>("IsUnique"),
IsUniqueConstraint = row.Field<bool>("IsUniqueConstraint"),
IndexColumns = row.Field<string>("IndexColumns"),
IncludeColumns = row.Field<string>("IncludeColumns")
}).ToList();
}
#endregion
}
/// <summary>
/// 表索引结构
/// </summary>
public sealed class DbIndex
{
/// <summary>
/// 索引名称
/// </summary>
public string IndexName { get; set; }
/// <summary>
/// 索引类型
/// </summary>
public string IndexType { get; set; }
/// <summary>
/// 是否为主键
/// </summary>
public bool IsPrimaryKey { get; set; }
/// <summary>
/// 是否唯一索引
/// </summary>
public bool IsUnique { get; set; }
/// <summary>
/// 是否唯一约束
/// </summary>
public bool IsUniqueConstraint { get; set; }
/// <summary>
/// 索引列
/// </summary>
public string IndexColumns { get; set; }
/// <summary>
/// 覆盖索引列
/// </summary>
public string IncludeColumns { get; set; }
}
/// <summary>
/// 表结构
/// </summary>
public sealed class DbTable
{
/// <summary>
/// 表名称
/// </summary>
public string TableName { get; set; }
/// <summary>
/// 表的架构
/// </summary>
public string SchemaName { get; set; }
/// <summary>
/// 表的记录数
/// </summary>
public int Rows { get; set; }
/// <summary>
/// 是否含有主键
/// </summary>
public bool HasPrimaryKey { get; set; }
}
/// <summary>
/// 表字段结构
/// </summary>
public sealed class DbColumn
{
/// <summary>
/// 字段ID
/// </summary>
public int ColumnID { get; set; }
/// <summary>
/// 是否主键
/// </summary>
public bool IsPrimaryKey { get; set; }
/// <summary>
/// 字段名称
/// </summary>
public string ColumnName { get; set; }
/// <summary>
/// 字段类型
/// </summary>
public string ColumnType { get; set; }
/// <summary>
/// 数据库类型对应的C#类型
/// </summary>
public string CSharpType
{
get
{
return SqlMap.MapCsharpType(ColumnType);
}
}
/// <summary>
///
/// </summary>
public Type CommonType
{
get
{
return SqlMap.MapCommonType(ColumnType);
}
}
/// <summary>
/// 字节长度
/// </summary>
public int ByteLength { get; set; }
/// <summary>
/// 字符长度
/// </summary>
public int CharLength { get; set; }
/// <summary>
/// 小数位
/// </summary>
public int Scale { get; set; }
/// <summary>
/// 是否自增列
/// </summary>
public bool IsIdentity { get; set; }
/// <summary>
/// 是否允许空
/// </summary>
public bool IsNullable { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Remark { get; set; }
}
public class SqlMap
{
public static string MapCsharpType(string dbtype)
{
if (string.IsNullOrEmpty(dbtype)) return dbtype;
dbtype = dbtype.ToLower();
string csharpType = "object";
switch (dbtype)
{
case "bigint": csharpType = "long"; break;
case "binary": csharpType = "byte[]"; break;
case "bit": csharpType = "bool"; break;
case "char": csharpType = "string"; break;
case "date": csharpType = "DateTime"; break;
case "datetime": csharpType = "DateTime"; break;
case "datetime2": csharpType = "DateTime"; break;
case "datetimeoffset": csharpType = "DateTimeOffset"; break;
case "decimal": csharpType = "decimal"; break;
case "float": csharpType = "double"; break;
case "image": csharpType = "byte[]"; break;
case "int": csharpType = "int"; break;
case "money": csharpType = "decimal"; break;
case "nchar": csharpType = "string"; break;
case "ntext": csharpType = "string"; break;
case "numeric": csharpType = "decimal"; break;
case "nvarchar": csharpType = "string"; break;
case "real": csharpType = "Single"; break;
case "smalldatetime": csharpType = "DateTime"; break;
case "smallint": csharpType = "short"; break;
case "smallmoney": csharpType = "decimal"; break;
case "sql_variant": csharpType = "object"; break;
case "sysname": csharpType = "object"; break;
case "text": csharpType = "string"; break;
case "time": csharpType = "TimeSpan"; break;
case "timestamp": csharpType = "byte[]"; break;
case "tinyint": csharpType = "byte"; break;
case "uniqueidentifier": csharpType = "Guid"; break;
case "varbinary": csharpType = "byte[]"; break;
case "varchar": csharpType = "string"; break;
case "xml": csharpType = "string"; break;
default: csharpType = "object"; break;
}
return csharpType;
}
public static Type MapCommonType(string dbtype)
{
if (string.IsNullOrEmpty(dbtype)) return Type.Missing.GetType();
dbtype = dbtype.ToLower();
Type commonType = typeof(object);
switch (dbtype)
{
case "bigint": commonType = typeof(long); break;
case "binary": commonType = typeof(byte[]); break;
case "bit": commonType = typeof(bool); break;
case "char": commonType = typeof(string); break;
case "date": commonType = typeof(DateTime); break;
case "datetime": commonType = typeof(DateTime); break;
case "datetime2": commonType = typeof(DateTime); break;
case "datetimeoffset": commonType = typeof(DateTimeOffset); break;
case "decimal": commonType = typeof(decimal); break;
case "float": commonType = typeof(double); break;
case "image": commonType = typeof(byte[]); break;
case "int": commonType = typeof(int); break;
case "money": commonType = typeof(decimal); break;
case "nchar": commonType = typeof(string); break;
case "ntext": commonType = typeof(string); break;
case "numeric": commonType = typeof(decimal); break;
case "nvarchar": commonType = typeof(string); break;
case "real": commonType = typeof(Single); break;
case "smalldatetime": commonType = typeof(DateTime); break;
case "smallint": commonType = typeof(short); break;
case "smallmoney": commonType = typeof(decimal); break;
case "sql_variant": commonType = typeof(object); break;
case "sysname": commonType = typeof(object); break;
case "text": commonType = typeof(string); break;
case "time": commonType = typeof(TimeSpan); break;
case "timestamp": commonType = typeof(byte[]); break;
case "tinyint": commonType = typeof(byte); break;
case "uniqueidentifier": commonType = typeof(Guid); break;
case "varbinary": commonType = typeof(byte[]); break;
case "varchar": commonType = typeof(string); break;
case "xml": commonType = typeof(string); break;
default: commonType = typeof(object); break;
}
return commonType;
}
}
}
SqlHelperSchemaExtension.cs
 MySqlHelper.cs
using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
namespace Helpers
{
/// <summary>
/// MySqlHelper操作类
/// </summary>
public sealed partial class MySqlHelper
{
/// <summary>
/// 批量操作每批次记录数
/// </summary>
public static int BatchSize = 2000;
/// <summary>
/// 超时时间
/// </summary>
public static int CommandTimeOut = 600;
/// <summary>
///初始化MySqlHelper实例
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
public MySqlHelper(string connectionString)
{
this.ConnectionString = connectionString;
}
/// <summary>
/// 数据库连接字符串
/// </summary>
public string ConnectionString { get; set; }
#region 实例方法
#region ExecuteNonQuery
/// <summary>
/// 执行SQL语句,返回影响的行数
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回影响的行数</returns>
public int ExecuteNonQuery(string commandText, params MySqlParameter[] parms)
{
return ExecuteNonQuery(ConnectionString, CommandType.Text, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回影响的行数
/// </summary>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回影响的行数</returns>
public int ExecuteNonQuery(CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteNonQuery(ConnectionString, commandType, commandText, parms);
}
#endregion ExecuteNonQuery
#region ExecuteScalar
/// <summary>
/// 执行SQL语句,返回结果集中的第一行第一列
/// </summary>
/// <typeparam name="T">返回对象类型</typeparam>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行第一列</returns>
public T ExecuteScalar<T>(string commandText, params MySqlParameter[] parms)
{
return ExecuteScalar<T>(ConnectionString, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行第一列
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行第一列</returns>
public object ExecuteScalar(string commandText, params MySqlParameter[] parms)
{
return ExecuteScalar(ConnectionString, CommandType.Text, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行第一列
/// </summary>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行第一列</returns>
public object ExecuteScalar(CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteScalar(ConnectionString, commandType, commandText, parms);
}
#endregion ExecuteScalar
#region ExecuteDataReader
/// <summary>
/// 执行SQL语句,返回只读数据集
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回只读数据集</returns>
private MySqlDataReader ExecuteDataReader(string commandText, params MySqlParameter[] parms)
{
return ExecuteDataReader(ConnectionString, CommandType.Text, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回只读数据集
/// </summary>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回只读数据集</returns>
private MySqlDataReader ExecuteDataReader(CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataReader(ConnectionString, commandType, commandText, parms);
}
#endregion
#region ExecuteDataRow
/// <summary>
/// 执行SQL语句,返回结果集中的第一行
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行</returns>
public DataRow ExecuteDataRow(string commandText, params MySqlParameter[] parms)
{
return ExecuteDataRow(ConnectionString, CommandType.Text, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行
/// </summary>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行</returns>
public DataRow ExecuteDataRow(CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataRow(ConnectionString, commandType, commandText, parms);
}
#endregion ExecuteDataRow
#region ExecuteDataTable
/// <summary>
/// 执行SQL语句,返回结果集中的第一个数据表
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一个数据表</returns>
public DataTable ExecuteDataTable(string commandText, params MySqlParameter[] parms)
{
return ExecuteDataTable(ConnectionString, CommandType.Text, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一个数据表
/// </summary>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一个数据表</returns>
public DataTable ExecuteDataTable(CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(ConnectionString, commandType, commandText, parms).Tables[0];
}
#endregion ExecuteDataTable
#region ExecuteDataSet
/// <summary>
/// 执行SQL语句,返回结果集
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集</returns>
public DataSet ExecuteDataSet(string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(ConnectionString, CommandType.Text, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集
/// </summary>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集</returns>
public DataSet ExecuteDataSet(CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(ConnectionString, commandType, commandText, parms);
}
#endregion ExecuteDataSet
#region 批量操作
/// <summary>
/// 使用MySqlDataAdapter批量更新数据
/// </summary>
/// <param name="table">数据表</param>
public void BatchUpdate(DataTable table)
{
BatchUpdate(ConnectionString, table);
}
/// <summary>
///大批量数据插入,返回成功插入行数
/// </summary>
/// <param name="table">数据表</param>
/// <returns>返回成功插入行数</returns>
public int BulkInsert(DataTable table)
{
return BulkInsert(ConnectionString, table);
}
#endregion 批量操作
#endregion 实例方法
#region 静态方法
private static void PrepareCommand(MySqlCommand command, MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, MySqlParameter[] parms)
{
if (connection.State != ConnectionState.Open) connection.Open();
command.Connection = connection;
command.CommandTimeout = CommandTimeOut;
// 设置命令文本(存储过程名或SQL语句)
command.CommandText = commandText;
// 分配事务
if (transaction != null)
{
command.Transaction = transaction;
}
// 设置命令类型.
command.CommandType = commandType;
if (parms != null && parms.Length > 0)
{
//预处理MySqlParameter参数数组,将为NULL的参数赋值为DBNull.Value;
foreach (MySqlParameter parameter in parms)
{
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
}
command.Parameters.AddRange(parms);
}
}
#region ExecuteNonQuery
/// <summary>
/// 执行SQL语句,返回影响的行数
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQuery(string connectionString, string commandText, params MySqlParameter[] parms)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
return ExecuteNonQuery(connection, CommandType.Text, commandText, parms);
}
}
/// <summary>
/// 执行SQL语句,返回影响的行数
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
return ExecuteNonQuery(connection, commandType, commandText, parms);
}
}
/// <summary>
/// 执行SQL语句,返回影响的行数
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQuery(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteNonQuery(connection, null, commandType, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回影响的行数
/// </summary>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回影响的行数</returns>
public static int ExecuteNonQuery(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteNonQuery(transaction.Connection, transaction, commandType, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回影响的行数
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回影响的行数</returns>
private static int ExecuteNonQuery(MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
MySqlCommand command = new MySqlCommand();
PrepareCommand(command, connection, transaction, commandType, commandText, parms);
int retval = command.ExecuteNonQuery();
command.Parameters.Clear();
return retval;
}
#endregion ExecuteNonQuery
#region ExecuteScalar
/// <summary>
/// 执行SQL语句,返回结果集中的第一行第一列
/// </summary>
/// <typeparam name="T">返回对象类型</typeparam>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static T ExecuteScalar<T>(string connectionString, string commandText, params MySqlParameter[] parms)
{
object result = ExecuteScalar(connectionString, commandText, parms);
if (result != null)
{
return (T)Convert.ChangeType(result, typeof(T)); ;
}
return default(T);
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行第一列
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(string connectionString, string commandText, params MySqlParameter[] parms)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
return ExecuteScalar(connection, CommandType.Text, commandText, parms);
}
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行第一列
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
return ExecuteScalar(connection, commandType, commandText, parms);
}
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行第一列
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteScalar(connection, null, commandType, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行第一列
/// </summary>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行第一列</returns>
public static object ExecuteScalar(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteScalar(transaction.Connection, transaction, commandType, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行第一列
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一行第一列</returns>
private static object ExecuteScalar(MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
MySqlCommand command = new MySqlCommand();
PrepareCommand(command, connection, transaction, commandType, commandText, parms);
object retval = command.ExecuteScalar();
command.Parameters.Clear();
return retval;
}
#endregion ExecuteScalar
#region ExecuteDataReader
/// <summary>
/// 执行SQL语句,返回只读数据集
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回只读数据集</returns>
private static MySqlDataReader ExecuteDataReader(string connectionString, string commandText, params MySqlParameter[] parms)
{
MySqlConnection connection = new MySqlConnection(connectionString);
return ExecuteDataReader(connection, null, CommandType.Text, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回只读数据集
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回只读数据集</returns>
private static MySqlDataReader ExecuteDataReader(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
MySqlConnection connection = new MySqlConnection(connectionString);
return ExecuteDataReader(connection, null, commandType, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回只读数据集
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回只读数据集</returns>
private static MySqlDataReader ExecuteDataReader(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataReader(connection, null, commandType, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回只读数据集
/// </summary>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回只读数据集</returns>
private static MySqlDataReader ExecuteDataReader(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataReader(transaction.Connection, transaction, commandType, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回只读数据集
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回只读数据集</returns>
private static MySqlDataReader ExecuteDataReader(MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
MySqlCommand command = new MySqlCommand();
PrepareCommand(command, connection, transaction, commandType, commandText, parms);
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
#endregion
#region ExecuteDataRow
/// <summary>
/// 执行SQL语句,返回结果集中的第一行
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>,返回结果集中的第一行</returns>
public static DataRow ExecuteDataRow(string connectionString, string commandText, params MySqlParameter[] parms)
{
DataTable dt = ExecuteDataTable(connectionString, CommandType.Text, commandText, parms);
return dt.Rows.Count > 0 ? dt.Rows[0] : null;
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>,返回结果集中的第一行</returns>
public static DataRow ExecuteDataRow(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
DataTable dt = ExecuteDataTable(connectionString, commandType, commandText, parms);
return dt.Rows.Count > 0 ? dt.Rows[0] : null;
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>,返回结果集中的第一行</returns>
public static DataRow ExecuteDataRow(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
DataTable dt = ExecuteDataTable(connection, commandType, commandText, parms);
return dt.Rows.Count > 0 ? dt.Rows[0] : null;
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一行
/// </summary>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>,返回结果集中的第一行</returns>
public static DataRow ExecuteDataRow(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
DataTable dt = ExecuteDataTable(transaction, commandType, commandText, parms);
return dt.Rows.Count > 0 ? dt.Rows[0] : null;
}
#endregion ExecuteDataRow
#region ExecuteDataTable
/// <summary>
/// 执行SQL语句,返回结果集中的第一个数据表
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一个数据表</returns>
public static DataTable ExecuteDataTable(string connectionString, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(connectionString, CommandType.Text, commandText, parms).Tables[0];
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一个数据表
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一个数据表</returns>
public static DataTable ExecuteDataTable(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(connectionString, commandType, commandText, parms).Tables[0];
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一个数据表
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一个数据表</returns>
public static DataTable ExecuteDataTable(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(connection, commandType, commandText, parms).Tables[0];
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一个数据表
/// </summary>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集中的第一个数据表</returns>
public static DataTable ExecuteDataTable(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(transaction, commandType, commandText, parms).Tables[0];
}
/// <summary>
/// 执行SQL语句,返回结果集中的第一个数据表
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="tableName">数据表名称</param>
/// <returns>返回结果集中的第一个数据表</returns>
public static DataTable ExecuteEmptyDataTable(string connectionString, string tableName)
{
return ExecuteDataSet(connectionString, CommandType.Text, string.Format("select * from {0} where 1=-1", tableName)).Tables[0];
}
#endregion ExecuteDataTable
#region ExecuteDataSet
/// <summary>
/// 执行SQL语句,返回结果集
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandText">SQL语句</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集</returns>
public static DataSet ExecuteDataSet(string connectionString, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(connectionString, CommandType.Text, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集</returns>
public static DataSet ExecuteDataSet(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
return ExecuteDataSet(connection, commandType, commandText, parms);
}
}
/// <summary>
/// 执行SQL语句,返回结果集
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集</returns>
public static DataSet ExecuteDataSet(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(connection, null, commandType, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集
/// </summary>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集</returns>
public static DataSet ExecuteDataSet(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
return ExecuteDataSet(transaction.Connection, transaction, commandType, commandText, parms);
}
/// <summary>
/// 执行SQL语句,返回结果集
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="transaction">事务</param>
/// <param name="commandType">命令类型(存储过程,命令文本, 其它.)</param>
/// <param name="commandText">SQL语句或存储过程名称</param>
/// <param name="parms">查询参数</param>
/// <returns>返回结果集</returns>
private static DataSet ExecuteDataSet(MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] parms)
{
MySqlCommand command = new MySqlCommand();
PrepareCommand(command, connection, transaction, commandType, commandText, parms);
MySqlDataAdapter adapter = new MySqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds);
if (commandText.IndexOf("@") > 0)
{
commandText = commandText.ToLower();
int index = commandText.IndexOf("where ");
if (index < 0)
{
index = commandText.IndexOf("\nwhere");
}
if (index > 0)
{
ds.ExtendedProperties.Add("SQL", commandText.Substring(0, index - 1)); //将获取的语句保存在表的一个附属数组里,方便更新时生成CommandBuilder
}
else
{
ds.ExtendedProperties.Add("SQL", commandText); //将获取的语句保存在表的一个附属数组里,方便更新时生成CommandBuilder
}
}
else
{
ds.ExtendedProperties.Add("SQL", commandText); //将获取的语句保存在表的一个附属数组里,方便更新时生成CommandBuilder
}
foreach (DataTable dt in ds.Tables)
{
dt.ExtendedProperties.Add("SQL", ds.ExtendedProperties["SQL"]);
}
command.Parameters.Clear();
return ds;
}
#endregion ExecuteDataSet
#region 批量操作
/// <summary>
///使用MySqlDataAdapter批量更新数据
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="table">数据表</param>
public static void BatchUpdate(string connectionString, DataTable table)
{
MySqlConnection connection = new MySqlConnection(connectionString);
MySqlCommand command = connection.CreateCommand();
command.CommandTimeout = CommandTimeOut;
command.CommandType = CommandType.Text;
MySqlDataAdapter adapter = new MySqlDataAdapter(command);
MySqlCommandBuilder commandBulider = new MySqlCommandBuilder(adapter);
commandBulider.ConflictOption = ConflictOption.OverwriteChanges;
MySqlTransaction transaction = null;
try
{
connection.Open();
transaction = connection.BeginTransaction();
//设置批量更新的每次处理条数
adapter.UpdateBatchSize = BatchSize;
//设置事物
adapter.SelectCommand.Transaction = transaction;
if (table.ExtendedProperties["SQL"] != null)
{
adapter.SelectCommand.CommandText = table.ExtendedProperties["SQL"].ToString();
}
adapter.Update(table);
transaction.Commit();/////提交事务
}
catch (MySqlException ex)
{
if (transaction != null) transaction.Rollback();
throw ex;
}
finally
{
connection.Close();
connection.Dispose();
}
}
/// <summary>
///大批量数据插入,返回成功插入行数
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="table">数据表</param>
/// <returns>返回成功插入行数</returns>
public static int BulkInsert(string connectionString, DataTable table)
{
if (string.IsNullOrEmpty(table.TableName)) throw new Exception("请给DataTable的TableName属性附上表名称");
if (table.Rows.Count == 0) return 0;
int insertCount = 0;
string tmpPath = Path.GetTempFileName();
string csv = DataTableToCsv(table);
File.WriteAllText(tmpPath, csv);
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
MySqlTransaction tran = null;
try
{
conn.Open();
tran = conn.BeginTransaction();
MySqlBulkLoader bulk = new MySqlBulkLoader(conn)
{
FieldTerminator = ",",
FieldQuotationCharacter = '"',
EscapeCharacter = '"',
LineTerminator = "\r\n",
FileName = tmpPath,
NumberOfLinesToSkip = 0,
TableName = table.TableName,
};
bulk.Columns.AddRange(table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList());
insertCount = bulk.Load();
tran.Commit();
}
catch (MySqlException ex)
{
if (tran != null) tran.Rollback();
throw ex;
}
}
File.Delete(tmpPath);
return insertCount;
}
/// <summary>
///将DataTable转换为标准的CSV
/// </summary>
/// <param name="table">数据表</param>
/// <returns>返回标准的CSV</returns>
private static string DataTableToCsv(DataTable table)
{
//以半角逗号(即,)作分隔符,列为空也要表达其存在。
//列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。
//列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。
StringBuilder sb = new StringBuilder();
DataColumn colum;
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < table.Columns.Count; i++)
{
colum = table.Columns[i];
if (i != 0) sb.Append(",");
if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))
{
sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");
}
else sb.Append(row[colum].ToString());
}
sb.AppendLine();
}
return sb.ToString();
}
#endregion 批量操作
#endregion 静态方法
}
}
MySqlHelper.cs
 MySqlHelperExtension.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using System.Data;
namespace Helpers
{
/// <summary>
/// MySqlHelper扩展(依赖AutoMapper.dll)
/// </summary>
public sealed partial class MySqlHelper
{
#region 实例方法
public T ExecuteObject<T>(string commandText, params MySqlParameter[] parms)
{
return ExecuteObject<T>(this.ConnectionString, commandText, parms);
}
public List<T> ExecuteObjects<T>(string commandText, params MySqlParameter[] parms)
{
return ExecuteObjects<T>(this.ConnectionString, commandText, parms);
}
#endregion
#region 静态方法
public static T ExecuteObject<T>(string connectionString, string commandText, params MySqlParameter[] parms)
{
//DataTable dt = ExecuteDataTable(connectionString, commandText, parms);
//return AutoMapper.Mapper.DynamicMap<List<T>>(dt.CreateDataReader()).FirstOrDefault();
using (MySqlDataReader reader = ExecuteDataReader(connectionString, commandText, parms))
{
return AutoMapper.Mapper.DynamicMap<List<T>>(reader).FirstOrDefault();
}
}
public static List<T> ExecuteObjects<T>(string connectionString, string commandText, params MySqlParameter[] parms)
{
//DataTable dt = ExecuteDataTable(connectionString, commandText, parms);
//return AutoMapper.Mapper.DynamicMap<List<T>>(dt.CreateDataReader());
using (MySqlDataReader reader = ExecuteDataReader(connectionString, commandText, parms))
{
return AutoMapper.Mapper.DynamicMap<List<T>>(reader);
}
}
#endregion
} }
MySqlHelperExtension.cs

最后附上文件源码及相关DLL:SQL.rar

注:此文章属懒惰的肥兔原创,版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接:http://www.cnblogs.com/lzrabbit/p/3287155.html

若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢。

如有问题,可以通过lzrabbit@126.com联系我。

 
分类: C#

自用类库整理之SqlHelper和MySqlHelper的更多相关文章

  1. [转]自用类库整理之SqlHelper和MySqlHelper

    本文转自:http://www.cnblogs.com/lzrabbit/p/3287155.html 自用的SQLHelper和MySqlHelper,除一些通用方法外,封装了一些很实用的批量操作方 ...

  2. iOS 常用三方类库整理

    iOS 常用三方类库整理 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地址:https://gi ...

  3. JS-JavaScript类库整理 [更新中...]

    老大.jQuery插件库 ——收集最全最新最好的jQuery插件 http://www.jq22.com/ 一.Moment.js ——JavaScript 日期处理类库 http://momentj ...

  4. 有关C,C++,C#, Java的图形图像处理类库 整理(未完待续)

    1.Java相关 1.1 Jzy3D Jzy3D 是一个Java的类库,用来绘制各种各样的三维图形,如下图所示: 下载地址:jzy3d-api,官网 1.2 Proscene 是一个用于创建交互式3D ...

  5. C#通用类库整理--字符串处理类

    在程序开发中通常需要将字符串转为自己想要的结果,以下三个类库主要实现: 1.GetStrArray(string str, char speater, bool toLower)  把字符串按照分隔符 ...

  6. C#通用类库整理--日志记录

    日志的记录是将程序过程中的一些行为数据记录下来,方便开发.运维迅速的找到问题的所在,节省时间.使用时在 站点的web.config 中的<appSettings></appSetti ...

  7. C#通用类库整理--序列化类

    程序员在编写应用程序的时候往往要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上 以实现通讯.这个将程序数据转化成能被存储并传输的格式的过程被称为"序列 ...

  8. java 与大数据学习较好的网站

    C# C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!https://www.cnblogs.com/doforfuture/p/6293926.html ...

  9. C# 基于MySQL的数据层基类(MySQLHelper)

    这里介绍下比较简单的方式,引用MySql.Data.dll然后添加一个MySqlHelper类来对MySql数据库进行访问和操作. 1.将MySql.Data.dll引用到你的项目中 下载地址:MyS ...

随机推荐

  1. HDU1325 Is It A Tree? 【并查集】

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  2. HDU 5068 Harry And Math Teacher

    主题链接~~> 做题情绪:的非常高深,有种高大上的感觉. 解题思路: 两层之间的联通能够看成是一个矩阵  代表上下两层都能够联通,,代表下层第1个门与上层第一个门不联通,以此类推联通就能够用矩阵 ...

  3. Swift入门教程:基本语法(一)

          简介:                                                                                       什么是S ...

  4. Oracle SqlPlus 方向键的方法和解决的退格键失效

    SqlPlus中退格键和方向键的设置 在刚装好的Oracle中,我们使用SqlPlus会发现很的蹩脚,不仅退格键不好用,方向键也不行调出history.以下有几种解决方法. 1.能够使用ctrl+Ba ...

  5. jQuery UI框架

    jQuery UI框架 1.oschina开源社区-jQuery教程 2.jQuery PrimeUI(推荐) 3.弹出框.警告框.提示框.拖动支持.位置固定.选项卡切换 4.Bootstrap框架( ...

  6. June本地环境搭建

    python-china.org论坛使用的June程序就是这货了,使用了Python Flask + SQLite + Node.js 的轻论坛,以后就打算拿这个学习了,如果可能,进行二次开发. Gi ...

  7. JJG 623-2005 电阻应变仪计量检定规程

    JJG 623-2005 电阻应变仪计量检定规程 点击下载 JJG533-2007标准模拟应变量校准器检定规程 点击下载 JJG 533-1988标准(里面含有一些更具体的电路图供参考)

  8. mysql查询字段值为数字

    原文:mysql查询字段值为数字 我想查询字段值为数字的sql如下:select * from tj_item_result where tj_value REGEXP '^[0-9]'

  9. 从Http它被连接到WebSocket

    1.HTTP协议长期-fi支持和各支持的浏览器 http://blog.csdn.net/fenglibing/article/details/7100222 2.WEBclient与服务端信息交互的 ...

  10. Visual Studio 2013发布Cloud Service至Azure China

    Visual Studio 2013发布Cloud Service至Azure China <Windows Azure Platform 系列文章目录> 之前有很多网友询问我如何通过VS ...