刚写的SQLHelper,已经验证。使用这个帮助类有个条件,那就是实体类的公开属性必须和数据库的字段对应(忽略大小写),

否则通过实体类反射数据库的字段将会对应不上,结果你懂的

using System;
using System.Data;
using System.Xml;
using System.Data.SqlClient;
using System.Collections;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Reflection;
using System.Configuration;
using System.Text;
namespace DAL
{
    public class SQLHelper
    {
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        public static string sConn
        {
            get
            {
                return ConfigurationManager.ConnectionStrings["ahap"].ConnectionString;
            }
        }

        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="queryColumn">查询的字段</param>
        /// <param name="tableName">查询的表名</param>
        /// <param name="dataTableName">返回的DataTable名称</param>
        /// <param name="strwhere">条件</param>
        /// <param name="orderBy">排序</param>
        /// <returns>DataTable</returns>
        public static DataTable Query(string queryColumn, string tableName, string dataTableName, string strwhere, string orderBy)
        {
            string sql = string.Format("select {0} from {1} where 1=1 {2} {3}", queryColumn, tableName, strwhere, orderBy);
            DataTable table = new DataTable(dataTableName);
            try
            {
                using (SqlConnection con = new SqlConnection(sConn))
                {
                    SqlDataAdapter adapter = new SqlDataAdapter(sql, con);
                    adapter.Fill(table);
                    return table;
                }
            }
            catch (Exception ex)
            {

                return null;
            }
        }

        /// <summary>
        /// 添加(通过反射)
        /// </summary>
        /// <param name="obj">要存入的对象</param>
        /// <param name="tableName">对应的表名</param>
        /// <param name="primaryKey">对应表主键(主键默认自增,不让插入数据)</param>
        /// <returns>是否成功</returns>
        public static bool Add(object obj, string tableName, string primaryKey)
        {
            Type t = obj.GetType();
            //返回共有属性
            PropertyInfo[] pi = t.GetProperties();
            StringBuilder sql = new StringBuilder();
            sql.AppendFormat("insert into {0} ( ", tableName);
            for (int i = 0; i < pi.Length; i++)
            {
                //主键不插入数据
                if (pi[i].Name == primaryKey)
                    continue;
                sql.Append(pi[i].Name + ",");
            }
            //移除最后的逗号
            sql.Remove(sql.Length - 1, 1);
            sql.Append(") values(");
            int j = 0;
            //参数长度等于共有属性的个数减去主键个数
            SqlParameter[] paras = new SqlParameter[pi.Length - 1];
            for (int i = 0; i < pi.Length; i++)
            {
                //主键不插入数据
                if (pi[i].Name == primaryKey)
                    continue;
                sql.Append("@" + pi[i].Name + ",");
                //为参数化赋值
                object value = ConvertToDBNull(t.GetProperty(pi[i].Name).GetValue(obj, null));
                paras[j] = new SqlParameter("@" + pi[i].Name, value);
                j++;

            }
            //移除最后的逗号
            sql.Remove(sql.Length - 1, 1);
            sql.Append(" )");
            SqlConnection con = null;
            try
            {

                using (con = new SqlConnection(sConn))
                {
                    SqlCommand com = new SqlCommand(sql.ToString(), con);
                    com.Parameters.AddRange(paras);
                    con.Open();
                    com.ExecuteNonQuery();
                    return true;
                }
            }
            catch (Exception ex)
            {

                return false;
            }
        }

