我这个连接数据库的类有问题,大家看一下?

gdoucwx 2008-07-10 02:37:35
下面这个类怎么写才好。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// DataBase 的摘要说明
/// </summary>
public class DataBase
{
private static DataBase _instance;
private static SqlConnection con;

//私有化构造器
private DataBase()
{
}

//获取DataBase的实例
public static DataBase GetInstance()
{
if (_instance == null)
{
_instance = new DataBase();
}
return _instance;
}

//创建数据库连接,返回一个SqlConnection
public static SqlConnection ReturnConn()
{
if (con == null)
{
string strConn = ConfigurationManager.ConnectionStrings["GDOUSCIMISConn"].ConnectionString;
con = new SqlConnection(strConn);
}
if (con.State.Equals(ConnectionState.Closed))
{
con.Open();
}
return con;
}

//根据参数,调用重载方法,执行存储过程,返回一个SqlCommand
public static SqlCommand CreateCmd(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = new SqlCommand();
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Connection = Conn;
Cmd.CommandText = procName;
if (prams != null)
{
foreach (SqlParameter parameter in prams)
{
if (parameter != null)
{
Cmd.Parameters.Add(parameter);
}
}
}
return Cmd;
}

就这一个类,整个网站就会用到同一个con连接,这样写就会提示sqlDataReader已关闭
如果我不加
 if (con == null)
那就会提示连接池超过了最大连接数这个问题。
因此连接数据库的类要怎么写才好呢?
...全文
92 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
glboy12 2008-07-10
  • 打赏
  • 举报
回复
try
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName, prams);
SqlDataAdapter Dtr = new SqlDataAdapter();
DataSet Ds = new DataSet();
Dtr.SelectCommand = Cmd;
Dtr.Fill(Ds);
DataTable Dt = Ds.Tables[0];
Conn.Close();
return Dt;
}
catch (Exception ex)
{
return null;
}
finally
{
Conn.Close();
}
hackztx 2008-07-10
  • 打赏
  • 举报
回复
public static sqlconnection getcon(0
{
return getcon(web.config.string);
}
public static sqlconnection getcon(string strsqlserverstring)
{
sqlconnection con=new sqlconnection(strsqlserverstring);
con.open();
return con;
}
快乐的毛毛虫 2008-07-10
  • 打赏
  • 举报
回复
既然是static sqlconnection的话,为什么不放到 构造函数里面去写呢。而且你要注意建立连接的时候,不要打开连接。什么时候用,就打开,用完了关闭。
viena 2008-07-10
  • 打赏
  • 举报
回复
晕,重复帖
另一帖中已回复~
gdoucwx 2008-07-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shoushii 的回复:]
private static SqlConnection con;
兄弟,这个根本就不能这么实现。
这个连接在并发情况下必须出错。
在静态方法中创建新的连接
应该
[/Quote]

这们兄弟,你指的在静态方法中创建新的连接是怎样的呢,可否发一段代码来看看,谢了。
gdoucwx 2008-07-10
  • 打赏
  • 举报
回复
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// DataBase 的摘要说明
/// </summary>
public class DataBase
{
private static DataBase _instance;

//私有化构造器
private DataBase()
{
}

//获取DataBase的实例
public static DataBase GetInstance()
{
if (_instance == null)
{
_instance = new DataBase();
}
return _instance;
}

//创建数据库连接,返回一个SqlConnection
public static SqlConnection ReturnConn()
{
string strConn = ConfigurationManager.ConnectionStrings["GDOUSCIMISConn"].ConnectionString;
SqlConnection Conn = new SqlConnection(strConn);
if (Conn.State.Equals(ConnectionState.Closed))
{
Conn.Open();
}
return Conn;
}

//根据参数,调用重载方法,执行存储过程,返回一个SqlCommand
public static SqlCommand CreateCmd(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = new SqlCommand();
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Connection = Conn;
Cmd.CommandText = procName;
if (prams != null)
{
foreach (SqlParameter parameter in prams)
{
if (parameter != null)
{
Cmd.Parameters.Add(parameter);
}
}
}
return Cmd;
}
//根据参数调用重载方法,执行存储过程返回DataTable
public static DataTable RunProcGetTable(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName, prams);
SqlDataAdapter Dtr = new SqlDataAdapter();
DataSet Ds = new DataSet();
Dtr.SelectCommand = Cmd;
Dtr.Fill(Ds);
DataTable Dt = Ds.Tables[0];
Conn.Close();
return Dt;
}

原来我是这样写的,这样的话多人一起访问的时候,就会出现
"异常详细信息: System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。"
在web.config里我已经设置了如下:
<connectionStrings>
<add name="GDOUSCIMISConn" connectionString="Data Source=K513CSERVER;Initial Catalog=GDOUSCIMIS;User ID=sa;Password=123456;Max Pool Size = 300;" providerName="System.Data.SqlClient"/>
</connectionStrings>

请问如何解决?
zhangzwa 2008-07-10
  • 打赏
  • 举报
回复
如提示sqldatareader关闭说明连接已经断掉了。

sqldatareader在连接断掉的时候会自动关闭。

建议尽量少使用 datareader,因为一个datareader就会占用一个连接,datareader多了就会有很多个连接,所以如果断开连接datareader就关闭,不断开就超过连接数。

建议使用DATASET,而且连接完成后即时断开连接,DATASET 可以在连接断开之后独立存在与暂存区,不依赖连接。
shoushii 2008-07-10
  • 打赏
  • 举报
回复
private static SqlConnection con;
兄弟,这个根本就不能这么实现。
这个连接在并发情况下必须出错。

应该在静态方法中创建新的连接
sheng9hhd 2008-07-10
  • 打赏
  • 举报
回复
方式一using(...conn..){}
方式二及时close()dispose()
gdoucwx 2008-07-10
  • 打赏
  • 举报
回复
我在后面的每个方法里都把它给close()了,但是问题还在呀
  public static DataTable RunProcGetTable(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName, prams);
SqlDataAdapter Dtr = new SqlDataAdapter();
DataSet Ds = new DataSet();
Dtr.SelectCommand = Cmd;
Dtr.Fill(Ds);
DataTable Dt = Ds.Tables[0];
Conn.Close();
return Dt;
}
zhangzwa 2008-07-10
  • 打赏
  • 举报
回复
提示一下,系统报什么错?
JustLovePro 2008-07-10
  • 打赏
  • 举报
回复
每个方法体里,凡是用到con.open()的,用完了立即con.close();
而后再用到的时候,在打开---记得及时关闭~

62,132

社区成员

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

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

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

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