Ado.NET SQLHelper

using System;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Reflection;

namespace RaywindStudio.DAL {
    /// <summary>
    /// MSSQL数据库操作类
    /// </summary>
    public static class SqlHelper {
        /// <summary>
        /// 是否写调试信息
        /// 执行成功写到C:\\DebugSQL.txt;
        /// 执行失败写到C:\\DebugTxt.txt;
        /// </summary>
        public static bool debug = false;


        #region Select

        /// <summary>
        /// Select查表
        /// </summary>
        /// <param name="Columns">一条完整、直接执行的select语句</param>
        /// <param name="TableName">一条完整、直接执行的select语句</param>
        /// <param name="WP">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>DataTable</returns>
        public static DataTable SelectTable(string Columns, string TableName,
             WPrm[] WP, SqlConnection sqlconn) {
            return SelectTable(Columns, TableName, WP, "", sqlconn);
        }

        /// <summary>
        /// Select查表
        /// </summary>
        /// <param name="Columns">一条完整、直接执行的select语句</param>
        /// <param name="TableName">一条完整、直接执行的select语句</param>
        /// <param name="WP">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>DataTable</returns>
        public static DataTable SelectTable(string Columns, string TableName,
             WPrm WP, SqlConnection sqlconn) {
            return SelectTable(Columns, TableName, new WPrm[] { WP }, "", sqlconn);
        }

        /// <summary>
        /// Select查表
        /// </summary>
        /// <param name="Columns">一条完整、直接执行的select语句</param>
        /// <param name="TableName">一条完整、直接执行的select语句</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>DataTable</returns>
        public static DataTable SelectTable(string Columns, string TableName, SqlConnection sqlconn) {
            return SelectTable(Columns, TableName, new WPrm(), sqlconn);
        }

        /// <summary>
        /// Select查表
        /// </summary>
        /// <param name="Columns">一条完整、直接执行的select语句</param>
        /// <param name="TableName">一条完整、直接执行的select语句</param>
        /// <param name="ColumnsOrderByWithMode">排序列名加上ASC or DESC</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>DataTable</returns>
        public static DataTable SelectTable(string Columns, string TableName, string ColumnsOrderByWithMode, SqlConnection sqlconn) {
            return SelectTable(Columns, TableName, new WPrm(), ColumnsOrderByWithMode, sqlconn);
        }

        /// <summary>
        /// Select查表
        /// </summary>
        /// <param name="Columns">一条完整、直接执行的select语句</param>
        /// <param name="TableName">一条完整、直接执行的select语句</param>
        /// <param name="ColumnsOrderByWithMode">排序列名加上ASC or DESC</param>
        /// <param name="WP">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>DataTable</returns>
        public static DataTable SelectTable(string Columns, string TableName, WPrm WP,
            string ColumnsOrderByWithMode, SqlConnection sqlconn) {
            return SelectTable(Columns, TableName, new WPrm[] { WP },
                ColumnsOrderByWithMode, sqlconn);
        }

