• 一个研究中的SqlHelper


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    using System.Transactions;

    namespace ChinaCustoms.Application.HD2007.DB
    {
        /// <summary>
        /// 数据库操作类.
        /// </summary>
        /// <remarks>
        /// 密封类,以防止被继承.
        /// 该类中所有成员均为static.
        /// </remarks>
        public sealed class SqlDatabase
        {
            /// <summary>
            /// 私有构造函数,以防止该类的实例化.
            /// </summary>
            private SqlDatabase() { }

            /// <summary>
            /// 获取数据库连接对象
            /// </summary>
            /// <param name="connectionString">数据库连接字符串</param>
            /// <returns>IDbConnection对象</returns>
            public static IDbConnection GetConnectionObject(string connectionString)
            {
                return new SqlConnection(connectionString);//不一定new一个新的SqlConnection,可能会去连接池取.
            }

            #region ExecuteNonQuery
            /// <summary>
            /// 该方法可用以执行不需要输入参数的sql语句、存储过程.
            /// </summary>
            /// <remarks>
            /// 关于该方法的返回值:
            /// 1.sql语句
            /// 对于insert、update、delete语句,将返回命令所影响的行数.
            /// 对于select等所有其他类型的语句,将返回-1.
            /// 如果发生会滚,也将返回-1.
            /// 2.存储过程
            /// 同上
            /// 该方法的推荐应用场景:
            /// 1.用于执行非select查询
            /// </remarks>
            /// <param name="connectionObject">用于数据库连接的字符串或者直接是连接对象.</param>
            /// <param name="commandType">命令类型,为System.Data.CommandType枚举类型.</param>
            /// <param name="commandText">命令</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(object connectionObject, CommandType commandType, string commandText)
            {
                return ExecuteNonQuery(connectionObject, commandType, commandText, null);
            }

            /// <summary>
            /// 该方法可用以执行不需要输入参数的sql语句、存储过程.
            /// </summary>
            /// <remarks>
            /// 关于该方法的返回值:
            /// 1.sql语句
            /// 对于insert、update、delete语句,将返回命令所影响的行数.
            /// 对于select等所有其他类型的语句,将返回-1.
            /// 如果发生会滚,也将返回-1.
            /// 2.存储过程
            /// 同上
            /// 该方法的推荐应用场景:
            /// 1.用于执行非select查询
            /// </remarks>
            /// <param name="connectionObject">用于数据库连接的字符串或者直接是连接对象.</param>
            /// <param name="commandType">命令类型,为System.Data.CommandType枚举类型.</param>
            /// <param name="commandText">命令</param>
            /// <param name="commandTimeout">在终止执行命令的尝试并生成错误之前的等待时间.</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(object connectionObject, CommandType commandType, string commandText, int commandTimeout)
            {
                return ExecuteNonQuery(connectionObject, commandType, commandText, commandTimeout, null);
            }

            /// <summary>
            /// 该方法可用以执行需要输入参数的sql语句、存储过程.
            /// 通过该方法可得到命令的输出参数、@RETURN_VALUE.这些值通过方法的输入参数ParamCollection返回.
            /// </summary>
            /// <remarks>
            /// 关于该方法的返回值:
            /// 1.sql语句
            /// 对于insert、update、delete语句,将返回命令所影响的行数.
            /// 对于select等所有其他类型的语句,将返回-1.
            /// 如果发生会滚,也将返回-1.
            /// 2.存储过程
            /// 同上
            /// 该方法的推荐应用场景:
            /// 1.用于执行非select查询
            /// 2.需要返回命令的输出参数、@RETURN_VALUE的时候
            /// </remarks>
            /// <param name="connectionObject">用于数据库连接的字符串或者直接是连接对象.</param>
            /// <param name="commandType">命令类型,为System.Data.CommandType枚举类型.</param>
            /// <param name="commandText">命令</param>
            /// <param name="commandTimeout">在终止执行命令的尝试并生成错误之前的等待时间.</param>
            /// <param name="commandParameters">命令的参数,为ParamCollection类型,最终会被解析为SqlParameter类.</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(object connectionObject, CommandType commandType, string commandText, int commandTimeout, ParamCollection commandParameters)
            {
                if (string.IsNullOrEmpty(commandText)) throw new ArgumentNullException("commandText");

                //如果是字符串的话
                if (connectionObject is string)
                {
                    using (SqlConnection connection = new SqlConnection((string)connectionObject))
                    {
                        return ExecuteNonQuery(connection, commandType, commandText, commandTimeout, commandParameters);
                    }
                }
                else//如果是connection对象的话
                {
                    return ExecuteNonQuery((SqlConnection)connectionObject, commandType, commandText, commandTimeout, commandParameters);
                }
            }

            /// <summary>
            /// 该方法可用以执行需要输入参数的sql语句、存储过程.
            /// 通过该方法可得到命令的输出参数、@RETURN_VALUE.这些值通过方法的输入参数ParamCollection返回.
            /// </summary>
            /// <remarks>
            /// 关于该方法的返回值:
            /// 1.sql语句
            /// 对于insert、update、delete语句,将返回命令所影响的行数.
            /// 对于select等所有其他类型的语句,将返回-1.
            /// 如果发生会滚,也将返回-1.
            /// 2.存储过程
            /// 同上
            /// 该方法的推荐应用场景:
            /// 1.用于执行非select查询
            /// 2.需要返回命令的输出参数、@RETURN_VALUE的时候
            /// </remarks>
            /// <param name="connectionObject">用于数据库连接的字符串或者直接是连接对象.</param>
            /// <param name="commandType">命令类型,为System.Data.CommandType枚举类型.</param>
            /// <param name="commandText">命令</param>
            /// <param name="commandParameters">命令的参数,为ParamCollection类型,最终会被解析为SqlParameter类.</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(object connectionObject, CommandType commandType, string commandText, ParamCollection commandParameters)
            {
                //CommandTimeout默认为30秒.
                return ExecuteNonQuery(connectionObject, commandType, commandText, 30, commandParameters);
            }

            /// <summary>
            /// 该方法仅用以执行不需要输入参数的存储过程.
            /// </summary>
            /// <remarks>
            /// 关于该方法的返回值:
            /// 1.存储过程
            /// 对于insert、update、delete类型的存储过程,将返回命令所影响的行数.
            /// 对于select等所有其他类型的存储过程,将返回-1.
            /// 如果发生会滚,也将返回-1.
            /// 该方法的推荐应用场景:
            /// 1.用于执行非select查询类型的存储过程
            /// </remarks>
            /// <param name="connectionObject">用于数据库连接的字符串或者直接是连接对象.</param>
            /// <param name="spName">存储过程名称</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(object connectionObject, string spName)
            {
                return ExecuteNonQuery(connectionObject, spName, null);
            }

    /// <summary>
            /// 该方法仅用以执行不需要输入参数的存储过程.
            /// </summary>
            /// <remarks>
            /// 关于该方法的返回值:
            /// 1.存储过程
            /// 对于insert、update、delete类型的存储过程,将返回命令所影响的行数.
            /// 对于select等所有其他类型的存储过程,将返回-1.
            /// 如果发生会滚,也将返回-1.
            /// 该方法的推荐应用场景:
            /// 1.用于执行非select查询类型的存储过程
            /// </remarks>
            /// <param name="connectionObject">用于数据库连接的字符串或者直接是连接对象.</param>
            /// <param name="spName">存储过程名称</param>
            /// <param name="commandTimeout">在终止执行命令的尝试并生成错误之前的等待时间.</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(object connectionObject, string spName, int commandTimeout)
            {
                return ExecuteNonQuery(connectionObject, spName, commandTimeout, null);
            }

            /// <summary>
            /// 该方法仅用以执行需要输入参数的存储过程.
            /// 调用时只传入输入参数的值即可.程序会自动检索出该存储过程的参数,并分配相应的参数值.
            /// </summary>
            /// <remarks>
            /// 关于该方法的返回值:
            /// 1.存储过程
            /// 对于insert、update、delete类型的存储过程,将返回命令所影响的行数.
            /// 对于select等所有其他类型的存储过程,将返回-1.
            /// 如果发生会滚,也将返回-1.
            /// 该方法的推荐应用场景:
            /// 1.用于执行非select查询类型的存储过程
            /// </remarks>
            /// <param name="connectionObject">用于数据库连接的字符串或者直接是连接对象.</param>
            /// <param name="spName">存储过程名称</param>
            /// <param name="commandTimeout">在终止执行命令的尝试并生成错误之前的等待时间.</param>
            /// <param name="parameterValues">存储过程输入参数的值,为参数数组形式</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(object connectionObject, string spName, int commandTimeout, params object[] parameterValues)
            {
                if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName");
                if (parameterValues != null)
                {
                    #region 为sp准备ParamCollection
                    //获取缓存的sp参数的deep copy
                    ParamCollection commandParameters = ParamCache.GetSpParameterSet(connectionObject, spName);
                    //为参数赋值
                    AssignParameterValues(commandParameters, parameterValues);
                    #endregion
                    return ExecuteNonQuery(connectionObject, CommandType.StoredProcedure, spName, commandTimeout, commandParameters);
                }
                else
                {
                    return ExecuteNonQuery(connectionObject, CommandType.StoredProcedure, spName, commandTimeout);
                }
            }

            /// <summary>
            /// 该方法仅用以执行需要输入参数的存储过程.
            /// 调用时只传入输入参数的值即可.程序会自动检索出该存储过程的参数,并分配相应的参数值.
            /// </summary>
            /// <remarks>
            /// 关于该方法的返回值:
            /// 1.存储过程
            /// 对于insert、update、delete类型的存储过程,将返回命令所影响的行数.
            /// 对于select等所有其他类型的存储过程,将返回-1.
            /// 如果发生会滚,也将返回-1.
            /// 该方法的推荐应用场景:
            /// 1.用于执行非select查询类型的存储过程
            /// </remarks>
            /// <param name="connectionObject">用于数据库连接的字符串或者直接是连接对象.</param>
            /// <param name="spName">存储过程名称</param>
            /// <param name="parameterValues">存储过程输入参数的值,为参数数组形式</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(object connectionObject, string spName, params object[] parameterValues)
            {
                //CommandTimeout默认为30秒.
                return ExecuteNonQuery(connectionObject, spName, 30, parameterValues);
            }
            #endregion
    /// <summary>
            /// IList转DataSet,IList.Count=0的话返回null
            /// </summary>
            /// <typeparam name="T">数据名</typeparam>
            /// <param name="list"></param>
            /// <returns>DataSet</returns>
            public static DataSet ConvertToDataSet<T>(IList<T> list)
            {
                if (list == null || list.Count <= 0)
                    return null;

                DataSet ds = new DataSet();
                DataTable dt = new DataTable(typeof(T).Name);
                DataColumn column;
                DataRow row;

                System.Reflection.PropertyInfo[] myPropertyInfo =
                    typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

                foreach (T t in list)
                {
                    if (t == null) continue;
                    row = dt.NewRow();

                    for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
                    {
                        System.Reflection.PropertyInfo pi = myPropertyInfo[i];
                        String name = pi.Name;
                       
                        if (dt.Columns[name] == null)
                        {
                            if (pi.PropertyType.UnderlyingSystemType.ToString() == "System.Nullable`1[System.Int32]")
                            {
                                column = new DataColumn(name,typeof(Int32));
                                dt.Columns.Add(column);
                                //row[name] = pi.GetValue(t, new object[] {i});//PropertyInfo.GetValue(object,object[])
                                if (pi.GetValue(t, null) != null)
                                    row[name] = pi.GetValue(t, null);
                                else
                                    row[name] = System.DBNull.Value;
                            }
                            else
                            {
                                column = new DataColumn(name, pi.PropertyType);
                                dt.Columns.Add(column);
                                row[name] = pi.GetValue(t, null);
                            }
                        }
                    }
                    dt.Rows.Add(row);
                }
                ds.Tables.Add(dt);
                return ds;
            }

  • 相关阅读:
    hdu 1025 lis 注意细节!!!【dp】
    简单的数据生成方法
    注意特殊情况!最长上升子序列!!poj2533
    括号序列问题 uva 1626 poj 1141【区间dp】
    UVa 10502【dp】
    hdu 1024 MAX Sum Plus Plus【dp】
    python 《核心编程》 1,2章
    c语言 文件链表实现最简单的学生管理系统
    Python和Python解释器
    计算机基础小结
  • 原文地址:https://www.cnblogs.com/qingshan/p/1627852.html
Copyright © 2020-2023  润新知