也学DBHelper
来源:互联网 发布:表单制作软件 编辑:程序博客网 时间:2024/05/18 00:59
SQLHelper、DBHelper是ADO.NET学习的必经之路,虽然以后更多的是由EF来帮我们写SQL语句。
下面是学的时候练习把常规版改造成的接口版。以后可以把ConnectionString放到数据库或Config中;并且现在在CreateConnection时还留有new MySqlConnection这个耦合,parameters为了减少耦合也绕了个弯用KVP来传递,感觉最好是用IOC改造一下,但以我目前的水平还没有思路。
class DBHelper//MySql版 { private static readonly string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; private static void AddKvpToCmd(IDbCommand cmd, params KeyValuePair<string, object>[] parameters) { foreach (KeyValuePair<string, object> kvp in parameters) { IDbDataParameter p = cmd.CreateParameter(); p.ParameterName = kvp.Key; p.Value = kvp.Value; cmd.Parameters.Add(p); } } public static IDbConnection CreateConnection(string connstr) { IDbConnection conn = new MySqlConnection(connstr); conn.Open(); return conn; } public static IDbConnection CreateConnection() { IDbConnection conn = new MySqlConnection(connstr); conn.Open(); return conn; } public static int ExecuteNonQuery(IDbConnection conn, string sql, params KeyValuePair<string, object>[] parameters) { using (IDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; AddKvpToCmd(cmd, parameters); return cmd.ExecuteNonQuery(); } } /// <summary> /// 在SQLServer中必须把BeginTransaction返回的对象赋值给SqlCommand的Transaction属性;MySQLServer中可以省略这步。 /// </summary> /// <param name="conn"></param> /// <param name="sql"></param> /// <param name="tx"></param> /// <param name="parameters"></param> /// <returns></returns> public static int ExecuteNonQuery(IDbConnection conn, string sql, IDbTransaction tx, params KeyValuePair<string, object>[] parameters) { using (IDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.Transaction = tx; AddKvpToCmd(cmd, parameters); return cmd.ExecuteNonQuery(); } } public static int ExecuteNonQuery(string sql, params KeyValuePair<string, object>[] parameters) { using (IDbConnection conn = CreateConnection()) { return ExecuteNonQuery(conn, sql, parameters); } } /// <summary> /// 在SQLServer中必须把BeginTransaction返回的对象赋值给SqlCommand的Transaction属性;MySQLServer中可以省略这步。 /// </summary> /// <param name="sql"></param> /// <param name="tx"></param> /// <param name="parameters"></param> /// <returns></returns> public static int ExecuteNonQuery(string sql, IDbTransaction tx, params KeyValuePair<string, object>[] parameters) { using (IDbConnection conn = CreateConnection()) { return ExecuteNonQuery(conn, sql, tx, parameters); } } public static object ExecuteScalar(IDbConnection conn, string sql, params KeyValuePair<string, object>[] parameters) { using (IDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; AddKvpToCmd(cmd, parameters); return cmd.ExecuteScalar(); } } /// <summary> /// 在SQLServer中必须把BeginTransaction返回的对象赋值给SqlCommand的Transaction属性;MySQLServer中可以省略这步。 /// </summary> /// <param name="conn"></param> /// <param name="sql"></param> /// <param name="tx"></param> /// <param name="parameters"></param> /// <returns></returns> public static object ExecuteScalar(IDbConnection conn, string sql, IDbTransaction tx, params KeyValuePair<string, object>[] parameters) { using (IDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.Transaction = tx; AddKvpToCmd(cmd, parameters); return cmd.ExecuteScalar(); } } public static object ExecuteScalar(string sql, params KeyValuePair<string, object>[] parameters) { using (IDbConnection conn = CreateConnection()) { return ExecuteScalar(conn, sql, parameters); } } /// <summary> /// 在SQLServer中必须把BeginTransaction返回的对象赋值给SqlCommand的Transaction属性;MySQLServer中可以省略这步。 /// </summary> /// <param name="sql"></param> /// <param name="tx"></param> /// <param name="parameters"></param> /// <returns></returns> public static object ExecuteScalar(string sql, IDbTransaction tx, params KeyValuePair<string, object>[] parameters) { using (IDbConnection conn = CreateConnection()) { return ExecuteScalar(conn, sql, tx, parameters); } } public static DataTable ExecuteQuery(IDbConnection conn, string sql, params KeyValuePair<string, object>[] parameters) { DataTable table = new DataTable(); using (IDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; AddKvpToCmd(cmd, parameters); using (IDataReader reader = cmd.ExecuteReader()) { table.Load(reader); } } return table; } public static DataTable ExecuteQuery(string sql, params KeyValuePair<string, object>[] parameters) { using (IDbConnection conn = CreateConnection()) { return ExecuteQuery(conn, sql, parameters); } } /// <summary> /// 批量插入数据 /// </summary> /// <param name="conn"></param> /// <param name="sql">Insert into... Values后面留空</param> /// <param name="paraValues">object[有几组][组内排列序号,必须与SQL语句中字段顺序一致]</param> /// <returns></returns> public static int BatchInsert(IDbConnection conn, string sql, object[][] paraValues) { StringBuilder placeholder = new StringBuilder('a'); StringBuilder sqlbuilder = new StringBuilder(sql); List<KeyValuePair<string, object>> kvplist = new List<KeyValuePair<string, object>>(); foreach (object[] group in paraValues) { sqlbuilder.Append('('); foreach (object p in group) { kvplist.Add(new KeyValuePair<string, object>(placeholder.ToString(), p)); sqlbuilder.Append('@').Append(placeholder.ToString()); if (p != group[group.Length - 1]) { sqlbuilder.Append(','); } AlphabetDecimalCarrier(placeholder); } sqlbuilder.Append(')'); if (group != paraValues[paraValues.Length - 1]) { sqlbuilder.Append(','); } } return ExecuteNonQuery(conn, sqlbuilder.ToString(), kvplist.ToArray()); } /// <summary> /// 谜之简短参数名生成方法 /// </summary> /// <param name="sb"></param> /// <returns></returns> public static StringBuilder AlphabetDecimalCarrier(StringBuilder sb) { int carry = sb.Length - 1; while (true) { if (sb[carry] == 'z') { sb[carry] = 'a'; if (carry == 0) { sb.Append('a'); return sb; } carry--; } else { sb[carry]++; return sb; } } } }
阅读全文
0 0
- 也学DBHelper
- DBHelper
- DBHelper
- DBHelper
- dbhelper
- DBHelper
- dbhelper
- DBHelper
- DBHelper
- DBHelper
- DBHelper
- DBHelper
- DBHelper
- DBHelper
- Dbhelper
- DBHelper
- DBHelper
- DBhelper
- 知乎上对SOA和微服务的一个比喻
- 171109 逆向-SWPU(re400)
- Maven工程出现错误: 程序包javax.net.ssl不存在的解决方法
- CSDN 没见过这么垃圾的文章系统了。 花费了4天,搜遍了百度、谷歌、yandex 都很难处理掉的问题,截止今天解决了linux(centos7、6.5)版本下redis4.0.2报错:(error)
- Java编程思想第四版第七章练习
- 也学DBHelper
- HTML基础入门(一)
- 平均数
- How to choose cross-entropy loss in tensorflow?
- 自己写的第一段感觉有点小麻烦的代码!但全程自己写hhhh开心
- Android View 触摸事件传递
- POJ 3468-线段数区间更新
- 越来越傻x的CSDN
- 文章标题