        /// <summary>
        /// Select查表
        /// </summary>
        /// <param name="Columns">一条完整、直接执行的select语句</param>
        /// <param name="TableName">一条完整、直接执行的select语句</param>
        /// <param name="ColumnsOrderByWithMode">排序列名加上ASC or DESC</param>
        /// <param name="WPS">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>DataTable</returns>
        public static DataTable SelectTable(string Columns, string TableName, WPrm[] WPS,
            string ColumnsOrderByWithMode, SqlConnection sqlconn) {
            string sql = "Select " + Columns + " From " + TableName + " Where 1=1 ";
            SqlParameter[] pr = new SqlParameter[WPS.Length];
            if (WPS[0].SqlParam.ParameterName.Length > 0) sql += SqlWhereBuild(WPS, ref pr);
            if (ColumnsOrderByWithMode.Length > 0) sql += " Order by " + ColumnsOrderByWithMode;
            SqlCommand cmd = new SqlCommand(sql, sqlconn);
            if (WPS[0].SqlParam.ParameterName.Length > 0) cmd.Parameters.AddRange(pr);
            try {
                if (sqlconn.State != ConnectionState.Open) sqlconn.Open();
                using (DataTable dt = new DataTable()) {
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd)) {
                        try {
                            debugSQL(cmd.CommandText);
                            da.Fill(dt);
                            return dt;
                        } catch (Exception ex) {
                            debugTxt(cmd.CommandText, ex);
                            throw new Exception("SelectTable:\n" + ex.Message);
                        }
                    }
                }
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("SelectTable:\n" + ex.Message);
            }
        }

        /// <summary>
        /// Select查值
        /// </summary>
        /// <param name="Columns">一条完整、直接执行的select语句</param>
        /// <param name="TableName">一条完整、直接执行的select语句</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <param name="WPS">SqlParameter</param>
        /// <returns>DataTable</returns>
        public static object SelectValue(string Columns, string TableName, WPrm[] WPS, SqlConnection sqlconn) {
            string sql = "Select " + Columns + " From " + TableName + " Where 1=1 ";
            SqlParameter[] pr = new SqlParameter[WPS.Length];
            if (WPS[0].SqlParam.ParameterName.Length > 0) sql += SqlWhereBuild(WPS, ref pr);
            SqlCommand cmd = new SqlCommand(sql, sqlconn);
            if (WPS[0].SqlParam.ParameterName.Length > 0) cmd.Parameters.AddRange(pr);
            try {
                if (sqlconn.State != ConnectionState.Open)
                    sqlconn.Open();
                debugSQL(cmd.CommandText);
                return cmd.ExecuteScalar();
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("SelectValue:\n" + ex.Message);
            }
        }

        /// <summary>
        /// Select查值
        /// </summary>
        /// <param name="Columns">一条完整、直接执行的select语句</param>
        /// <param name="TableName">一条完整、直接执行的select语句</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <param name="WP">SqlParameter</param>
        /// <returns>DataTable</returns>
        public static object SelectValue(string Columns, string TableName,
            WPrm WP, SqlConnection sqlconn) {
            return SelectValue(Columns, TableName, new WPrm[] { WP }, sqlconn);
        }

        #endregion


        #region Insert
        /// <summary>
        /// 执行MSSQL插入表操作,默认列名:ColumnName=ParameterName.Replace("@","")
        /// </summary>
        /// <param name="TableName">表名称</param>
        /// <param name="SP">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static int Insert(string TableName, SqlParameter[] SP, SqlConnection sqlconn) {
            string sql = "Insert into " + TableName + "(";
            for (int i = 0; i < SP.Length; i++)
                sql += SP[i].ParameterName.Replace("@", "") + ",";
            sql = sql.Substring(0, sql.Length - 1) + ") Values(";
            for (int j = 0; j < SP.Length; j++)
                sql += SP[j].ParameterName + ",";
            sql = sql.Substring(0, sql.Length - 1) + ")";

            SqlCommand cmd = new SqlCommand(sql, sqlconn);
            cmd.Parameters.AddRange(SP);
            try {
                if (sqlconn.State != ConnectionState.Open)
                    sqlconn.Open();
                debugSQL(cmd.CommandText);
                return cmd.ExecuteNonQuery();
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("InsertCMD:ExecuteNonQuery\n" + ex.Message);
            }
        }


        /// <summary>
        /// 执行MSSQL插入表操作,默认列名:ColumnName=ParameterName.Replace("@","")
        /// </summary>
        /// <param name="TableName">表名称</param>
        /// <param name="SP">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static int Insert(string TableName, SqlParameter SP, SqlConnection sqlconn) {
            return Insert(TableName, new SqlParameter[] { SP }, sqlconn);
        }


        /// <summary>
        /// 执行MSSQL插入表操作,默认列名:ColumnName=ParameterName.Replace("@","")
        /// </summary>
        /// <param name="TableName">表名称</param>
        /// <param name="SPS">SqlParameter</param>
        /// <param name="ColumnValues">ColumnValue键值对:弥补SqlParameter无法调用getdate()、year()等内部函数的不足。
        /// 前后分别为Column和Value,添加在insert语句的column和value部分</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static int Insert(string TableName, SqlParameter[] SPS,
            string[,] ColumnValues, SqlConnection sqlconn) {
            string sql = "Insert into " + TableName + "(";
            for (int i = 0; i < SPS.Length; i++)
                sql += SPS[i].ParameterName.Replace("@", "") + ",";
            for (int ii = 0; ii < ColumnValues.GetLength(0); ii++)
                sql += ColumnValues[ii, 0] + ",";
            sql = sql.Substring(0, sql.Length - 1) + ") Values(";
            for (int j = 0; j < SPS.Length; j++)
                sql += SPS[j].ParameterName + ",";
            for (int jj = 0; jj < ColumnValues.GetLength(0); jj++)
                sql += ColumnValues[jj, 1] + ",";
            sql = sql.Substring(0, sql.Length - 1) + ")";
            SqlCommand cmd = new SqlCommand(sql, sqlconn);
            cmd.Parameters.AddRange(SPS);
            try {
                if (sqlconn.State != ConnectionState.Open)
                    sqlconn.Open();
                debugSQL(cmd.CommandText);
                return cmd.ExecuteNonQuery();
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("InsertCMD:ExecuteNonQuery\n" + ex.Message);
            }
        }

        #endregion


        #region Update

        /// <summary>
        /// 执行MSSQL更新表操作,默认列名:ColumnName=ParameterName.Replace("@","")
        /// </summary>
        /// <param name="TableName">表名称</param>
        /// <param name="SPS">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <param name="WPS">查询条件 默认列名:ColumnName=ParameterName.Replace("@","")</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static int Update(string TableName, SqlParameter[] SPS, WPrm[] WPS, SqlConnection sqlconn) {
            string sql = "Update " + TableName + " Set ";
            for (int i = 0; i < SPS.Length; i++)
                sql += SPS[i].ParameterName.Replace("@", "")
                    + "=" + SPS[i].ParameterName + ",";
            sql = sql.Substring(0, sql.Length - 1)
               + " Where 1=1 ";
            SqlParameter[] pr = new SqlParameter[WPS.Length];
            if (WPS[0].SqlParam.ParameterName.Length > 0) sql += SqlWhereBuild(WPS, ref pr);
            SqlCommand cmd = new SqlCommand(sql, sqlconn);
            cmd.Parameters.AddRange(SPS);
            if (WPS[0].SqlParam.ParameterName.Length > 0) cmd.Parameters.AddRange(pr);
            try {
                if (sqlconn.State != ConnectionState.Open)
                    sqlconn.Open();
                debugSQL(cmd.CommandText);
                return cmd.ExecuteNonQuery();
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("Update:ExecuteNonQuery\n" + ex.Message);
            }
        }

        /// <summary>
        /// 执行MSSQL更新表操作,默认列名:ColumnName=ParameterName.Replace("@","")
        /// </summary>
        /// <param name="TableName">表名称</param>
        /// <param name="SPS">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <param name="WPS">查询条件 默认列名:ColumnName=ParameterName.Replace("@","")</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static int Update(string TableName, SqlParameter SPS, WPrm WPS, SqlConnection sqlconn) {
            return Update(TableName, new SqlParameter[] { SPS }, new WPrm[] { WPS }, sqlconn);
        }

        /// <summary>
        /// 执行MSSQL更新表操作,默认列名:ColumnName=ParameterName.Replace("@","")
        /// </summary>
        /// <param name="TableName">表名称</param>
        /// <param name="SPS">SqlParameter</param>
        /// <param name="ColumnValues">ColumnValue键值对:弥补SqlParameter无法调用getdate()、year()等内部函数的不足。
        /// 前后分别为Column和Value,添加在insert语句的column和value部分</param>
        /// <param name="WPS">SqlParameter</param>
        /// <param name="ConditionsColumnValues">ColumnValue键值对:弥补SqlParameter无法调用getdate()、year()等内部函数的不足。
        /// 前后分别为Column和Value,添加在insert语句的column和value部分</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static int Update(string TableName, SqlParameter[] SPS, string[,] ColumnValues, WPrm[] WPS,
            string[,] ConditionsColumnValues, SqlConnection sqlconn) {
            string sql = "Update " + TableName + " Set ";
            for (int i = 0; i < SPS.Length; i++)
                sql += SPS[i].ParameterName.Replace("@", "")
                    + "=" + SPS[i].ParameterName + ",";
            for (int j = 0; j < ColumnValues.GetLength(0); j++)
                sql += ColumnValues[j, 0] + "=" + ColumnValues[j, 1] + ",";
            sql = sql.Substring(0, sql.Length - 1)
               + " Where 1=1 ";
            SqlParameter[] pr = new SqlParameter[WPS.Length];
            if (WPS[0].SqlParam.ParameterName.Length > 0) sql += SqlWhereBuild(WPS, ref pr);
            for (int j = 0; j < ConditionsColumnValues.GetLength(0); j++)
                sql += " and " + ConditionsColumnValues[j, 0] + "=" + ConditionsColumnValues[j, 1];

            SqlCommand cmd = new SqlCommand(sql, sqlconn);
            cmd.Parameters.AddRange(SPS);
            if (WPS[0].SqlParam.ParameterName.Length > 0) cmd.Parameters.AddRange(pr);
            try {
                if (sqlconn.State != ConnectionState.Open)
                    sqlconn.Open();
                debugSQL(cmd.CommandText);
                return cmd.ExecuteNonQuery();
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("Update:ExecuteNonQuery\n" + ex.Message);
            }
        }

        /// <summary>
        /// 执行MSSQL更新表操作,默认列名:ColumnName=ParameterName.Replace("@","")
        /// </summary>
        /// <param name="TableName">表名称</param>
        /// <param name="SP">SqlParameter</param>
        /// <param name="ColumnValues">ColumnValue键值对:弥补SqlParameter无法调用getdate()、year()等内部函数的不足。
        /// 前后分别为Column和Value,添加在insert语句的column和value部分</param>
        /// <param name="WP">SqlParameter</param>
        /// <param name="ConditionsColumnValues">ColumnValue键值对:弥补SqlParameter无法调用getdate()、year()等内部函数的不足。
        /// 前后分别为Column和Value,添加在insert语句的column和value部分</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static int Update(string TableName, SqlParameter SP, string[,] ColumnValues, WPrm WP,
            string[,] ConditionsColumnValues, SqlConnection sqlconn) {
            return Update(TableName, new SqlParameter[] { SP }, ColumnValues,
                new WPrm[] { WP }, ConditionsColumnValues, sqlconn);
        }

        #endregion


        #region Delete

        /// <summary>
        /// 执行MSSQL删除表内数据操作
        /// </summary>
        /// <param name="TableName">表名称</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <param name="WPS">SqlParameter</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static int Delete(string TableName, WPrm[] WPS, SqlConnection sqlconn) {
            string sql = "Delete From " + TableName + " Where 1=1 ";
            SqlParameter[] pr = new SqlParameter[WPS.Length];
            if (WPS[0].SqlParam.ParameterName.Length > 0) sql += SqlWhereBuild(WPS, ref pr);

            SqlCommand cmd = new SqlCommand(sql, sqlconn);
            if (WPS[0].SqlParam.ParameterName.Length > 0) cmd.Parameters.AddRange(pr);
            try {
                if (sqlconn.State != ConnectionState.Open)
                    sqlconn.Open();
                debugSQL(cmd.CommandText);
                return cmd.ExecuteNonQuery();
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("Delete:ExecuteNonQuery\n" + ex.Message);
            }
        }

        /// <summary>
        /// 执行MSSQL删除表内数据操作
        /// </summary>
        /// <param name="TableName">表名称</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <param name="WPS">SqlParameter</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static int Delete(string TableName, WPrm WPS, SqlConnection sqlconn) {
            return Delete(TableName, new WPrm[] { WPS }, sqlconn);
        }

        #endregion


        #region Exec Proc

        /// <summary>
        /// 执行存储过程,无返回值
        /// </summary>
        /// <param name="procName">存储过程名称 </param>
        /// <param name="parameters">SqlParameters</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static void ExecProcNonReturn(string procName, SqlParameter[] parameters, SqlConnection sqlconn) {
            SqlCommand cmd = new SqlCommand(procName, sqlconn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parameters);
            try {
                if (sqlconn.State != ConnectionState.Open)
                    sqlconn.Open();
                debugSQL(cmd.CommandText);
                cmd.ExecuteNonQuery();
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("ExecProcNonReturn:ExecuteNonQuery\n" + ex.Message);
            }
        }

        /// <summary>
        /// 执行存储过程,无返回值
        /// </summary>
        /// <param name="procName">存储过程名称 </param>
        /// <param name="parameters">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static void ExecProcNonReturn(string procName, SqlParameter parameters, SqlConnection sqlconn) {
            ExecProcNonReturn(procName, new SqlParameter[] { parameters }, sqlconn);
        }

        /// <summary>
        /// 执行存储过程,并直接返回执行的结果
        /// </summary>
        /// <param name="procName">存储过程名称 </param>
        /// <param name="parameters">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static object ExecProc(string procName, SqlParameter[] parameters, SqlConnection sqlconn) {
            SqlCommand cmd = new SqlCommand(procName, sqlconn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parameters);
            try {
                if (sqlconn.State != ConnectionState.Open)
                    sqlconn.Open();
                debugSQL(cmd.CommandText);
                return cmd.ExecuteScalar();
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("ExecProc:ExecuteScalar\n" + ex.Message);
            }
        }

        /// <summary>
        /// 执行存储过程,并直接返回执行的结果
        /// </summary>
        /// <param name="procName">存储过程名称 </param>
        /// <param name="parameters">SqlParameter</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static object ExecProc(string procName, SqlParameter parameters, SqlConnection sqlconn) {
            return ExecProc(procName, new SqlParameter[] { parameters }, sqlconn);
        }

        /// <summary>
        /// 执行存储过程,带一个返回参数并返回此参数的执行结果
        /// <para>Example:</para>
        /// <para>SqlParameter[] sps = new SqlParameter[] {</para>
        /// <para>       new SqlParameter("@stageID", stgID), new SqlParameter("@sheepCode", sheepCode),</para>
        /// <para>   };</para>
        /// <para>SqlParameter spout = new SqlParameter() {</para>
        /// <para>   ParameterName = "@ret", Value = "", Direction = ParameterDirection.Output,</para>
        /// <para>   DbType = DbType.String, Size = 4000</para>
        /// <para>};</para>
        /// <para>object obj = SqlHelper.ExecProcWithOut("pGetPgkNO", sps, spout, CFG.sqlconn);</para>
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="parameters">SqlParameter</param>
        /// <param name="parameter_out">SqlParameter.Direction = ParameterDirection.Output;</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static object ExecProcWithOut(string procName, SqlParameter[] parameters,
            SqlParameter parameter_out, SqlConnection sqlconn) {
            SqlCommand cmd = new SqlCommand(procName, sqlconn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parameters);
            cmd.Parameters.Add(parameter_out);
            try {
                if (sqlconn.State != ConnectionState.Open)
                    sqlconn.Open();
                cmd.ExecuteNonQuery();
                debugSQL(cmd.CommandText);
                return parameter_out.Value;
            } catch (Exception ex) {
                debugTxt(cmd.CommandText, ex);
                throw new Exception("ExecProc:ExecuteNonQuery\n" + ex.Message);
            }
        }

        /// <summary>
        /// 执行存储过程,带一个返回参数并返回此参数的执行结果
        /// </summary>
        /// <param name="procName">存储过程名称 </param>
        /// <param name="parameters">SqlParameter</param>
        /// <param name="parameter_out">SqlParameter.Direction = ParameterDirection.Output;</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static object ExecProcWithOut(string procName, SqlParameter parameters,
            SqlParameter parameter_out, SqlConnection sqlconn) {
            return ExecProcWithOut(procName, new SqlParameter[] { parameters }, parameter_out, sqlconn);
        }

        /// <summary>
        /// 执行存储过程,无返回值
        /// </summary>
        /// <param name="procName">存储过程名称 </param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static void ExecProcNonReturn(string procName, SqlConnection sqlconn) {
            ExecProcNonReturn(procName, new SqlParameter[] { }, sqlconn);
        }

        /// <summary>
        /// 执行存储过程,并直接返回执行的结果
        /// </summary>
        /// <param name="procName">存储过程名称 </param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static object ExecProc(string procName, SqlConnection sqlconn) {
            return ExecProc(procName, new SqlParameter[] { }, sqlconn);
        }

        /// <summary>
        /// 执行存储过程,带一个返回参数并返回此参数的执行结果
        /// </summary>
        /// <param name="procName">存储过程名称 </param>
        /// <param name="parameter_out">SqlParameter.Direction = ParameterDirection.Output;</param>
        /// <param name="sqlconn">一个SQL连接</param>
        /// <returns>ExecuteNonQuery执行结果</returns>
        public static object ExecProcWithOut(string procName, SqlParameter parameter_out, SqlConnection sqlconn) {
            return ExecProcWithOut(procName, new SqlParameter[] { }, parameter_out, sqlconn);
        }

        #endregion


        #region Debug
        private static void debugSQL(string sql) {
            if (debug) {
                StreamWriter sw = new StreamWriter("C:\\DebugSQL.txt", true);
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\t" + sql);
                sw.AutoFlush = true;
                sw.Close();
                sw.Dispose();
            }
        }

        private static void debugTxt(string sql, Exception ee) {
            if (debug) {
                StreamWriter sw = new StreamWriter("C:\\DebugTxt.txt", true);
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\t" + sql + "\n" + ee.ToString());
                sw.AutoFlush = true;
                sw.Close();
                sw.Dispose();
            }
        }

        #endregion


        #region Distinct
        /// <summary>
        /// 从DataRow集合中排除重复项,并返回一个DataTable
        /// </summary>
        /// <param name="drs">DataRow集合</param>
        /// <param name="ColumnName">筛选的条件列名</param>
        /// <param name="DataTableschemaClone">要将结果装入的空表的架构</param>
        /// <returns>DataTable</returns>
        public static DataTable DistInctTable(DataRow[] drs, string ColumnName, DataTable DataTableschemaClone) {
            try {
                DataTable dts = DataTableschemaClone.Clone();
                foreach (DataRow dr in drs)
                    dts.ImportRow(dr);
                for (int i = dts.Rows.Count - 1; i >= 0; i--)
                    if (dts.Select(ColumnName + "='" + dts.Rows[i][ColumnName].ToString() + "'").Length > 1)
                        dts.Rows.RemoveAt(i);
                dts.AcceptChanges();
                return dts;
            } catch (Exception ex) {
                throw new Exception("DistInctTable(From DataRow):\n" + ex.Message);
            }
        }

        /// <summary>
        /// 从DataTable中排除重复行,并返回一个DataTable
        /// </summary>
        /// <param name="dt">源DataTable</param>
        /// <param name="ColumnName">筛选的条件列名</param>
        /// <returns>DataTable</returns>
        public static DataTable DistInctTable(DataTable dt, string ColumnName) {
            try {
                for (int i = dt.Rows.Count - 1; i >= 0; i--)
                    if (dt.Select(ColumnName + "='" + dt.Rows[i][ColumnName].ToString() + "'").Length > 1)
                        dt.Rows.RemoveAt(i);
                dt.AcceptChanges();
                return dt;
            } catch (Exception ex) {
                throw new Exception("DistInctTable(From DataTable):\n" + ex.Message);
            }
        }

        #endregion

        private static string SqlWhereBuild(WPrm[] wps, ref SqlParameter[] sps) {
            if (wps[0].SqlParam.ParameterName.Length == 0) return "";
            string sql = "";
            for (int i = 0; i < wps.Length; i++) {
                WPrm wp = wps[i];
                sps[i] = wp.SqlParam;
                switch (wp.SqlOperator) {
                    case OP.Like:
                        sql += " and " + wp.SqlParam.ParameterName.Replace("@", "") + " like '%" + wp.SqlParam.ParameterName + "%'";
                        break;
                    case OP.Null:
                        sql += " and " + wp.SqlParam.ParameterName.Replace("@", "") + " is null ";
                        break;
                    case OP.NNul:
                        sql += " and not " + wp.SqlParam.ParameterName.Replace("@", "") + " is null ";
                        break;
                    case OP.In:
                        sql += " and " + wp.SqlParam.ParameterName.Replace("@", "") + " in (" + wp.SqlParam.ParameterName + ")";
                        break;
                    default:
                        sql += " and " + wp.SqlParam.ParameterName.Replace("@", "")
                            + WPrm.GetDesc(wp.SqlOperator) + wp.SqlParam.ParameterName;
                        break;
                        ////case OP.Equ:
                        ////    sql += " and " + wp.SqlParam.ParameterName.Replace("@", "") + "=" + wp.SqlParam.ParameterName;
                        ////    break;
                        ////case OP.UE:
                        ////    sql += " and " + wp.SqlParam.ParameterName.Replace("@", "") + "<>" + wp.SqlParam.ParameterName;
                        ////    break;
                        ////case OP.More:
                        ////    sql += " and " + wp.SqlParam.ParameterName.Replace("@", "") + ">" + wp.SqlParam.ParameterName;
                        ////    break;
                        ////case OP.MoE:
                        ////    sql += " and " + wp.SqlParam.ParameterName.Replace("@", "") + ">=" + wp.SqlParam.ParameterName;
                        ////    break;
                        ////case OP.Less:
                        ////    sql += " and " + wp.SqlParam.ParameterName.Replace("@", "") + "<" + wp.SqlParam.ParameterName;
                        ////    break;
                        ////case OP.LoE:
                        ////    sql += " and " + wp.SqlParam.ParameterName.Replace("@", "") + "<=" + wp.SqlParam.ParameterName;
                        ////    break;
                }
            }
            return sql;
        }
    }

    #region ConditionStringBuild
    public class WPrm {
        public SqlParameter SqlParam;
        public OP SqlOperator;
        public WPrm() {
            SqlParam = new SqlParameter();
            SqlOperator = OP.Equ;
        }
        /// <summary>
        /// WhereParam构造
        /// </summary>
        /// <param name="SqlParamName">必须以@符号开始,否则将自动在开头加@</param>
        /// <param name="SqlParamValue"></param>
        /// <param name="opt"></param>
        public WPrm(string SqlParamName, object SqlParamValue, OP opt = OP.Equ) {
            if (!SqlParamName.StartsWith("@"))
                SqlParamName = "@" + SqlParamName;
            SqlParam = new SqlParameter(SqlParamName, SqlParamValue);
            SqlOperator = opt;
        }

        /// <summary>
        /// 获取enum对象的Description属性
        /// </summary>
        /// <param name="pEnum">pEnum对象</param>
        /// <returns></returns>
        public static string GetDesc(Enum pEnum) {
            FieldInfo fi = pEnum.GetType().GetField(pEnum.ToString());
            DescriptionAttribute[] arrDesc = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            return arrDesc[0].Description;
        }
    }
    /// <summary>
    /// SQL条件运算符
    /// </summary>
    public enum OP {
        /// <summary>
        /// 等于
        /// </summary>
        [Description("=")] Equ = 0,
        /// <summary>
        /// 大于
        /// </summary>
        [Description(">")] More = 1,
        /// <summary>
        /// 大于等于
        /// </summary>
        [Description(">=")] MoE = 2,
        /// <summary>
        /// 小于
        /// </summary>
        [Description("<")] Less = 3,
        /// <summary>
        /// 小于等于
        /// </summary>
        [Description("<=")] LoE = 4,
        /// <summary>
        /// 不等于
        /// </summary>
        [Description("<>")] UE = 5,
        /// <summary>
        /// like
        /// </summary>
        [Description("like")] Like = 6,
        /// <summary>
        /// is null
        /// </summary>
        [Description("is null")] Null = 7,
        /// <summary>
        /// not is null
        /// </summary>
        [Description("not is null")] NNul = 8,
        /// <summary>
        /// in
        /// </summary>
        [Description("in")] In = 9
    };
    #endregion
}

 

posted @ 2016-09-09 10:51  enif  阅读(285)  评论(0编辑  收藏  举报
豫ICP备2021034901号