C#实现较为实用的SQLhelper

第一次写博客,想不到写什么好b( ̄▽ ̄)d ,考虑的半天决定从sqlhelper开始,sqlhelper对程序员来说就像helloworld一样,很简单却又很重要,helloworld代表着程序员萌新第一次写代码,而sqlhelper则是初次接触数据库(不知道这种说法对不对)。

好了不废话了,下面直接上代码(无话可说了):

public class SQLHelper
  {
    // 超时时间
    private static int Timeout = 1000;
    // 数据库名称
    public const String BestNet = "BestNet";
    //存储过程名称
    public const String UserInfoCURD = "UserInfoCURD";
    // 数据库连接字符串
    private static Dictionary<String, String> ConnStrs = new Dictionary<String, String>();

    /// <summary>
    /// SQLServer操作类(静态构造函数)
    /// </summary>
    static SQLHelper()
    {
      ConnectionStringSettingsCollection configs = WebConfigurationManager.ConnectionStrings;
      foreach (ConnectionStringSettings config in configs)
      {
        ConnStrs.Add(config.Name, config.ConnectionString);
      }
    }

    /// <summary>
    /// 获取数据库连接
    /// </summary>
    /// <param name="database">数据库(配置文件内connectionStrings的name)</param>
    /// <returns>数据库连接</returns>
    private static SqlConnection GetConnection(string database)
    {
      if (string.IsNullOrEmpty(database))
      {
        throw new Exception("未设置参数:database");
      }
      if (!ConnStrs.ContainsKey(database))
      {
        throw new Exception("未找到数据库:" + database);
      }
      return new SqlConnection(ConnStrs[database]);
    }

    /// <summary>
    /// 获取SqlCommand
    /// </summary>
    /// <param name="conn">SqlConnection</param>
    /// <param name="transaction">SqlTransaction</param>
    /// <param name="cmdType">CommandType</param>
    /// <param name="sql">SQL</param>
    /// <param name="parms">SqlParameter数组</param>
    /// <returns></returns>
    private static SqlCommand GetCommand(SqlConnection conn, SqlTransaction transaction, CommandType cmdType, string sql, SqlParameter[] parms)
    {
      SqlCommand cmd = new SqlCommand(sql, conn);
      cmd.CommandType = cmdType;
      cmd.CommandTimeout = Timeout;
      if (transaction != null)
        cmd.Transaction = transaction;
      if (parms != null && parms.Length != 0)
        cmd.Parameters.AddRange(parms);
      return cmd;
    }

    /// <summary>
    /// 查询数据,返回DataTable
    /// </summary>
    /// <param name="database">数据库</param>
    /// <param name="sql">SQL语句或存储过程名</param>
    /// <param name="parms">参数</param>
    /// <param name="cmdType">查询类型(SQL语句/存储过程名)</param>
    /// <returns>DataTable</returns>
    public static DataTable QueryDataTable(string database, string sql, SqlParameter[] parms, CommandType cmdType)
    {
      if (string.IsNullOrEmpty(database))
      {
        throw new Exception("未设置参数:database");
      }
      if (string.IsNullOrEmpty(sql))
      {
        throw new Exception("未设置参数:sql");
      }

      try
      {
        using (SqlConnection conn = GetConnection(database))
        {
          conn.Open();

          using (SqlCommand cmd = GetCommand(conn, null, cmdType, sql, parms))
          {
            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
            {
              DataTable dt = new DataTable();
              da.Fill(dt);
              return dt;
            }
          }
        }
      }
      catch (SqlException ex)
      {
        System.Text.StringBuilder log = new System.Text.StringBuilder();
        log.Append("查询数据出错:");
        log.Append(ex);
        throw new Exception(log.ToString());
      }
    }

    /// <summary>
    /// 查询数据,返回DataSet
    /// </summary>
    /// <param name="database">数据库</param>
    /// <param name="sql">SQL语句或存储过程名</param>
    /// <param name="parms">参数</param>
    /// <param name="cmdType">查询类型(SQL语句/存储过程名)</param>
    /// <returns>DataSet</returns>
    public static DataSet QueryDataSet(string database, string sql, SqlParameter[] parms, CommandType cmdType)
    {
      if (string.IsNullOrEmpty(database))
      {
        throw new Exception("未设置参数:database");
      }
      if (string.IsNullOrEmpty(sql))
      {
        throw new Exception("未设置参数:sql");
      }

      try
      {
        using (SqlConnection conn = GetConnection(database))
        {
          conn.Open();

          using (SqlCommand cmd = GetCommand(conn, null, cmdType, sql, parms))
          {
            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
            {
              DataSet ds = new DataSet();
              da.Fill(ds);
              return ds;
            }
          }
        }
      }
      catch (SqlException ex)
      {
        System.Text.StringBuilder log = new System.Text.StringBuilder();
        log.Append("查询数据出错:");
        log.Append(ex);
        throw new Exception(log.ToString());
      }
    }

    /// <summary>
    /// 执行命令获取唯一值(第一行第一列)
    /// </summary>
    /// <param name="database">数据库</param>
    /// <param name="sql">SQL语句或存储过程名</param>
    /// <param name="parms">参数</param>
    /// <param name="cmdType">查询类型(SQL语句/存储过程名)</param>
    /// <returns>获取值</returns>
    public static object QueryScalar(string database, string sql, SqlParameter[] parms, CommandType cmdType)
    {
      if (string.IsNullOrEmpty(database))
      {
        throw new Exception("未设置参数:database");
      }
      if (string.IsNullOrEmpty(sql))
      {
        throw new Exception("未设置参数:sql");
      }
      try
      {
        using (SqlConnection conn = GetConnection(database))
        {
          conn.Open();

          using (SqlCommand cmd = GetCommand(conn, null, cmdType, sql, parms))
          {
            return cmd.ExecuteScalar();
          }
        }
      }
      catch (SqlException ex)
      {
        System.Text.StringBuilder log = new System.Text.StringBuilder();
        log.Append("处理出错:");
        log.Append(ex);
        throw new Exception(log.ToString());
      }
    }

    /// <summary>
    /// 执行命令更新数据
    /// </summary>
    /// <param name="database">数据库</param>
    /// <param name="sql">SQL语句或存储过程名</param>
    /// <param name="parms">参数</param>
    /// <param name="cmdType">查询类型(SQL语句/存储过程名)</param>
    /// <returns>更新的行数</returns>
    public static int Execute(string database, string sql, SqlParameter[] parms, CommandType cmdType)
    {
      if (string.IsNullOrEmpty(database))
      {
        throw new Exception("未设置参数:database");
      }
      if (string.IsNullOrEmpty(sql))
      {
        throw new Exception("未设置参数:sql");
      }

      //返回(增删改)的更新行数
      int count = 0;

      try
      {
        using (SqlConnection conn = GetConnection(database))
        {
          conn.Open();

          using (SqlCommand cmd = GetCommand(conn, null, cmdType, sql, parms))
          {
            if (cmdType == CommandType.StoredProcedure)
              cmd.Parameters.AddWithValue("@RETURN_VALUE", "").Direction = ParameterDirection.ReturnValue;

            count = cmd.ExecuteNonQuery();

            if (count <= 0)
              if (cmdType == CommandType.StoredProcedure)
                count = (int)cmd.Parameters["@RETURN_VALUE"].Value;
          }
        }
      }
      catch (SqlException ex)
      {
        System.Text.StringBuilder log = new System.Text.StringBuilder();
        log.Append("处理出错:");
        log.Append(ex);
        throw new Exception(log.ToString());
      }
      return count;
    }

    /// <summary>
    /// 查询数据,返回DataTable
    /// </summary>
    /// <param name="database">数据库</param>
    /// <param name="sql">SQL语句或存储过程名</param>
    /// <param name="cmdType">查询类型(SQL语句/存储过程名)</param>
    /// <param name="values">参数</param>
    /// <returns>DataTable</returns>
    public static DataTable QueryDataTable(string database, string sql, CommandType cmdType, IDictionary<string, object> values)
    {
      SqlParameter[] parms = DicToParams(values);
      return QueryDataTable(database, sql, parms, cmdType);
    }

    /// <summary>
    /// 执行存储过程查询数据,返回DataSet
    /// </summary>
    /// <param name="database">数据库</param>
    /// <param name="sql">SQL语句或存储过程名</param>
    /// <param name="cmdType">查询类型(SQL语句/存储过程名)</param>
    /// <param name="values">参数
    /// <returns>DataSet</returns>
    public static DataSet QueryDataSet(string database, string sql, CommandType cmdType, IDictionary<string, object> values)
    {
      SqlParameter[] parms = DicToParams(values);
      return QueryDataSet(database, sql, parms, cmdType);
    }

    /// <summary>
    /// 执行命令获取唯一值(第一行第一列)
    /// </summary>
    /// <param name="database">数据库</param>
    /// <param name="sql">SQL语句或存储过程名</param>
    /// <param name="cmdType">查询类型(SQL语句/存储过程名)</param>
    /// <param name="values">参数</param>
    /// <returns>唯一值</returns>
    public static object QueryScalar(string database, string sql, CommandType cmdType, IDictionary<string, object> values)
    {
      SqlParameter[] parms = DicToParams(values);
      return QueryScalar(database, sql, parms, cmdType);
    }

    /// <summary>
    /// 执行命令更新数据
    /// </summary>
    /// <param name="database">数据库</param>
    /// <param name="sql">SQL语句或存储过程名</param>
    /// <param name="cmdType">查询类型(SQL语句/存储过程名)</param>
    /// <param name="values">参数</param>
    /// <returns>更新的行数</returns>
    public static int Execute(string database, string sql, CommandType cmdType, IDictionary<string, object> values)
    {
      SqlParameter[] parms = DicToParams(values);
      return Execute(database, sql, parms, cmdType);
    }

    /// <summary>
    /// 创建参数
    /// </summary>
    /// <param name="name">参数名</param>
    /// <param name="type">参数类型</param>
    /// <param name="size">参数大小</param>
    /// <param name="direction">参数方向(输入/输出)</param>
    /// <param name="value">参数值</param>
    /// <returns>新参数对象</returns>
    public static SqlParameter[] DicToParams(IDictionary<string, object> values)
    {
      if (values == null) return null;

      SqlParameter[] parms = new SqlParameter[values.Count];
      int index = 0;
      foreach (KeyValuePair<string, object> kv in values)
      {
        SqlParameter parm = null;
        if (kv.Value == null)
        {
          parm = new SqlParameter(kv.Key, DBNull.Value);
        }
        else
        {
          Type t = kv.Value.GetType();
          parm = new SqlParameter(kv.Key, NetToSql(kv.Value.GetType()));
          parm.Value = kv.Value;
        }

        parms[index++] = parm;
      }
      return parms;
    }

    /// <summary>
    /// .net类型转换为Sql类型
    /// </summary>
    /// <param name="t">.net类型</param>
    /// <returns>Sql类型</returns>
    public static SqlDbType NetToSql(Type t)
    {
      SqlDbType dbType = SqlDbType.Variant;
      switch (t.Name)
      {
        case "Int16":
          dbType = SqlDbType.SmallInt;
          break;
        case "Int32":
          dbType = SqlDbType.Int;
          break;
        case "Int64":
          dbType = SqlDbType.BigInt;
          break;
        case "Single":
          dbType = SqlDbType.Real;
          break;
        case "Decimal":
          dbType = SqlDbType.Decimal;
          break;

        case "Byte[]":
          dbType = SqlDbType.VarBinary;
          break;
        case "Boolean":
          dbType = SqlDbType.Bit;
          break;
        case "String":
          dbType = SqlDbType.NVarChar;
          break;
        case "Char[]":
          dbType = SqlDbType.Char;
          break;
        case "DateTime":
          dbType = SqlDbType.DateTime;
          break;
        case "DateTime2":
          dbType = SqlDbType.DateTime2;
          break;
        case "DateTimeOffset":
          dbType = SqlDbType.DateTimeOffset;
          break;
        case "TimeSpan":
          dbType = SqlDbType.Time;
          break;
        case "Guid":
          dbType = SqlDbType.UniqueIdentifier;
          break;
        case "Xml":
          dbType = SqlDbType.Xml;
          break;
        case "Object":
          dbType = SqlDbType.Variant;
          break;
      }
      return dbType;
    }

  }

