C#操作数据库的方式那种好一点【DBHelper相关】
- C# code
//////////////////////////////////////////////////第一种using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using Microsoft.Practices.EnterpriseLibrary.Data.Sql;namespace DAL{ public class DBHelper { string strCon = Model.ConnectionModel.ConnectionString1; private SqlConnection connection; public SqlConnection Connection { get { string connectionString = strCon; if (connection == null) { connection = new SqlConnection(connectionString); connection.Open(); } else if (connection.State == System.Data.ConnectionState.Closed) { connection.Open(); } else if (connection.State == System.Data.ConnectionState.Broken) { connection.Close(); connection.Open(); } return connection; } } public int ExecuteCommand(string safeSql) { using (SqlCommand cmd = new SqlCommand(safeSql, Connection)) { int result = cmd.ExecuteNonQuery(); return result; } } public int ExecuteCommand(string sql, params SqlParameter[] values) { using (SqlCommand cmd = new SqlCommand(sql, Connection)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddRange(values); return cmd.ExecuteNonQuery(); } } public int ExecuteCommand2(string sql, params SqlParameter[] values) { using (SqlCommand cmd = new SqlCommand(sql, Connection)) { cmd.Parameters.AddRange(values); return cmd.ExecuteNonQuery(); } } public string GetScalar(string safeSql) { using (SqlCommand cmd = new SqlCommand(safeSql, Connection)) { string result = cmd.ExecuteScalar().ToString(); return result; } } public string GetScalar(string sql, params SqlParameter[] values) { using (SqlCommand cmd = new SqlCommand(sql, Connection)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddRange(values); string result = cmd.ExecuteScalar().ToString(); return result; } } public SqlDataReader GetReader(string safeSql) { using (SqlCommand cmd = new SqlCommand(safeSql, Connection)) { SqlDataReader reader = cmd.ExecuteReader(); return reader; } } public SqlDataReader GetReader(string sql, params SqlParameter[] values) { using (SqlCommand cmd = new SqlCommand(sql, Connection)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddRange(values); SqlDataReader reader = cmd.ExecuteReader(); return reader; } } public DataTable GetDataSet(string safeSql) { using (SqlCommand cmd = new SqlCommand(safeSql, Connection)) { DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(ds); return ds.Tables[0]; } } public DataTable GetDataSet(string sql, params SqlParameter[] values) { using (SqlCommand cmd = new SqlCommand(sql, Connection)) { DataSet ds = new DataSet(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddRange(values); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(ds); return ds.Tables[0]; } } }}//调用的方法: public DataTable GetHours(string Dep, string BeginDate, string EndDate) { string strSql = "usp_GetHours"; SqlParameter[] sp = new SqlParameter[] { new SqlParameter("@Dep",Dep), new SqlParameter("@BeginDate",BeginDate), new SqlParameter("@EndDate",EndDate), }; return base.GetDataSet(strSql, sp); }
- C# code
//////////////////////////////////////////////////第二种 public SqlDatabase GetDB(){ SqlDatabase db = new SqlDatabase(strCon); return db;}using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Data.Common;using Microsoft.Practices.EnterpriseLibrary.Data.Sql;namespace DAL{ public class sys_UserGroupServices : DBHelper { /// <summary> /// 创建一个系统用户组。 /// </summary> /// <param name="GroupName">用户组名称</param> /// <param name="MenuGroupID">菜单组别ID,暂时设置为空</param> /// <param name="Remark">描述</param> /// <returns></returns> public bool CreateUserGroup(string GroupName, string MenuGroupID,string Remark) { SqlDatabase db = base.GetDB(); string strSql = "DBO.usp_sys_UserGroupADD "; db.AddInParameter(cmd, "GroupName", DbType.String, GroupName); db.AddInParameter(cmd, "MenuGroupID", DbType.String, MenuGroupID); db.AddInParameter(cmd, "Remark", DbType.String, Remark); return db.ExecuteNonQuery(cmd) > 0 ? true : false; } }}
这哪种方式好一点?主要考虑以下几个方面:
1.对服务器的资源消耗,这个是主要的。
2.每次连接服务器之后会有一个连接一直存在(除非应用程序关闭),到底是该连上之后立刻关闭,需要操作的时候再进行连
接,还是连上之后就一直存在一个连接,等到应用程序关闭的时候再断开。
[解决办法]
具体要看的做的是什么结构和具体的需求了。如果是b/s,那么通常情况下都是要连接完成,操作完数据后,马上释放数据库连接,而c/s结构却不一定,有时候为了重复的创建连接对象可能会把一个连接对象一直使用,知道程序推出为止
[解决办法]
如果只是简单应用 这样就可以了
如果事务或者其它复杂的应用 用using的确会好一些
[解决办法]
第一种好,第二种对服务器资源消耗比第一种大多了。(复杂的过程你看不到而已)
每次连接后应立刻关闭连接,千万别开着不关,那样不但浪费资源,还容易出现各种意想不到的问题。
虽然连接关闭,但是.NET有缓存处理的,你关闭连接不代表后台也会关闭,它会自动缓存连接并重利用,及时关闭连接有助于连接的重利用,同时可以将SQL的执行错误状态及时的清除(包括事务上的错误)。