简单封装DBHelper

面向对象三大特性:封装,继承,多态。

从刚开始学习编码直到现在,虽然这些特性天天在用,但是感觉自己理解的还是很浅,DBHelper一般大家都应该是写一个dll去调用

最终的运行结果为:

遇见的问题:

(1).代码冗余(或多或少还是有冗余的部分代码).

(2).连接字符串问题(代码中注释部分).

表结构:

create table t
(
    v varchar(max) null
)

DBHelper:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data;
namespace DataBase
{
    /// <summary>
    /// DBHelper
    /// </summary>
    public class Mssql
    {
        /// <summary>
        /// 在这里,怎么才可以把这个dll直接发给别人让别人直接去调用而不再需要知道连接字符串的名字
        /// </summary>
        private static readonly String conStr = ConfigurationManager.ConnectionStrings["mssql"].ConnectionString;
        private DbConnection GetCon()
        {
            return new SqlConnection(conStr);
        }
        private SqlConnection Connection()
        {
            return new SqlConnection(conStr);
        }
        /// <summary>
        /// 执行SQL(Insert,Delete,Update)
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="pms"></param>
        /// <returns></returns>
        public Int32 ExecNonQuery(String sql, params DbParameter[] pms)
        {
            Int32 r;
            SqlConnection con = Connection();
            using (DbCommand cmd = new SqlCommand(sql, con))
            {
                if (null != pms)
                {
                    cmd.Parameters.AddRange(pms);
                }
                con.Open();
                r = cmd.ExecuteNonQuery();
                con.Close();
                con.Dispose();
            }
            return r;
        }
        /// <summary>
        /// 查询语句(独占一个连接)
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="pms"></param>
        /// <returns></returns>
        public SqlDataReader ExecReader(String sql, params DbParameter[] pms)
        {
            SqlConnection con = Connection();
            using (DbCommand cmd = new SqlCommand(sql, con))
            {
                if (null != pms)
                {
                    cmd.Parameters.AddRange(pms);
                }
                con.Open();
                return cmd.ExecuteReader(CommandBehavior.CloseConnection) as SqlDataReader;
            }
        }
        /// <summary>
        /// 断开式
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="pms"></param>
        /// <returns></returns>
        public DataTable ExecTable(String sql, params DbParameter[] pms)
        {
            DataTable dt;
            SqlConnection con = Connection();
            using (SqlDataAdapter sda = new SqlDataAdapter(sql, con))
            {
                if (null != pms)
                {
                    sda.SelectCommand.Parameters.AddRange(pms);
                }
                dt = new DataTable();
                sda.Fill(dt);
                con.Close();
                con.Dispose();
            }
            return dt;
        }
        /// <summary>
        /// 返回首行首列
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="pms"></param>
        /// <returns></returns>
        public Object ExecScalar(String sql, params DbParameter[] pms)
        {
            Object obj;
            SqlConnection con = Connection();
            using (DbCommand cmd = new SqlCommand(sql, con))
            {
                if (null != pms)
                {
                    cmd.Parameters.AddRange(pms);
                }
                con.Open();
                obj = cmd.ExecuteScalar();
                con.Close();
                con.Dispose();
            }
            return obj;
        }
        public DataSet ExecDataSet(String sql, params DbParameter[] pms)
        {
            DataSet ds;
            SqlConnection con = Connection();
            using (SqlDataAdapter sda = new SqlDataAdapter(sql, con))
            {
                if (null != pms)
                {
                    sda.SelectCommand.Parameters.AddRange(pms);
                }
                con.Open();
                ds = new DataSet();
                sda.Fill(ds);
                con.Close();
                con.Dispose();
            }
            return ds;
        }
        private DataTable ExecTable(string procName, CommandType type, params DbParameter[] pms)
        {
            DataTable dt;
            SqlConnection con = Connection();
            using (SqlDataAdapter sda = new SqlDataAdapter(procName, con))
            {
                if (null != pms)
                {
                    sda.SelectCommand.Parameters.AddRange(pms);
                }
                sda.SelectCommand.CommandType = type;
                dt = new DataTable();
                sda.Fill(dt);
                con.Open();
                con.Close();
                con.Dispose();
            }
            return dt;
        }
        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="procName"></param>
        /// <param name="pms"></param>
        /// <returns></returns>
        public DataTable ExecProc(String procName, params DbParameter[] pms)
        {
            return ExecTable(procName, CommandType.StoredProcedure, pms);
        }
    }
}

