当前位置: 首页 > 编程笔记 >

C#实现较为实用的SQLhelper

万俟玉书
2023-03-14
本文向大家介绍C#实现较为实用的SQLhelper,包括了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);  

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

 类似资料:
  • 问题内容: 是否有人尝试为JVM实现C#?作为Java开发人员,我一直羡慕C#,但不愿放弃JVM的可移植性和成熟度,更不用说针对它的各种工具了。 我知道JVM和CLR之间有一些重要的区别,但是有没有什么是最流行的? 问题答案: CLR和JVM之间有很大的不同。 一些例子: Java没有用户定义的值类型 Java泛型与.NET泛型 完全 不同 C#的许多方面都依赖于框架的元素-委托等。您还需要移植库

  • 我在理解和使用比较器方面有一个问题,有人问我以下问题: 我在一个单独的Employee类中使用compareTo比较器接口来调用比较器对象的重载使用。 任何帮助,建议,代码行将非常感谢!!

  • 本文向大家介绍C++调用C#的DLL实现方法,包括了C++调用C#的DLL实现方法的使用技巧和注意事项,需要的朋友参考一下 SwfDotNet是C#编写的,这是个特别好的读写Swf文件的库。本文讲述了在C++项目中,怎么让C++调用C#的DLL动态链接库文件。 具体的实现步骤如下: 一、创建C# DLL,需要指定应用类型为“类库”,代码: 二、C++客户程序,是个控制台应用,代码: 三、这里有几点

  • 我正在尝试编写一个使用最小优先级队列的算法,所以我在谷歌上四处查看并找到了PriorityQueue。不过,似乎为了使用它,我需要告诉它我希望它如何排列优先级,并且这样做的方法是使用比较器(我想比较我的“Node1”对象的特定数据字段)。更多的谷歌搜索提出了创建一个新的比较器的想法,它实现了比较器但覆盖了比较方法。我正在尝试的是这样(以及它的其他变体): 编译器有几个理由提出抗议,其中之一是我没有

  • 编译器会为我们处理epsilon的问题吗? 顺便问一句:对照Epsilon检查时写<或<=更好吗?

  • 嗨,我是贾维斯的新手。 我有一个实体,我正在为它实现一个自定义比较器,以便使用Javers进行比较。 我的实体:- 包装com.devyansh.entity; 进口java.util.清单; 导入组织。贾维斯。果心元模型。注释。实体 下面我注册了新的比较器:- 我的比较器实现:- 问题领域:- 每当我尝试使用以下行进行比较时:- Diff Diff=标枪。比较(new Ent(“aaa”,new