千家信息网

C#如何实现SQL封装

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章给大家分享的是有关C#如何实现SQL封装的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SQLHelper.as , 代码如下:using System;using
千家信息网最后更新 2025年11月08日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安全错误 数据库的锁怎样保障安全 在线监测系统软件开发项目 软件开发的知识产品归属 怎么给数据库添加注释名称 杭州智学互联网科技有限公司 mc群雄争霸服务器 db2怎么恢复数据库 云服务器虚拟网卡模型 大数据软件开发价钱是多少 dz数据库目录 linuex服务器管理面板 永宁县卫生健康信息平台网络安全等级保护 如何爬出期刊数据库文献 美团saas软件开发薪资 成都软件开发app过程 看门狗2联邦调查局塔上的服务器 戴尔服务器新插入硬盘做raid 前沿网络技术的探究 宿州企业软件开发公司 密云区正规网络技术售后服务 服务器怎么关机 软件开发 雷达 关系型数据库 nosql 网络安全审查办法的法律依据 游戏手机软件开发培训学校 客户端和服务器间安全传输 软件开发人员自我工作鉴定 附加数据库失败0 优股宝北京网络技术有限公司 我的世界被删之后如何复原服务器 租户数据库隔离
0