主程序:

using DataBase;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
namespace TestDll
{
    /// <summary>
    /// Main
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            String result = String.Empty;
            Mssql db = new Mssql();
            #region 新增
            String sql = "insert into t values(@args)";
            Int32 r = db.ExecNonQuery(sql, new SqlParameter("@args", "大声说出:我爱贺晓冬"));
            if (r > 0)
            {
                result = "数据插入成功,[恭喜你成功爱上贺晓冬],";
            }
            sql = "select * from t";
            #endregion
            #region 查询
            SqlDataReader reader = db.ExecReader(sql);
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    result += "读取到的数据为:" + reader.GetString(0);
                }
            }
            Console.WriteLine(result);
            #endregion
            #region 存储过程
            String procName = "usp_t";
            DataTable dt = db.ExecProc(procName);
            #endregion
            Console.ReadKey();
        }
    }
}
时间: 2024-08-08 12:11:11

简单封装DBHelper的相关文章

简单封装sqlite3 实现实体对象与关系型数据库的相关操作【IOS】

源码如下,只有一个类文件 // //  DBHelper.h // //  Created by Jason_Msbaby on 15/10/15. //  Copyright ? 2015年 张杰. All rights reserved. // /**  *  简单封装了对于sqlite的使用 没有加入对事务及其他复杂的特性     基于传入sql语句的方式进行执行     使用单例模式     根据model对象自动创建表 只支持 NSInter NSString float 数据类型的支

JDBC简单封装

/** * JDBC简单封装 * 需要借助FastJsonUtil可以参考上一篇 * @author huangxincheng * */ public class BaseDao { private static String URL; private static String USERNAME; private static String PASSWORD; private static String DRIVER; private  Connection connection; priv

对系统网络请求进行简单封装

AGConnectionNet对系统网络请求进行简单封装,可便利的进行网络请求,并将数据解析与网络请求封装在同一方法下,使用更加便利(JSON 解析采用自身解析方法, XML 解析采用第三方 ReadXML 进行解析). 方法具体参数说明 初始化方法:/*** 类方法,实例化当前数据请求对象 (单例)** @return 当前请求对象*/+ (instancetype)shareRequestData; 仅进行请求数据方法/*** 请求数据 (session 请求)** @param URLSt

iOS sqlite 增删改查 简单封装(基于 FMDB)

/** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整体进行操作 * *  根据 model 对象自动建表,字段类型只支持 NSString , NSIteger , float * *  用到 runtime 运行时获取 model 属性 * */ 1 // 2 // AGDatabaseManager.h 3 // 4 // Created by

httpclient4.3简单封装

对httpclient4.3版本的一个简单封装,下面是代码 /**  * httputil工具类  *   * @author rex  */ public class HttpUtil {     private static CloseableHttpClient client;     private static BasicCookieStore cookieStore;     private static HttpGet get;     private static HttpPos

MySQL的C++简单封装

/* *介绍:MySQL的简单封装,支持流操作输入输出MySQL语句,然而并没有什么软用,大二学生自娱自乐,有不足求指点 *作者:MrEO *日期:2016.3.26 */ 头文件 my_sql.h 1 #ifndef MY_SQL_H 2 #define MY_SQL_H 3 4 #include <mysql.h> 5 #include <iostream> 6 #include <string> 7 #include <iomanip> 8 9 cla

Android ToolBar 的简单封装

使用过 ToolBar 的朋友肯定对其使用方法不陌生,因为其用法很简单,如果对 ActionBar 使用比较熟练的人来说,ToolBar 就更容易了!不过,相信大家在使用的过程中都遇到过这样一个问题,需要在每一个我们要使用的 xml 中添加 ToolBar 这个控件,比如我需要在 MainActivity中使用 ToolBar,则他的 xml 文件需要这样写, <RelativeLayout xmlns:android="http://schemas.android.com/apk/res

简单封装MessageBox提示对话框

namespace DMS.Common { public class MsgHelper { public static DialogResult ShowErrorMsgBox(string error) { return MessageBox.Show(error, "错误", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } public static DialogResult ShowInformationMsgBox(str

解析xml几个方法的简单封装

import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; /** * * @author D_xiao * */ public class AnalysisXmlByDom { /** * 功能 :通过dom的方法解析