后台就开一个文章列表怎么数据库连接数20多个啊?
我用VS2005+MSSQL2000开发的系统。数据库连接动不动就到2000多了。经常有连接数过多的提示导致网页打不开的。昨天在本机测试了一下。就开一个文章列表页连接数就达到了20多个。我读库的时候开完就关了呀。请高手指点。
我把CS代码粘上来,大家帮我看看哦。
public ado()
{
//
// TODO: 在此处添加构造函数逻辑
//
connection = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
}
/// <summary>
/// 返回数据库连接字符串
/// </summary>
public static SqlConnection con()
{//数据库连接类
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
return conn;
}
/// <summary>
/// 关闭当前数据库连接
/// </summary>
public static void CloseConn()
{
if (ado.con().State == ConnectionState.Open)
ado.con().Close();
ado.con().Dispose();
//cmd.Dispose();
}
/// <summary>
/// 根据传进来的SQL语句执行插入/删除/更新等操作
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个布而值,判断操作是否成功</returns>
public bool insert(string que)
{ //根据传进来的SQL语句执行插入/删除/更新等操作
SqlConnection conn = ado.con();
//ado.CloseConn();
//conn.Open();
SqlCommand cmd = new SqlCommand(que, conn);
int count = Convert.ToInt32(cmd.ExecuteNonQuery());
CloseConn();
if (count > 0)
return true;
else
return false;
}
/// <summary>
/// 将查询结果放入DataSet中,用于GridView,DataList等的数据绑定.
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个DataTable对像</returns>
public DataTable ds(string que)
{//返回一个装载了SQL制定留言的数据表,
SqlConnection conn = ado.con();
//ado.CloseConn();
//conn.Open();
SqlDataAdapter oda = new SqlDataAdapter();
oda.SelectCommand = new SqlCommand(que, conn);
CloseConn();
DataSet ds = new DataSet();
oda.Fill(ds);
return ds.Tables[0];
}
public SqlDataReader dr(string que)
{//返回一个装载了SQL制定留言的数据表,
SqlConnection conn = ado.con();
SqlCommand cmd = new SqlCommand(que, conn);
CloseConn();
SqlDataReader dr = cmd.ExecuteReader();
return dr;
}
/// <summary>
/// 根据传来的条件查询该项是否有内容,有就返回true
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个布而值,判断操作是否成功</returns>
public bool img(string que)
{//根据传来的条件查询该项是否有内容,有就返回true
SqlConnection conn = ado.con(); SqlCommand cmd = new SqlCommand(que, conn);
if (cmd.ExecuteNonQuery()>0)
return true;
else
return false;
CloseConn();
}
/// <summary>
/// 同样是根据传来的SQL语句返回一个字段的值
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回该查询字段的字条串形式</returns>
public string scr(string que)
{//同样是根据传来的SQL语句返回一个字段的值,我不太喜欢把SQL语句做在内中,感觉不灵活
SqlConnection conn = ado.con(); SqlCommand cmd = new SqlCommand(que, conn);
return cmd.ExecuteScalar().ToString();
CloseConn();
}
/// <summary>
/// 返回指定Sql语句的DataTable
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>DataTable</returns>
public static DataTable GetDataTable(string sqlstr)
{
SqlDataAdapter da = new SqlDataAdapter();
DataTable datatable = new DataTable();
try
{
ado.con().Open();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
da.SelectCommand = comm;
da.Fill(datatable);
CloseConn();
}
catch (Exception)
{
}
finally
{
CloseConn();
}
CloseConn();
return datatable;
}
我用VS2005+MSSQL2000开发的系统。数据库连接动不动就到2000多了。经常有连接数过多的提示导致网页打不开的。昨天在本机测试了一下。就开一个文章列表页连接数就达到了20多个。我读库的时候开完就关了呀。请高手指点。
我把CS代码粘上来,大家帮我看看哦。
public ado()
{
//
// TODO: 在此处添加构造函数逻辑
//
connection = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
}
/// <summary>
/// 返回数据库连接字符串
/// </summary>
public static SqlConnection con()
{//数据库连接类
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
return conn;
}
/// <summary>
/// 关闭当前数据库连接
/// </summary>
public static void CloseConn()
{
if (ado.con().State == ConnectionState.Open)
ado.con().Close();
ado.con().Dispose();
//cmd.Dispose();
}
/// <summary>
/// 根据传进来的SQL语句执行插入/删除/更新等操作
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个布而值,判断操作是否成功</returns>
public bool insert(string que)
{ //根据传进来的SQL语句执行插入/删除/更新等操作
SqlConnection conn = ado.con();
//ado.CloseConn();
//conn.Open();
SqlCommand cmd = new SqlCommand(que, conn);
int count = Convert.ToInt32(cmd.ExecuteNonQuery());
CloseConn();
if (count > 0)
return true;
else
return false;
}
/// <summary>
/// 将查询结果放入DataSet中,用于GridView,DataList等的数据绑定.
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个DataTable对像</returns>
public DataTable ds(string que)
{//返回一个装载了SQL制定留言的数据表,
SqlConnection conn = ado.con();
//ado.CloseConn();
//conn.Open();
SqlDataAdapter oda = new SqlDataAdapter();
oda.SelectCommand = new SqlCommand(que, conn);
CloseConn();
DataSet ds = new DataSet();
oda.Fill(ds);
return ds.Tables[0];
}
public SqlDataReader dr(string que)
{//返回一个装载了SQL制定留言的数据表,
SqlConnection conn = ado.con();
SqlCommand cmd = new SqlCommand(que, conn);
CloseConn();
SqlDataReader dr = cmd.ExecuteReader();
return dr;
}
/// <summary>
/// 根据传来的条件查询该项是否有内容,有就返回true
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个布而值,判断操作是否成功</returns>
public bool img(string que)
{//根据传来的条件查询该项是否有内容,有就返回true
SqlConnection conn = ado.con(); SqlCommand cmd = new SqlCommand(que, conn);
if (cmd.ExecuteNonQuery()>0)
return true;
else
return false;
CloseConn();
}
/// <summary>
/// 同样是根据传来的SQL语句返回一个字段的值
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回该查询字段的字条串形式</returns>
public string scr(string que)
{//同样是根据传来的SQL语句返回一个字段的值,我不太喜欢把SQL语句做在内中,感觉不灵活
SqlConnection conn = ado.con(); SqlCommand cmd = new SqlCommand(que, conn);
return cmd.ExecuteScalar().ToString();
CloseConn();
}
/// <summary>
/// 返回指定Sql语句的DataTable
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>DataTable</returns>
public static DataTable GetDataTable(string sqlstr)
{
SqlDataAdapter da = new SqlDataAdapter();
DataTable datatable = new DataTable();
try
{
ado.con().Open();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
da.SelectCommand = comm;
da.Fill(datatable);
CloseConn();
}
catch (Exception)
{
}
finally
{
CloseConn();
}
CloseConn();
return datatable;
}
解决方案 »
- 先装VS2010,后装vs2012,后者打不开数据库文件
- 连接不上 sqlserver2005
- 网页游戏中的时间控制
- jquery 与服务器控件ID
- GridView绑定数据源,插入数据后如何取得刚插入的行号?
- ADO.NET ODBC执行Informix的SP存储过程传参和返回值的问题求助!
- 遨游浏览器不能用 window.onunload()??
- 急。。。。。。。。关于iframe Web页传值问题
- 急~~~~请问如何将MAPGIS转化为MAPINTO图形格式???
- cs文件中的属性如何关联aspx界面中的控件值
- asp.net的CSS问题
- 网站没有问题,发布网站是错误 431 类型“doughty_cn.footer”同时存在于“,怎么办???
{
//SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
//string company2 = Request.Form["TextBox1"].Trim();
//lblMessage.Text = company;
DateTime startTime = DateTime.Now;
//string query;
string sqll, csql, sw, so;
string aaa, sss;
aaa = adocc.SafeRequest(TextBox1.Text.Trim());
sss = adocc.SafeRequest(DropDownList1.SelectedItem.Value.ToString());
int pagesize = 20;
int CountRecord;
page = Convert.ToInt32("0" + Request.QueryString["page"]); //int pageCount = 1;
page = page == 0 ? 1 : page; //page = Convert.ToInt32(0 + cpage);
csql = "select count(id) from aaa";
sqll = "select top "+pagesize+" * from aaa where id>0 ";
so = " order by dtime desc";
// page = page == 0 ? 1 : page;
if(aaa!="")
{
if (this.DropDownList1.SelectedItem.Value.ToString() == "hy")
{
sw = " and xingming like '%" + aaa + "%'";
}
else if (this.DropDownList1.SelectedItem.Value.ToString() == "gs")
{
sw = "and company like '%" + aaa + "%'";
}
else
{
sw = "and dianhua like '%" + aaa + "%' or freehand like '%" + aaa + "%'";
}
}
else
{
//query = "select * from aaa order by dtime desc";
sw = "";
}
if (page == 1)
{
sqll = sqll + sw + so;
}
else
{
sqll = sqll + sw + " and id not in(select top " + pagesize * (page - 1) + " id from aaa where id>0 " + sw + so + ")" + so; }
CountRecord =Convert.ToInt32( adocc.scr(csql));
int pagecount = CountRecord % pagesize == 0 ? CountRecord / pagesize : CountRecord / pagesize + 1;
GridView.DataSource = adocc.ds(sqll);
//Response.Write(sqll);
adocc ad = new adocc();
string[] file={"aaa","sss"};
string[] val={aaa,sss};
pagelist.Text = ad.PageList(CountRecord, pagecount,page, file, val);
//SqlDataAdapter objDataAdapter = new SqlDataAdapter(query, conn);
//DataSet objDataSet = new DataSet();
//objDataAdapter.Fill(objDataSet);
//GridView.DataSource = objDataSet;
GridView.DataKeyNames = new string[] { "id" };
GridView.DataBind();
//conn.Close();
DateTime endTime = DateTime.Now;
TimeSpan ts = endTime - startTime;
this.Label2.Text = "页面执行时间: " + ts.TotalMilliseconds.ToString() + " 毫秒";
GC.Collect();
adocc.CloseConn();
这个写法明显错误的!!首先 你 打开数据库连接 用了 一次 SqlConnection conn = ado.con(),注意这里有一个连接了;
最后你关数据库的时候ado.con().State == ConnectionState.Open这句话里面 又把 ado.con()调用一遍,而且你这么判断 必然每次都为open,仔细想想!!
也就是说你关数据库的时候 打开过两次数据库连接,但只关了一次.
于是就是这样的效果了.
仔细一看就看出问题了连接没有关闭!!!!并且 构造函数内一直创建了 “垃圾” connection 对象你的 CloseConn() 是错的!!!没有任何效果,你看看, 方法内通过 con() 创建一个新的 connection, 然后马上就关闭了这个新的 connection 并不是你之前正在使用的 connection !!!
因为 ado.con() 每次返回新的 connnection 对象
// ...
}
{
//
// TODO: 在此处添加构造函数逻辑
//
connection = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
}
/// <summary>
/// 返回数据库连接字符串
/// </summary>
public static SqlConnection con()
{//数据库连接类
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
return conn;
} ///// <summary>
///// 关闭当前数据库连接
///// </summary>
//public static void CloseConn()
//{
// if (ado.con().State == ConnectionState.Open)
// ado.con().Close();
// ado.con().Dispose();
// //cmd.Dispose();
//} /// <summary>
/// 根据传进来的SQL语句执行插入/删除/更新等操作
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个布而值,判断操作是否成功</returns>
public bool insert(string que)
{ //根据传进来的SQL语句执行插入/删除/更新等操作
using (SqlConnection conn = ado.con())
{
//ado.CloseConn();
conn.Open();
SqlCommand cmd = new SqlCommand(que, conn);
int count = Convert.ToInt32(cmd.ExecuteNonQuery());
//CloseConn();
if (count > 0)
return true;
else
return false;
}
}
/// <summary>
/// 将查询结果放入DataSet中,用于GridView,DataList等的数据绑定.
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个DataTable对像</returns>
public DataTable ds(string que)
{//返回一个装载了SQL制定留言的数据表,
SqlConnection conn = ado.con();
//ado.CloseConn();
//conn.Open();
SqlDataAdapter oda = new SqlDataAdapter();
oda.SelectCommand = new SqlCommand(que, conn);
//CloseConn();
DataSet ds = new DataSet();
oda.Fill(ds); // DataAdapter 自己会 open/close conn
return ds.Tables[0];
}
public SqlDataReader dr(string que)
{//返回一个装载了SQL制定留言的数据表,
using (SqlConnection conn = ado.con())
{
conn.Open();
SqlCommand cmd = new SqlCommand(que, conn);
//CloseConn();
SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); // 当调用方执行 dr.Close 自动 close connection
return dr;
}
}
/// <summary>
/// 根据传来的条件查询该项是否有内容,有就返回true
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个布而值,判断操作是否成功</returns>
public bool img(string que)
{//根据传来的条件查询该项是否有内容,有就返回true
using (SqlConnection conn = ado.con())
{
conn.Open();
SqlCommand cmd = new SqlCommand(que, conn);
if (cmd.ExecuteNonQuery() > 0)
return true;
else
return false;
}
//CloseConn();
}
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString
conn.Open();
...//你的数据库操作
conn.Close();熟能生巧,巧能出奇;最基本的多用用,然后再考虑其他的方法.比如上面提到的用using自动释放资源的方法,和封装成函数的方法.
然后每次都判断conn,不要去调用ado.con()
不然每次都是新建一个连接,而且前面的你还不关,当然就越来越多了。
{//根据传来的条件查询该项是否有内容,有就返回true
SqlConnection conn = ado.con(); SqlCommand cmd = new SqlCommand(que, conn);
if (cmd.ExecuteNonQuery()>0)
return true;
else
return false;
CloseConn();
}
/// <summary>
/// 同样是根据传来的SQL语句返回一个字段的值
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回该查询字段的字条串形式</returns>
public string scr(string que)
{//同样是根据传来的SQL语句返回一个字段的值,我不太喜欢把SQL语句做在内中,感觉不灵活
SqlConnection conn = ado.con(); SqlCommand cmd = new SqlCommand(que, conn);
return cmd.ExecuteScalar().ToString();
CloseConn();
}这两个函数有明显错误,都return了还能执行return后边的语句吗?
方法中创建新实例,其他方法中不要在创建,只要调用就可以了
public ado()
{
//
// TODO: 在此处添加构造函数逻辑
//
SqlConnection conn= null;
}
/// <summary>
/// 返回数据库连接字符串
/// </summary>
public static SqlConnection con()
{//数据库连接类
conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
return conn;
}
/// <summary>
/// 关闭当前数据库连接
/// </summary>
public static void CloseConn()
{
if (conn.State == ConnectionState.Open)
conn.Close();
conn.Dispose();
//cmd.Dispose();
}
/// <summary>
/// 根据传进来的SQL语句执行插入/删除/更新等操作
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个布而值,判断操作是否成功</returns>
public bool insert(string que)
{ //根据传进来的SQL语句执行插入/删除/更新等操作
con();
conn.Open();
SqlCommand cmd = new SqlCommand(que, conn);
int count = Convert.ToInt32(cmd.ExecuteNonQuery());
CloseConn();
if (count > 0)
return true;
else
return false;
}
或者干脆使用using
{
if (conn.State == ConnectionState.Open)
conn.Close();
conn.Dispose();
//cmd.Dispose();
}这个改为:
public static void CloseConn()
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
先不说代码逻辑了,就是代码布局和缩进就无语了,还是先看看《.NET设计规范》吧
或者定义一个Connection变量,执行语句的时候再new,执行完后Close。
public ado()
{
//
// TODO: 在此处添加构造函数逻辑
//
connection = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
}
/// <summary>
/// 返回数据库连接字符串
/// </summary>
public static SqlConnection con()
{//数据库连接类
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
return conn;
}
/// <summary>
/// 关闭当前数据库连接
/// </summary>
public static void CloseConn()
{
if (ado.con().State == ConnectionState.Open)
ado.con().Close();
ado.con().Dispose();
//cmd.Dispose();
}
public SqlDataReader dr(string que)
{//返回一个装载了SQL制定留言的数据表,
SqlConnection conn = ado.con();
SqlCommand cmd = new SqlCommand(que, conn);
CloseConn();
SqlDataReader dr = cmd.ExecuteReader();//上面都Close了 你还能返回DataReader ?糊弄人呢
return dr;
}
/// <summary>
/// 根据传来的条件查询该项是否有内容,有就返回true
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回一个布而值,判断操作是否成功</returns>
public bool img(string que)
{//根据传来的条件查询该项是否有内容,有就返回true
SqlConnection conn = ado.con(); SqlCommand cmd = new SqlCommand(que, conn);
if (cmd.ExecuteNonQuery()>0)
return true;
else
return false;
CloseConn();//上面都return 这根本执行不到 这不是写着骗自己的嘛
}
/// <summary>
/// 同样是根据传来的SQL语句返回一个字段的值
/// </summary>
/// <param name="que">查询串</param>
/// <returns>返回该查询字段的字条串形式</returns>
public string scr(string que)
{//同样是根据传来的SQL语句返回一个字段的值,我不太喜欢把SQL语句做在内中,感觉不灵活
SqlConnection conn = ado.con(); SqlCommand cmd = new SqlCommand(que, conn);
return cmd.ExecuteScalar().ToString();
CloseConn();//上面都return 这根本执行不到 这不是写着骗自己的嘛
}
/// <summary>
/// 返回指定Sql语句的DataTable
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>DataTable</returns>
public static DataTable GetDataTable(string sqlstr)
{
SqlDataAdapter da = new SqlDataAdapter();
DataTable datatable = new DataTable();
try
{
ado.con().Open();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
da.SelectCommand = comm;
da.Fill(datatable);
CloseConn();
}
catch (Exception)
{
}
finally
{
CloseConn();
}
CloseConn();//多次一举 上面都关闭了 居然还再次关闭
return datatable;
}
因为 ado.con() 每次返回新的 connnection 对象
送你一个楼主,你的写的太乱了,看的脑壳痛
我写的 给你参考下
呵呵
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
namespace DAL
{
public static class DBHelper
{
private static string conString = string.Empty; static DBHelper()
{
conString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
} /// <summary>
/// 用于执行只返回一个值的命令
/// </summary>
/// <param name="cmdText">sql语句</param>
/// <param name="cmdType">commandType</param>
/// <param name="paras">参数</param>
/// <returns></returns>
public static object ExecuteScalar(string cmdText, CommandType cmdType, params SqlParameter[] paras)
{
object scalar = null;
using (SqlConnection conneciton = new SqlConnection(conString))
{
SqlCommand cmd = new SqlCommand(cmdText, conneciton);
cmd.CommandType = cmdType;
cmd.Parameters.AddRange(paras); cmd.ExecuteScalar(); conneciton.Close();
}
return scalar;
} /// <summary>
/// 用于执行增删改命令
/// </summary>
/// <param name="cmdText">sql语句</param>
/// <param name="cmdType">commandType</param>
/// <param name="paras">参数</param>
/// <returns></returns>
public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] paras)
{
int num = 0;
using (SqlConnection connection = new SqlConnection(conString))
{
SqlCommand cmd = new SqlCommand(cmdText, connection);
cmd.CommandType = cmdType;
cmd.Parameters.AddRange(paras); num = cmd.ExecuteNonQuery(); connection.Close();
}
return num;
}
/// <summary>
/// 用于执行查询命令
/// </summary>
/// <param name="cmdText">sql语句</param>
/// <param name="cmdType">commandType</param>
/// <param name="paras">参数</param>
/// <returns></returns>
public static SqlDataReader ExecuteReader(string cmdText, CommandType cmdType, params SqlParameter[] paras)
{
using (SqlConnection connection = new SqlConnection(conString))
{
SqlCommand cmd = new SqlCommand(cmdText, connection);
cmd.CommandType = cmdType;
cmd.Parameters.AddRange(paras); return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
}
}
}
/// 关闭当前数据库连接
/// </summary>
public static void CloseConn()
{
if (ado.con().State == ConnectionState.Open)
ado.con().Close();
ado.con().Dispose();
//cmd.Dispose();
}
这里的错了
你把你的conn升级成成员变量就可以了==