DBHelper.ASP.NET解决思路
DBHelper.......ASP.NET
自己写的DBHelper好像有不对的地方,,,请各位大神做下点评啊
------解决思路----------------------
SqlConnection conn = new SqlConnection(GetConString);应该作为局部变量,而不是放在全局,而且你写的还是静态的,静态的对象就是内存中只有一份数据,根据引用类型知识,如果两个人同时浏览网页,第二个人先比第一个人访问完毕,那个第一个人再执行SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);这段代码时,实际上数据库连接已经被第二个人访问了后关闭了,导致错误。一般访问人多的时候就会发现,一两个人一般不容易发现。
using Model;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace DAL
{
public static class DbHelper
{
private static string GetConString = ConfigurationManager.ConnectionStrings["DbConnString"].ConnectionString.ToString();
private static SqlConnection conn = new SqlConnection(GetConString);
#region 初始化参数值
/// <summary>
/// 初始化参数值
/// </summary>
/// <param name="ParamName">存储过程名称或命令文本</param>
/// <param name="DbType">参数类型</param>
/// <param name="Size">参数大小</param>
/// <param name="Direction">参数方向</param>
/// <param name="Value">参数值</param>
/// <returns>新的 parameter 对象</returns>
public static SqlParameter GetSqlParameter(string ParamName, SqlDbType DbType, int Size, object Value, ParameterDirection Direction)
{
SqlParameter Param;
if (Size > 0)
Param = new SqlParameter(ParamName, DbType, Size);
else
Param = new SqlParameter(ParamName, DbType);
Param.Direction = Direction;
if (!(Direction == ParameterDirection.Output && Value == null))
Param.Value = Value;
return Param;
}
//公有方法,实例化一个用于调用存储过程的输入参数
//输入:
// ParamName - 参数名称
// DbType - 参数类型
// Size - 参数大小
// Value - 值
public static SqlParameter GetSqlParameter(string ParamName, SqlDbType DbTpye, int Size, object Value)
{
return GetSqlParameter(ParamName, DbTpye, Size, Value, ParameterDirection.Input);
}
#endregion
#region 打开数据连接
/// <summary>
/// 获取连接对象
/// </summary>
/// <returns></returns>
public static void OpenConnection()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
}
#endregion
#region 关闭数据连接
/// <summary>
/// 关闭数据连接
/// </summary>
/// <returns></returns>
public static void CloseConnection()
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
#endregion
#region 获取命令对象
/// <summary>
/// 获取命令对象
/// </summary>
/// <param name="strSql">执行的SQL语句</param>
/// <returns></returns>
public static SqlCommand GetCommand(string strSql, CommandType commandType, SqlParameter[] parameters)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = commandType;
cmd.CommandText = strSql;
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
}
return cmd;
}
#endregion
#region 执行一个查询,并返回结果集
#region 执行一个查询,并返回查询结果
/// <summary>
/// 执行一个查询,并返回查询结果
/// </summary>
/// <param name="sql">要执行的sql语句</param>
/// <param name="commandtype">要执行查询语句的类型,如存储过程或者sql文本命令</param>
/// <param name="parameters">Transact-SQL语句或者存储过程参数数组</param>
/// <returns></returns>
public static DataTable ExecuteDataTable(string sql, CommandType commandtype, SqlParameter[] parameters)
{
DataTable data = new DataTable(); //实例化datatable,用于装载查询结果集
SqlDataAdapter adapter = null;
SqlCommand cmd = GetCommand(sql, commandtype, parameters);
try
{
OpenConnection();
adapter = new SqlDataAdapter("", conn);
adapter.Fill(data);//填充datatable
}
catch (Exception)
{
throw;
}
finally
{
cmd.Parameters.Clear();
CloseConnection();
adapter.Dispose();
cmd.Dispose();
}
return data;
}
#endregion
#endregion
#region 返回一个SqlDataReader对象的实例
#region 返回一个sqldatareader对象的实例
/// <summary>
/// 返回一个sqldatareader对象的实例
/// </summary>
/// <param name="sql"></param>
/// <param name="commandType"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public static SqlDataReader ExecuteReader(string sql, CommandType commandType, SqlParameter[] parameters)
{
SqlCommand cmd = GetCommand(sql, commandType, parameters);
OpenConnection();
//CommandBehavior.CloseConnection参数指示关闭reader对象时关闭与其关联的Connection对象
//SqlDataReader reader = cmd.ExecuteReader();
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
#endregion
#endregion
#region 执行一个查询,返回结果集的首行首列。忽略其他行,其他列
/// <summary>
/// 执行一个查询,返回结果集的首行首列。忽略其他行,其他列
/// </summary>
/// <param name="sql"></param>
/// <param name="commandType">参数类型</param>
/// <param name="parameters"></param>
/// <returns></returns>
public static string ExecuteScalar(string sql, CommandType commandType, SqlParameter[] parameters)
{
object result = null;
SqlCommand cmd = GetCommand(sql, commandType, parameters);
try
{
OpenConnection();
result = cmd.ExecuteScalar();
}
catch (Exception)
{
throw;
}
finally
{
CloseConnection();
cmd.Dispose();
cmd.Parameters.Clear();
}
return Convert.ToString(result);
}
#endregion
#region 对数据库进行增删改的操作
/// <summary>
/// 对数据库进行增删改的操作
/// </summary>
/// <param name="sql">要执行的sql语句</param>
/// <param name="commandType">要执行的查询语句类型,如存储过程或者sql文本命令</param>
/// <param name="parameters">Transact-SQL语句或者存储过程的参数数组</param>
/// <returns></returns>
public static int ExecuteNonQuery(string sql, CommandType commandType, SqlParameter[] parameters)
{
int count = 0;
SqlCommand cmd = GetCommand(sql, commandType, parameters);
try
{
OpenConnection();
count = cmd.ExecuteNonQuery();
}
catch (Exception)
{
throw;
}
finally
{
CloseConnection();
cmd.Dispose();
cmd.Parameters.Clear();
}
return count;
}
#endregion
#region 执行事务,返回受影响的行数
/// <summary>
/// 执行事务,返回受影响的行数
/// </summary>
/// <param name="sql"></param>
/// <param name="commandType"></param>
/// <param name="parameters"></param>
public static int GetTransactionDataTable(string sql, CommandType commandType, SqlParameter[] parameters)
{
int result = 0;
SqlTransaction myTrans = null;
SqlCommand cmd = GetCommand(sql, commandType, parameters);
try
{
OpenConnection();
myTrans = conn.BeginTransaction(); //使用New新生成一个事务
cmd.Transaction = myTrans;
result = cmd.ExecuteNonQuery();
myTrans.Commit();
}
catch (Exception)
{
myTrans.Rollback();
}
finally
{
CloseConnection();
cmd.Dispose();
cmd.Parameters.Clear();
}
return result;
}
#endregion
}
}
自己写的DBHelper好像有不对的地方,,,请各位大神做下点评啊
------解决思路----------------------
SqlConnection conn = new SqlConnection(GetConString);应该作为局部变量,而不是放在全局,而且你写的还是静态的,静态的对象就是内存中只有一份数据,根据引用类型知识,如果两个人同时浏览网页,第二个人先比第一个人访问完毕,那个第一个人再执行SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);这段代码时,实际上数据库连接已经被第二个人访问了后关闭了,导致错误。一般访问人多的时候就会发现,一两个人一般不容易发现。