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, 望大鸟指出不足和错误
返回SqlDataReader对象的2个方法,你调用应该会报错,SqlDataReader是独占连接的,你外面有using会自动关闭数据库,不信你可以试试!
还有我觉得没有必要写2层using,浪费性能
方法还可以扩展一下,你这只能调用存储过程,觉得有点不妥
谢谢指点, 没有必要写两层using, 那只写外面的那层using吗?
还有那个SqlDataReader对象的, 应该怎样修改呢?
@xiao黎: 只要最上面那层Using就可以了
返回SqlDataReader的就不要用using了,这样读取cmd.ExecuteReader(CommandBehavior.CloseConnection);
然后在调用的地方close掉就行了
CloseConnection 在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。
@xu_happy_you: 非常感谢, 你说的明白了, 我会修改得更好的
两点小建议:
1、参数命名建议一致,你的参数名有的小写开头,有的大写开头,有的有下划线,建议保持一致
2、直接返回SqlDataReader的那几个方法好像有点问题,因为代码放在using中,当返回后连接会自动Dispose,这样就读取不到SqlDataReader中的值了。因为后来主要用ORM,这样的代码写的少,你可以验证一下是否有这个问题
谢谢指点, 那个SqlDataReader对象的, 应该怎样修改呢?
还有我想问一下, 我这个SqlHelper的写法, 执行的速度会慢吗?
@xiao黎: 不用using,直接返回,但在使用时一定要手动关闭
这样写速度应该已经比较快了
@artwl: 不用using,直接返回,但在使用时一定要手动关闭,
那同时也要把数据库的连接close咯?
还有上面那个说的: 没有必要写2层using,浪费性能. 是这样吗? 那如果只写外层的using,它会连cmd也释放吗?