DBHelper.......ASP.NET

好吧的啊 2015-03-25 03:50:39

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好像有不对的地方,,,请各位大神做下点评啊
...全文
286 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
好吧的啊 2015-03-31
  • 打赏
  • 举报
回复
引用 9 楼 xuanbg 的回复:
[quote=引用 6 楼 u013035580 的回复:] [quote=引用 5 楼 slyzly 的回复:] SqlConnection conn = new SqlConnection(GetConString);应该作为局部变量,而不是放在全局,而且你写的还是静态的,静态的对象就是内存中只有一份数据,根据引用类型知识,如果两个人同时浏览网页,第二个人先比第一个人访问完毕,那个第一个人再执行SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);这段代码时,实际上数据库连接已经被第二个人访问了后关闭了,导致错误。一般访问人多的时候就会发现,一两个人一般不容易发现。
这样不会报,,应用池线程堆满吗?[/quote]
            using (var conn = new SqlConnection(connStr))
            {
                conn.Open();
               // 你的代码
           }
这样不就可以了[/quote] 还有没有别的错误
_雨后初晴_ 2015-03-30
  • 打赏
  • 举报
回复
ExecuteReader 是在线的,大数据用 他是游标一行一行的读,不灵活,也不能往回读 DataSet是在线离线都支持的,小数据用,比较灵活,想读那里读那里,不用像ExecuteReader死板 要是小数据建议用DataSet 我们公司现在都很少用Reader, 用的比较多的是DataSet
zwbdabc 2015-03-29
  • 打赏
  • 举报
回复
写得错误很多,楼主要加油啊
software_artisan 2015-03-29
  • 打赏
  • 举报
回复
引用 6 楼 u013035580 的回复:
[quote=引用 5 楼 slyzly 的回复:] SqlConnection conn = new SqlConnection(GetConString);应该作为局部变量,而不是放在全局,而且你写的还是静态的,静态的对象就是内存中只有一份数据,根据引用类型知识,如果两个人同时浏览网页,第二个人先比第一个人访问完毕,那个第一个人再执行SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);这段代码时,实际上数据库连接已经被第二个人访问了后关闭了,导致错误。一般访问人多的时候就会发现,一两个人一般不容易发现。
这样不会报,,应用池线程堆满吗?[/quote]
            using (var conn = new SqlConnection(connStr))
            {
                conn.Open();
               // 你的代码
           }
这样不就可以了
software_artisan 2015-03-29
  • 打赏
  • 举报
回复
引用 5 楼 slyzly 的回复:
SqlConnection conn = new SqlConnection(GetConString);应该作为局部变量,而不是放在全局,而且你写的还是静态的,静态的对象就是内存中只有一份数据,根据引用类型知识,如果两个人同时浏览网页,第二个人先比第一个人访问完毕,那个第一个人再执行SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);这段代码时,实际上数据库连接已经被第二个人访问了后关闭了,导致错误。一般访问人多的时候就会发现,一两个人一般不容易发现。
+1
好吧的啊 2015-03-26
  • 打赏
  • 举报
回复
引用 5 楼 slyzly 的回复:
SqlConnection conn = new SqlConnection(GetConString);应该作为局部变量,而不是放在全局,而且你写的还是静态的,静态的对象就是内存中只有一份数据,根据引用类型知识,如果两个人同时浏览网页,第二个人先比第一个人访问完毕,那个第一个人再执行SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);这段代码时,实际上数据库连接已经被第二个人访问了后关闭了,导致错误。一般访问人多的时候就会发现,一两个人一般不容易发现。
这样不会报,,应用池线程堆满吗?
事理 2015-03-25
  • 打赏
  • 举报
回复
SqlConnection conn = new SqlConnection(GetConString);应该作为局部变量,而不是放在全局,而且你写的还是静态的,静态的对象就是内存中只有一份数据,根据引用类型知识,如果两个人同时浏览网页,第二个人先比第一个人访问完毕,那个第一个人再执行SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);这段代码时,实际上数据库连接已经被第二个人访问了后关闭了,导致错误。一般访问人多的时候就会发现,一两个人一般不容易发现。
好吧的啊 2015-03-25
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
到底哪一行报错? 完整错误信息是啥
忘记是哪一行了。。但是。。。我记得是哪个方法,,,返回SqlDataReader对面哪个方法报错了,其他的都没,,, 就是在写接口,然后他要把一级类分和二级分类做成一个接口,,然后写成接口,也就是说,我先查询一级分类,调用SqlDataReader方法,然后在通过Id查询二级分类,调用SqlDataReader,,,平时没错,用着用着就报错了,,或者我一直按F5,,一二分钟这个错就来了。。。是在IIs上测试。。
於黾 2015-03-25
  • 打赏
  • 举报
回复
到底哪一行报错? 完整错误信息是啥
好吧的啊 2015-03-25
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
自己写的……这种东西,哎 我就用用Entlib……
其实抱一个错,很纳闷。。。 ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为打开。 就是这个东西
  • 打赏
  • 举报
回复
自己写的……这种东西,哎 我就用用Entlib……

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