首页 新闻 搜索 专区 学院

菜鸟自己写的SqlHelper, 望大鸟指出不足和错误

0
悬赏园豆:10 [已解决问题] 解决于 2012-05-16 15:17
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace LM_DataHelper
{
    public class SqlHelper
    {
        public static SqlParameter MakeInParam(string param, object value)//input参数
        {
            return new SqlParameter(param, value);
        }

        public static int SqlExecuteNonQuery(string ConnString, string Proc_Name, params SqlParameter[] sp)//返回影响的行数
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(sp);
                    int result = cmd.ExecuteNonQuery();
                    return result;
                }
            }
        }
        public static int SqlExecuteNonQuery(string ConnString,string Proc_Name)//上面方法的重载
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    int result = cmd.ExecuteNonQuery();
                    return result;
                }
            }
        }


        public static object SqlExecuteScalar(string ConnString,string Proc_Name, params SqlParameter[] sp)//返回查询结果的第一行的第一列数据
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(sp);
                    object result = cmd.ExecuteScalar();
                    return result;
                }
            }
        }
        public static object SqlExecuteScalar(string ConnString,string Proc_Name)//上面方法的重载
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    object result = cmd.ExecuteScalar();
                    return result;
                }
            }
        }


        public static object ReturnProc(string ConnString,string Proc_Name,SqlDbType type, params SqlParameter[] sp)//返回存储过程return的值
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(sp);
                    SqlParameter s = new SqlParameter("@return", type);
                    s.Direction = ParameterDirection.ReturnValue;
                    cmd.Parameters.Add(s);
                    cmd.ExecuteNonQuery();
                    object result = cmd.Parameters["@return"].Value;
                    return result;
                }
            }
        }
        public static object ReturnProc(string ConnString,string Proc_Name,SqlDbType type)//上面方法的重载
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    SqlParameter s = new SqlParameter("@return", type);
                    s.Direction = ParameterDirection.ReturnValue;
                    cmd.Parameters.Add(s);
                    cmd.ExecuteNonQuery();
                    object result = cmd.Parameters["@return"].Value;
                    return result;
                }
            }
        }


        public static SqlDataReader GetReader(string ConnString,string Proc_Name, params SqlParameter[] sp)//返回一个reader对象
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(sp);
                    SqlDataReader reader = cmd.ExecuteReader();
                    return reader;
                }
            }
        }
        public static SqlDataReader GetReader(string ConnString,string Proc_Name)//上面方法的重载
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    SqlDataReader reader = cmd.ExecuteReader();
                    return reader;
                }
            }
        }


        public static DataTable GetDataTable(string ConnString,string Proc_Name, params SqlParameter[] sp)//返回DataTable对象
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(sp);
                    SqlDataAdapter ada = new SqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    ada.Fill(ds);
                    return ds.Tables[0];
                }
            }
        }
        public static DataTable GetDataTable(string ConnString,string Proc_Name)//上面方法的重载
        {
            using (SqlConnection Conn = new SqlConnection(ConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    Conn.Open();
                    cmd.Connection = Conn;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = Proc_Name;
                    cmd.Parameters.Clear();
                    SqlDataAdapter ada = new SqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    ada.Fill(ds);
                    return ds.Tables[0];
                }
            }
        }
    }
}

菜鸟自己写的SqlHelper, 望大鸟指出不足和错误

AaronLi的主页 AaronLi | 初学一级 | 园豆:42
提问于:2012-05-15 14:40
< >
分享
最佳答案
0
返回SqlDataReader对象的2个方法,你调用应该会报错,SqlDataReader是独占连接的,你外面有using会自动关闭数据库,不信你可以试试!
还有我觉得没有必要写2层using,浪费性能
方法还可以扩展一下,你这只能调用存储过程,觉得有点不妥
            
收获园豆:5
xu_happy_you | 菜鸟二级 |园豆:222 | 2012-05-15 14:53

谢谢指点, 没有必要写两层using, 那只写外面的那层using吗?

还有那个SqlDataReader对象的, 应该怎样修改呢?

AaronLi | 园豆:42 (初学一级) | 2012-05-15 17:19

@xiao黎: 只要最上面那层Using就可以了

返回SqlDataReader的就不要用using了,这样读取cmd.ExecuteReader(CommandBehavior.CloseConnection);

然后在调用的地方close掉就行了

CloseConnection 在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。

xu_happy_you | 园豆:222 (菜鸟二级) | 2012-05-15 17:28

@xu_happy_you: 非常感谢, 你说的明白了, 我会修改得更好的 

AaronLi | 园豆:42 (初学一级) | 2012-05-15 17:41
其他回答(1)
1

两点小建议:

1、参数命名建议一致,你的参数名有的小写开头,有的大写开头,有的有下划线,建议保持一致

2、直接返回SqlDataReader的那几个方法好像有点问题,因为代码放在using中,当返回后连接会自动Dispose,这样就读取不到SqlDataReader中的值了。因为后来主要用ORM,这样的代码写的少,你可以验证一下是否有这个问题

收获园豆:4
artwl | 园豆:16536 (专家六级) | 2012-05-15 14:54

谢谢指点, 那个SqlDataReader对象的, 应该怎样修改呢?

还有我想问一下, 我这个SqlHelper的写法, 执行的速度会慢吗?

支持(0) 反对(0) AaronLi | 园豆:42 (初学一级) | 2012-05-15 17:20

@xiao黎: 不用using,直接返回,但在使用时一定要手动关闭

这样写速度应该已经比较快了

支持(0) 反对(0) artwl | 园豆:16536 (专家六级) | 2012-05-15 17:23

@artwl: 不用using,直接返回,但在使用时一定要手动关闭,

那同时也要把数据库的连接close咯?

还有上面那个说的: 没有必要写2层using,浪费性能. 是这样吗? 那如果只写外层的using,它会连cmd也释放吗?

支持(0) 反对(0) AaronLi | 园豆:42 (初学一级) | 2012-05-15 17:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册