        /// <summary>
        /// 更新(通过反射)
        /// </summary>
        /// <param name="obj">要存入的对象</param>
        /// <param name="tableName">对应的表名</param>
        /// <param name="strwhere">更新条件</param>
        ///<param name="primaryKey">对应表主键(主键默认自增,不更新)</param>
        /// <returns>是否成功</returns>
        public static bool Update(object obj, string tableName, string strwhere, string primaryKey)
        {
            Type t = obj.GetType();

            PropertyInfo[] pi = t.GetProperties();
            StringBuilder sql = new StringBuilder();
            sql.AppendFormat("update {0} set ", tableName);
            int j = 0;
            SqlParameter[] paras = new SqlParameter[pi.Length - 1];
            for (int i = 0; i < pi.Length; i++)
            {
                //主键不更新
                if (pi[i].Name == primaryKey)
                    continue;
                sql.Append(pi[i].Name + " = @" + pi[i].Name + ",");
                //为参数化赋值
                object value = ConvertToDBNull(t.GetProperty(pi[i].Name).GetValue(obj, null));
                paras[j] = new SqlParameter("@" + pi[i].Name, value);
                j++;
            }
            //移除最后的逗号
            sql.Remove(sql.Length - 1, 1);
            sql.Append(" where 1=1 " + strwhere);
            SqlConnection con = null;
            try
            {
                using (con = new SqlConnection(sConn))
                {
                    SqlCommand com = new SqlCommand(sql.ToString(), con);
                    com.Parameters.AddRange(paras);
                    con.Open();
                    com.ExecuteNonQuery();
                    return true;
                }
            }
            catch (Exception ex)
            {
                return false;
            }

        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="tableName">对应表名</param>
        /// <param name="strwhere">条件</param>
        /// <returns>是否成功</returns>
        public static bool Delete(string tableName, string strwhere)
        {
            string sql = "delete " + tableName + " where 1=1 " + strwhere;
            SqlConnection con = null;
            try
            {
                using (con = new SqlConnection(sConn))
                {
                    SqlCommand com = new SqlCommand(sql, con);
                    con.Open();
                    com.ExecuteNonQuery();
                    return true;
                }
            }
            catch (Exception ex)
            {

                return false;
            }
        }

        /// <summary>
        /// 分页
        /// </summary>
        /// <param name="queryColumn">查询字段</param>
        /// <param name="tableName">查询表名</param>
        /// <param name="strwhere">条件</param>
        /// <param name="orderBy">排序</param>
        /// <param name="dataTableName">返回的DataTable名</param>
        /// <param name="pageSize">第几页</param>
        /// <param name="pageIndex">每页几条数据</param>
        /// <param name="primaryKey">该表主键</param>
        /// <returns>DataTable</returns>
        public static DataTable Paging(string queryColumn, string tableName, string strwhere, string orderBy, string dataTableName, int pageSize, int pageIndex, string primaryKey)
        {
            string sql = string.Format(@"
                select top({0}) {1} from {2} where 1=1 and {3}  not in (select top({4}) {5} 
                from {6} where 1=1 {7} {8}) {9} {10} ",
            pageIndex, queryColumn, tableName, primaryKey, (pageSize - 1) * pageIndex, primaryKey,
            tableName, strwhere, orderBy, strwhere, orderBy);
            DataTable table = new DataTable(dataTableName);
            try
            {
                using (SqlConnection con = new SqlConnection(sConn))
                {
                    SqlDataAdapter adapter = new SqlDataAdapter(sql, con);
                    adapter.Fill(table);
                    return table;
                }
            }
            catch (Exception ex)
            {

                return null;
            }
        }

        /// <summary>         
        /// DataSetToList         
        /// </summary>          
        /// <typeparam name="T">转换类型</typeparam>         
        /// <param name="dataSet">数据源</param>         
        /// <param name="tableIndex">需要转换表的索引</param>        
        /// /// <returns>泛型集合</returns>
        public static IList<T> DataSetToList<T>(DataSet dataset, int tableIndex)
        {
            //确认参数有效
            if (dataset == null || dataset.Tables.Count <= 0 || tableIndex < 0)
            {
                return null;
            }

            DataTable dt = dataset.Tables[tableIndex];

            IList<T> list = new List<T>();


            for (int i = 0; i < dt.Rows.Count; i++)
            {
                //创建泛型对象
                T _t = Activator.CreateInstance<T>();

                //获取对象所有属性
                PropertyInfo[] propertyInfo = _t.GetType().GetProperties();

                //属性和名称相同时则赋值
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    foreach (PropertyInfo info in propertyInfo)
                    {
                        if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
                        {
                            if (dt.Rows[i][j] != DBNull.Value)
                            {
                                info.SetValue(_t, dt.Rows[i][j], null);
                            }
                            else
                            {
                                info.SetValue(_t, null, null);
                            }

                            break;
                        }
                    }
                }

                list.Add(_t);
            }

            return list;
        }

        /// <summary>
        /// 参数化类型不能插入空值,如果为null必须转换成DBNull
        /// </summary>
        public static object ConvertToDBNull(object str)
        {
            if (str == null)
            {
                return DBNull.Value;
            }
            else
            {
                return str;
            }
        }
    }
}

 

posted on 2013-09-18 10:55  小小乌龟把头藏  阅读(290)  评论(0编辑  收藏  举报