可以直接这样调用:

IDictionary<string, object> values = new Dictionary<string, object>();
 values.Add("@UserName", UserName);
 values.Add("@PassWord", passWord);
 object Scalar = SQLHelper.QueryScalar(SQLHelper.BestNet, SQLHelper.UserInfoCURD, CommandType.StoredProcedure, values);  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法

    本文实例讲述了C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法.分享给大家供大家参考.具体如下: 这个类不是我实现的,英文原文地址为http://www.eggheadcafe.com/articles/20050315.asp,这里修改了原文中分析sql语句参数的方法,将方法名修改为AttachParameters,将其修饰符修改为private,并直接传递command到这个方法,直接绑定参数到comand.修改后的代码如下 using System;

  • C#实现操作MySql数据层类MysqlHelper实例

    本文实例讲述了C#实现操作MySql数据层类MysqlHelper.分享给大家供大家参考.具体如下: using System; using System.Data; using System.Configuration; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; using MySql.Data; using MySql.Data.MySqlCli

  • C# SqlHelper应用开发学习

    本文实例为大家分享了C# SqlHelper应用技巧,供大家参考,具体内容如下 使用App.config配置文件封装连接字符串,方便重复使用 --->添加App.conifg配置文件 --->Add : ConnectionString: --->添加引用 <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supported

  • c# SQLHelper(for winForm)实现代码

    SQLHelper.cs 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.Collections; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace HelloWinForm.DBUtility { class SQLHelper { #reg

  • C#编写SqlHelper类

    无聊的周末,学习.编码无力.想找点事干但又不知道干点什么,猛然发现自己学过的SqlHelper快忘记了.于是乎虎躯一震心想怎能如此堕落下去,立马打开电脑,双手摸上键盘.写下此文作为学习过程中的复习,并分享出知识(顺便打发时间-^.^-). 下面开始正文 这里以控制台程序为案例.首先我们需要先配置一下连接字符串,我们需要在app.config文件中增加如下节点: <connectionStrings> <add name="Sql" connectionString=&

  • c#中SqlHelper封装SqlDataReader的方法

    本文实例讲述了c#中SqlHelper封装SqlDataReader的方法.分享给大家供大家参考.具体如下: /// <summary> /// 执行sql语句返回一个DataReader /// 当返回DataReader的时候,注意: /// 1.Connection不能关闭 /// 2.DataReader不能关闭 /// 3.command对象执行ExecuteReader()的时候需要传递一个参数CommandBehavior.CloseConnection /// </sum

  • C#实现较为实用的SQLhelper

    第一次写博客,想不到写什么好b( ̄▽ ̄)d ,考虑的半天决定从sqlhelper开始,sqlhelper对程序员来说就像helloworld一样,很简单却又很重要,helloworld代表着程序员萌新第一次写代码,而sqlhelper则是初次接触数据库(不知道这种说法对不对). 好了不废话了,下面直接上代码(无话可说了): public class SQLHelper { // 超时时间 private static int Timeout = 1000; // 数据库名称 public con

  • jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)

    对此,我把CSS3标准中nth-child()用法大致介绍下: CSS3伪类选择器:nth-child() 简单的归纳下nth-child()的几种用法. 第一:nth-child(number) 直接匹配第number个元素.参数number必须为大于0的整数. (EG) li:nth-child(3){background:orange;}/*把第3个LI的背景设为橙色*/ 第二:nth-child(an) 匹配所有倍数为a的元素.其中参数an中的字母n不可缺省,它是倍数写法的标志,如3n.

  • 注册表检查程序Scanreg你用了吗?

    注册表是Windows的命根子,如果注册表损坏了,轻则导致程序运行出错,严重的则会使整个系统崩溃,因此我们要经常做好注册表的检查和维护工作,以保证注册表的安全.在Windows中系统提供了较为实用的注册表检查程序,但许多用户对此程序不太了解,下面就向大家介绍它的具体用法. 在Windows中注册表检查程序有两个,一个是在Windows视窗界面中使用的scanregw.e xe程序,另一个是在DOS方式下使用的scanreg.exe程序.它们的功能和作用都不相同. scanregw.exe程序能够

  • Windows命令行bat批处理延迟sleep方法(批处理延时)

    Windows下批处理文件没有像Linux一样的Sleep函数进行延时处理,这里有2种较为实用的方法实现延迟: 1.使用WScirpt的sleep功能,精度0.001秒 创建vbs延迟文件,然后在批处理文件中调用,使用WScript的 sleep函数,实现sleep的效果. 实战: 1)创建文件sleep.vbs: echo WScript.sleep 5000 > sleep.vbs sleep.vbs 内容如下: WScript.sleep 5000. 2)在批处理文件中调用,创建示例文件t

  • PL/SQL实现Oracle数据库任务调度

    正在看的ORACLE教程是:PL/SQL实现Oracle数据库任务调度.摘要:本文主要就数据库恢复与系统任务的调度,在结合一般性的数据库后台处理的经验上,提出较为实用而新颖的解决方法,拓宽了数据库后台开发的思路. 关键词:数据恢复,任务调度,ORACLE,PL/SQL 在数据库操作中时常会有这样的情况发生,由于一时的疏忽而误删或误改了一些重要的数据,另外还有一些重要的任务需要周期性地运行.显然,前一类问题主要是数据备份与恢复方面的,而后一类则主要是系统的任务调度.本文将针对这两类问题,从应用程序

  • 深入理解Python 代码优化详解

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化来提高程序的执行效率.如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 8

  • Python 代码性能优化技巧分享

    如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个

  • Flash破解与加密综合

    本文将陆续更新,请以 http://www.zhugao.cn/info/news_study_show.asp?id=503 为准,同时也避免网友转载时可能出现的遗漏.诚邀感兴趣的朋友一起讨论,以修正文中不足.限于篇幅,本文对破解及加密工具的使用方法不作详述,只对相关技巧进行说明.所涉及的工具大部分可以在我的网站中找到. 写此文,也了却了五个月前与 HBrO 约下的总结一篇加解密的文章.由于加密Flash一直是件比较头疼的事情,所以整理本文的初衷为侧重加密.无论是加密还是解密,都无法绝对地反映

  • xmlplus组件设计系列之图标(ICON)(1)

    网页上使用的图标分可为三种:文件图标.字体图标和 SVG 图标.对于文件图标,下面仅以 PNG 格式来说明. PNG 图标 对于 PNG 图标的引用,有两种方式.一种是直接由 HTML 元素 img 的 src 属性给出.下面是一个简单的示例. Icon: { css: "#icon { width: 68px; height: 68px; }", xml: "<img id='icon'/>", fun: function (sys, items, o

  • Python Matplotlib 实现3D绘图详解

    目录 第一个三维绘图程序 3D散点图 3D等高线图 3D线框图 3D曲面图 最初开发的 Matplotlib,仅支持绘制 2d 图形,后来随着版本的不断更新, Matplotlib 在二维绘图的基础上,构建了一部分较为实用的 3D 绘图程序包,比如 mpl_toolkits.mplot3d,通过调用该程序包一些接口可以绘制 3D散点图.3D曲面图.3D线框图等 mpl_toolkits 是 Matplotlib 的绘图工具包. 第一个三维绘图程序 下面编写第一个三维绘图程序. 首先创建一个三维绘

随机推荐