三层中最重要的SqlHelper类

1:连接数据库(在表示层中添加应用配置文件,写上以下代码)

App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="constr" connectionString="server=.;uid=sa;pwd= ;database=DB" providerName="System.Data.SqlClient"/>
    </connectionStrings>
</configuration>

2: 定义静态只读的连接字符,并在构造中给赋值

连接字符串STRCONN
private static readonly string  STRCONN= null;

        static SqlHelper()
        {
            STRCONN= System.Configuration.ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
        }

3: 返回受影响的行数(通常我们在创建存储过程的时候,为了提升性能,都会使用set nocount on 的代码关掉受影响的行数,但是我们可以通过返回@@error的数量是否为零,从而判断,调用该方法执行是否成功!)

方法ExecuteNonQuery()
        public static int ExecuteNonQuery(string cmdText, CommandType commandType = CommandType.StoredProcedure, params SqlParameter[] values)
        {
            int result = -1;
            using (SqlConnection conn=new SqlConnection(STRCONN))
            {
                using (SqlCommand cmd=new SqlCommand(cmdText,conn))
                {
                    cmd.CommandType = commandType;
                    cmd.Parameters.AddRange(values);
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    if (cmd.Parameters.Contains("@ReturnValue"))
                    {
                        object error = cmd.Parameters["@ReturnValue"].Value;
                        if (error != null && error != DBNull.Value)
                        {
                            result = Convert.ToInt32(error);
                        }
                    }
                }
            }
            return result;
        }

4: 用于实体中的属性和数据库中的字段相关联对应(赋值)

方法ExecuteDataReader()
private static T ExecuteDataReader<T>(SqlDataReader dr)
        {
            T obj = default(T);
            Type type = typeof(T);
            PropertyInfo[] propertyInfos = type.GetProperties();
            int columnCount = dr.FieldCount;
            obj = Activator.CreateInstance<T>();
            foreach (PropertyInfo propertyInfo in propertyInfos)
            {
                string propertyName = propertyInfo.Name;
                for (int i = 0; i < columnCount; i++)
                {
                    string columnName = dr.GetName(i);
                    if (string.Compare(propertyName, columnName, true) == 0)
                    {
                        object value = dr.GetValue(i);
                        if (value != null && value != DBNull.Value)
                        {
                            propertyInfo.SetValue(obj, value, null);
                        }
                        break;
                    }
                }
            }
            return obj;
        }

5: 返回一个对象

方法ExecuteEntity()
public static T ExecuteEntity<T>(string cmdText, CommandType commandType = CommandType.StoredProcedure, params SqlParameter[] values)
        {
            T obj = default(T);
            using (SqlConnection con = new SqlConnection(CONNECTION_STRING))
            {
                using (SqlCommand cmd = new SqlCommand(cmdText, con))
                {
                    cmd.CommandType = commandType;
                    cmd.Parameters.AddRange(values);
                    con.Open();
                    using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        while (dr.Read())
                        {
                            obj = ExecuteDataReader<T>(dr);
                            break;
                        }
                    }
                }
            }
            return obj;
        }

6: 返回List<T>集合

方法ExecuteList()
public static List<T> ExecuteList<T>(string cmdText,CommandType commandType= CommandType.StoredProcedure,params SqlParameter[] values)
        {
            List<T> list = new List<T>();
            using (SqlConnection conn=new SqlConnection(STRCONN))
            {
                using (SqlCommand cmd=new SqlCommand(cmdText,conn))
                {
                    cmd.CommandType = commandType;
                    cmd.Parameters.AddRange(values);
                    conn.Open();
                    using (SqlDataReader dr=cmd.ExecuteReader( CommandBehavior.CloseConnection))
                    {
                        while (dr.Read())
                        {
                            T obj = ExecuteDataReader<T>(dr);
                            list.Add(obj);
                        }
                    }
                }
            }
            return list;
        }
因为相信,所以我去做了......
原文地址:https://www.cnblogs.com/jeffqing/p/2748690.html