C#如何实现SQL封装
发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,这篇文章给大家分享的是有关C#如何实现SQL封装的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SQLHelper.as , 代码如下:using System;using
千家信息网最后更新 2025年01月25日C#如何实现SQL封装
这篇文章给大家分享的是有关C#如何实现SQL封装的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
SQLHelper.as , 代码如下:
using System;using System.Collections;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Data.SqlClient;using System.Linq;using System.Web;namespace DBDome{ /// 此类为抽象类, /// 不允许实例化,在应用时直接调用即可 /// public sealed class SqlHelper { private SqlHelper() { } ////// 数据库连接字符串 /// public static readonly string connectionString = ConfigurationManager.ConnectionStrings["con"].ToString(); // Hashtable to store cached parameters private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); #region//ExecteNonQuery方法 //////执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。 /// 使用参数数组形式提供参数列表 /// /// 一个有效的数据库连接字符串 /// SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个数值表示此SqlCommand命令执行后影响的行数 public static int ExecteNonQuery(string connectionString, CommandType cmdType, string cmdText, SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); using (SqlConnection conn = new SqlConnection(connectionString)) { //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); int val = cmd.ExecuteNonQuery(); //清空SqlCommand中的参数列表 cmd.Parameters.Clear(); return val; } } //////执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。 /// 使用参数数组形式提供参数列表 /// /// SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个数值表示此SqlCommand命令执行后影响的行数 public static int ExecteNonQuery(CommandType cmdType, string cmdText, SqlParameter[] commandParameters) { return ExecteNonQuery(connectionString, cmdType, cmdText, commandParameters); } //////存储过程专用 /// /// 存储过程的名字 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个数值表示此SqlCommand命令执行后影响的行数 public static int ExecteNonQueryProducts(string cmdText, SqlParameter[] commandParameters) { return ExecteNonQuery(CommandType.StoredProcedure, cmdText, commandParameters); } //////Sql语句专用 /// /// T_Sql语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个数值表示此SqlCommand命令执行后影响的行数 public static int ExecteNonQueryText(string cmdText, SqlParameter[] commandParameters) { return ExecteNonQuery(CommandType.Text, cmdText, commandParameters); } #endregion #region//GetTable方法 ////// 执行一条返回结果集的SqlCommand,通过一个已经存在的数据库连接 /// 使用参数数组提供参数 /// /// 一个现有的数据库连接 /// SqlCommand命令类型 /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个表集合(DataTableCollection)表示查询得到的数据集 public static DataTableCollection GetTable(string connecttionString, CommandType cmdTye, string cmdText, SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); DataSet ds = new DataSet(); using (SqlConnection conn = new SqlConnection(connecttionString)) { PrepareCommand(cmd, conn, null, cmdTye, cmdText, commandParameters); SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = cmd; adapter.Fill(ds); } DataTableCollection table = ds.Tables; return table; } ////// 执行一条返回结果集的SqlCommand,通过一个已经存在的数据库连接 /// 使用参数数组提供参数 /// /// SqlCommand命令类型 /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个表集合(DataTableCollection)表示查询得到的数据集 public static DataTableCollection GetTable(CommandType cmdTye, string cmdText, SqlParameter[] commandParameters) { return GetTable(cmdTye, cmdText, commandParameters); } ////// 存储过程专用 /// /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个表集合(DataTableCollection)表示查询得到的数据集 public static DataTableCollection GetTableProducts(string cmdText, SqlParameter[] commandParameters) { return GetTable(CommandType.StoredProcedure, cmdText, commandParameters); } ////// Sql语句专用 /// /// T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个表集合(DataTableCollection)表示查询得到的数据集 public static DataTableCollection GetTableText(string cmdText, SqlParameter[] commandParameters) { return GetTable(CommandType.Text, cmdText, commandParameters); } #endregion ////// 为执行命令准备参数 /// /// SqlCommand 命令 /// 已经存在的数据库连接 /// 数据库事物处理 /// SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /// Command text,T-SQL语句 例如 Select * from Products /// 返回带参数的命令 private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) { //判断数据库连接状态 if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; //判断是否需要事物处理 if (trans != null) cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms != null) { foreach (SqlParameter parm in cmdParms) cmd.Parameters.Add(parm); } } ////// Execute a SqlCommand that returns a resultset against the database specified in the connection string /// using the provided parameters. /// /// 一个有效的数据库连接字符串 /// SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///A SqlDataReader containing the results public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(connectionString); // we use a try/catch here because if the method throws an exception we want to // close the connection throw code, because no datareader will exist, hence the // commandBehaviour.CloseConnection will not work try { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return rdr; } catch { conn.Close(); throw; } } #region//ExecuteDataSet方法 ////// return a dataset /// /// 一个有效的数据库连接字符串 /// SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///return a dataset public static DataSet ExecuteDataSet(string connectionString, CommandType cmdType, string cmdText, SqlParameter[] commandParameters) { SqlConnection conn = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand(); try { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); SqlDataAdapter da = new SqlDataAdapter(); DataSet ds = new DataSet(); da.SelectCommand = cmd; da.Fill(ds); return ds; } catch { conn.Close(); throw; } } ////// 返回一个DataSet /// /// SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///return a dataset public static DataSet ExecuteDataSet(CommandType cmdType, string cmdText, SqlParameter[] commandParameters) { return ExecuteDataSet(connectionString, cmdType, cmdText, commandParameters); } ////// 返回一个DataSet /// /// 存储过程的名字 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///return a dataset public static DataSet ExecuteDataSetProducts(string cmdText, SqlParameter[] commandParameters) { return ExecuteDataSet(connectionString, CommandType.StoredProcedure, cmdText, commandParameters); } ////// 返回一个DataSet /// /// T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///return a dataset public static DataSet ExecuteDataSetText(string cmdText, SqlParameter[] commandParameters) { return ExecuteDataSet(connectionString, CommandType.Text, cmdText, commandParameters); } public static DataView ExecuteDataSet(string connectionString, string sortExpression, string direction, CommandType cmdType, string cmdText, SqlParameter[] commandParameters) { SqlConnection conn = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand(); try { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); SqlDataAdapter da = new SqlDataAdapter(); DataSet ds = new DataSet(); da.SelectCommand = cmd; da.Fill(ds); DataView dv = ds.Tables[0].DefaultView; dv.Sort = sortExpression + " " + direction; return dv; } catch { conn.Close(); throw; } } #endregion #region // ExecuteScalar方法 ////// 返回第一行的第一列 /// /// SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个对象 public static object ExecuteScalar(CommandType cmdType, string cmdText, SqlParameter[] commandParameters) { return ExecuteScalar(SqlHelper.connectionString, cmdType, cmdText, commandParameters); } ////// 返回第一行的第一列存储过程专用 /// /// 存储过程的名字 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个对象 public static object ExecuteScalarProducts(string cmdText, SqlParameter[] commandParameters) { return ExecuteScalar(SqlHelper.connectionString, CommandType.StoredProcedure, cmdText, commandParameters); } ////// 返回第一行的第一列Sql语句专用 /// /// 者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///返回一个对象 public static object ExecuteScalarText(string cmdText, SqlParameter[] commandParameters) { return ExecuteScalar(SqlHelper.connectionString, CommandType.Text, cmdText, commandParameters); } ////// Execute a SqlCommand that returns the first column of the first record against the database specified in the connection string /// using the provided parameters. /// ////// e.g.: /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///An object that should be converted to the expected type using Convert.To{Type} public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); using (SqlConnection connection = new SqlConnection(connectionString)) { PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); object val = cmd.ExecuteScalar(); cmd.Parameters.Clear(); return val; } } ////// Execute a SqlCommand that returns the first column of the first record against an existing database connection /// using the provided parameters. /// ////// e.g.: /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /// 存储过程的名字或者 T-SQL 语句 /// 以数组形式提供SqlCommand命令中用到的参数列表 ///An object that should be converted to the expected type using Convert.To{Type} public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); object val = cmd.ExecuteScalar(); cmd.Parameters.Clear(); return val; } #endregion ////// add parameter array to the cache /// /// Key to the parameter cache /// an array of SqlParamters to be cached public static void CacheParameters(string cacheKey, SqlParameter[] commandParameters) { parmCache[cacheKey] = commandParameters; } ////// Retrieve cached parameters /// /// key used to lookup parameters ///Cached SqlParamters array public static SqlParameter[] GetCachedParameters(string cacheKey) { SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey]; if (cachedParms == null) return null; SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length]; for (int i = 0, j = cachedParms.Length; i < j; i++) clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone(); return clonedParms; } ////// 检查是否存在 /// /// Sql语句 ///bool结果 public static bool Exists(string strSql) { int cmdresult = Convert.ToInt32(ExecuteScalar(connectionString, CommandType.Text, strSql, null)); if (cmdresult == 0) { return false; } else { return true; } } ////// 检查是否存在 /// /// Sql语句 /// 参数 ///bool结果 public static bool Exists(string strSql, SqlParameter[] cmdParms) { int cmdresult = Convert.ToInt32(ExecuteScalar(connectionString, CommandType.Text, strSql, cmdParms)); if (cmdresult == 0) { return false; } else { return true; } } }}
本篇博客只涉及到添加数据 (insert into) 并陆续的更新其他SQL操作, 本人希望封装一个全套基本的SQL操作。在以后如果从事后端可以在此扩展 , 不喜勿喷。
本人希望用SqlParameter的方式来构建T-SQL
一 : 构建基本的T-SQL( 没有SqlParameter参数注入 )
using DBDome.model;using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Text;namespace DBDome.com{ ////// SQL构建器(还没与赋值) /// public sealed class SQL_Structure { private SQL_Structure() { } ////// 添加一个数据的T-SQL的构成 /// ////// /// public static string ADD_T_SQL ( T model ) where T : BaseModel { string base_add = @"insert into [{0}] ({1}) values ({2})";//表名 , 列明 , 对应的值 Type model_type = model.GetType(); string[] arr = model_type.Name.Split(new char[] { '.' }); string table_name = arr[arr.Length - 1];//获得表的名称 PropertyInfo[] p_intos = model_type.GetProperties(); StringBuilder table_field_name = new StringBuilder(); StringBuilder table_field_value = new StringBuilder(); PropertyInfo item = null; for (int i = 0; i < p_intos.Length; i++) { item = p_intos[i]; if (item.Name != "id")//不应添加主键 { table_field_name.Append(item.Name + ","); table_field_value.Append("@" + item.Name + ","); } } return String.Format(base_add, table_name, table_field_name.ToString().Substring(0, table_field_name.ToString().Length-1), table_field_value.ToString().Substring(0,table_field_value.ToString().Length-1)); } }}
二 : 好了我现在构造与SQL表映射的模型类
①,所有model的基类:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DBDome.model{ public abstract class BaseModel { protected int _id; ////// 主键ID号 /// public virtual int id { get { return this._id; } set { this._id = value; } } }}
② , 继承model的一个类User也是我的一个SQL表名
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DBDome.model{ public sealed class User : BaseModel { public string name { get; set; } public short sex{ get; set; } public int lv{ get; set; } public string username{ get; set; } public string userpwd{ get; set; } }}
三 , 我们添加一条数据 , 需要构建参数 SqlParameter[]
using DBDome.model;using System;using System.Collections.Generic;using System.Data.SqlClient;using System.Linq;using System.Reflection;using System.Text;using System.Data;namespace DBDome.com{ ////// SqlParameter 构建 /// public sealed class SqlParameter_Structure { private SqlParameter_Structure() { } ////// 构建T-SQL参数 ADD /// ////// /// public static SqlParameter[] ADD_T_SQL (T model) where T : BaseModel { Type model_type = model.GetType(); PropertyInfo[] p_intos = model_type.GetProperties(); SqlParameter[] sql_param = new SqlParameter[p_intos.Length - 1];//不需要主键 PropertyInfo item = null; string p_name = ""; SqlParameter cell = null; int j = 0; for (int i = 0; i < p_intos.Length; i++) { item = p_intos[i]; p_name = item.Name; if (p_name == "id") continue; // Console.WriteLine("字段 {0} 的类型为 {1} ", p_name ,item.PropertyType); cell = new SqlParameter(p_name, SqlParameter_Structure.Get_SqlDbType_SqlType(item.PropertyType)); cell.Value = item.GetValue(model, null); sql_param[j] = cell; j++; } return sql_param; } private static SqlDbType Get_SqlDbType_SqlType(Type cshaper) { string[] arr = cshaper.ToString().Split(new char[] { '.' }); string toLow = arr[arr.Length - 1].ToLower(); switch (toLow) { case "string": return SqlDbType.NVarChar; break; case "int16": return SqlDbType.Bit; break; case "int32": return SqlDbType.Int; break; default: throw new Exception(String.Format("T-SQL参数没有配对的类型 {0}" ,cshaper)); break; } } }}
感谢各位的阅读!关于"C#如何实现SQL封装"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
命令
参数
语句
过程
存储
数组
形式
数据
中用
名字
类型
数据库
字符
字符串
专用
有效
方法
后影
数值
结果
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网站运维服务器安全管理
安全日志服务器多少钱一台
虚拟服务器连接游戏id
企业邮箱的收件服务器
苏州梯田网络技术公司
网站远程数据库
网络营销软件开发商家服务电话
石门软件开发中职学校
问道私服服务器怎么破解
私人软件开发电话
计算机网络技术的宣传标语
新乡优动网络技术有线公司
为网络安全提供安全基石
龙源数据库论文怎么查
佐都IP广播服务器
上海全速网络技术
net core 数据库开发
中国最好的网络技术学校
中国互联网科技公司是哪家
toad 如何添加数据库
vps服务器硬件配置
网络安全周回顾
软件开发的流程顺序
软件开发方法的基本要点
局网络安全讲座主持词
服务器增加内存识别不了
大数据商务软件开发是干什么的
亚马逊云服务器的好处
网络技术大佬
用自己电脑服务器需要多少钱