提高C# 数据库类性能问题。。?

dys_198102 2009-03-25 02:19:26
这是数据库类,有位高手说了下边的数据库类的数据交互只用一个打开链接,如果多个页面多人同时访问可能会死掉,如果下边的数据库真有这种问题,应怎么解决??那下边的数据库类代码应怎样改????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.Text.RegularExpressions;
//using System.Data.OleDb;
using System.Data.SqlClient;

/// <summary>
///WebData 的摘要说明
/// </summary>
public class WebData
{
protected static SqlConnection conn = new SqlConnection();
protected static SqlCommand comm = new SqlCommand();

public WebData()
{
//
//TODO: 在此处添加构造函数逻辑
//
}

/// <summary>
/// 打开数据库连接
/// </summary>
private static void openConnection()
{
if (conn.State == ConnectionState.Closed)
{
conn.ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["xiaoxue"].ConnectionString;
comm.Connection = conn;
try
{
conn.Open();
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
}
/// <summary>
/// 关闭当前数据库连接
/// </summary>
private static void closeConnection()
{
if (conn.State == ConnectionState.Open)
conn.Close();
conn.Dispose();
comm.Dispose();
}
/// <summary>
/// 执行Sql查询语句
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
public static void ExecuteSql(string sqlstr)
{
try
{
openConnection();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
comm.ExecuteNonQuery();
}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
closeConnection();
}
}

/// <summary>
/// 执行Sql更新语句
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>布尔值</returns>
public static bool ExecuteUpdate(string sqlstr)
{
int isUpdateOk = 0;
try
{
openConnection();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
isUpdateOk = Convert.ToInt32(comm.ExecuteNonQuery());
}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
closeConnection();
}
if (isUpdateOk > 0)
{
return true;
}
else
{
return false;
}
}

/// <summary>
/// 执行Sql查询语句并返回第一行的第一条记录,返回值为object 使用时需要拆箱操作 -> Unbox
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>object 返回值 </returns>
public static object ExecuteScalar(string sqlstr)
{
object obj = new object();
try
{
openConnection();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
obj = comm.ExecuteScalar();
}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
closeConnection();
}
return obj;
}

/// <summary>
/// 返回指定Sql语句的SqlDataReader,请注意,在使用后请关闭本对象,同时将自动调用closeConnection()来关闭数据库连接
/// 方法关闭数据库连接
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>SqlDataReader对象</returns>
public static SqlDataReader dataReader(string sqlstr)
{
SqlDataReader dr = null;
try
{
openConnection();
comm.CommandText = sqlstr;
comm.CommandType = CommandType.Text;
dr = comm.ExecuteReader(CommandBehavior.CloseConnection);
}
catch
{
try
{
dr.Close();
closeConnection();
}
catch
{
}
}
return dr;
}

///<summary>
///关闭datareader
///传入SqlDataReader的ref
///</summary>
public static void closeDataReader(ref SqlDataReader sdr)
{
try
{
sdr.Close();
sdr.Dispose();
}
catch (Exception)
{ }
}

/// <summary>
/// 返回指定Sql语句的DataSet
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>DataSet</returns>
public static DataSet dataSet(string sqlstr)
{
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();
try
{
openConnection();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
da.SelectCommand = comm;
da.Fill(ds);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
closeConnection();
}
return ds;
}

/// <summary>
/// 返回指定Sql语句的DataSet
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <param name="ds">传入的引用DataSet对象</param>
public static void dataSet(string sqlstr, ref DataSet ds)
{
SqlDataAdapter da = new SqlDataAdapter();
try
{
openConnection();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
da.SelectCommand = comm;
da.Fill(ds);
}
catch (Exception e)
{
throw new Exception(e.Message);
}

finally
{
closeConnection();
}
}
/// <summary>
/// 返回指定Sql语句的DataTable
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>DataTable</returns>
public static DataTable dataTable(string sqlstr)
{
SqlDataAdapter da = new SqlDataAdapter();
DataTable datatable = new DataTable();
try
{
openConnection();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
da.SelectCommand = comm;
da.Fill(datatable);
}
catch (Exception)
{
}
finally
{
closeConnection();
}
return datatable;
}

/// <summary>
/// 执行指定Sql语句,同时给传入DataTable进行赋值
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <param name="dt">ref DataTable dt </param>
public static void dataTable(string sqlstr, ref DataTable dt)
{
SqlDataAdapter da = new SqlDataAdapter();
try
{
openConnection();
comm.CommandType = CommandType.Text;
comm.CommandText = sqlstr;
da.SelectCommand = comm;
da.Fill(dt);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
closeConnection();
}
}

...全文
627 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
一点晨辉 2010-12-24
  • 打赏
  • 举报
回复
我想不同的数据库应该不一样吧 跟数据库性能还是有点关系的吧?
fx_blog 2010-09-20
  • 打赏
  • 举报
回复
using(SqlConnection conn = new SqlConnection(constr))
{
}

一般就不会了.
数智前沿 2009-11-05
  • 打赏
  • 举报
回复
将建立数据连接的代码段放在构造函数中如何,同时将释放连接的代码段放在析构函数中,我试过可以,但是用户量不大,不知大用户量情况下会不会死锁。
dys_198102 2009-04-18
  • 打赏
  • 举报
回复
郁闷关闭OleDbDataReader有问题。????????????
dys_198102 2009-04-17
  • 打赏
  • 举报
回复
/// <summary>
/// 返回指定Sql语句的DataSet
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>DataSet</returns>
public static DataSet dataSet(string sqlstr)
{

DataSet ds=new DataSet();
OleDbDataAdapter drr=new OleDbDataAdapter();
using (OleDbConnection conn = new OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["webtest"].ConnectionString))
{
using (OleDbCommand cmd = new OleDbCommand(sqlstr, conn))
{
try
{
conn.Open();
drr.SelectCommand=cmd;
drr.Fill(ds);
return ds;
}
catch (System.Data.OleDb.OleDbException e)
{
conn.Close();
throw e;
}
finally
{

cmd.Dispose();
conn.Close();
}

}
}
}



/// <summary>
/// 返回指定Sql语句的DataSet
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <param name="ds">传入的引用DataSet对象</param>
public static void dataSet(string sqlstr, ref DataSet ds)
{
OleDbDataReader dr = null;
OleDbDataAdapter drr = new OleDbDataAdapter();
using (OleDbConnection conn = new OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["webtest"].ConnectionString))
{
using (OleDbCommand cmd = new OleDbCommand(sqlstr, conn))
{
try
{
conn.Open();
drr.SelectCommand = cmd;
drr.Fill(ds);


}
catch (System.Data.OleDb.OleDbException e)
{
conn.Close();
throw e;
}
finally
{

cmd.Dispose();
conn.Close();
}

}
}
}
/// <summary>
/// 返回指定Sql语句的DataTable
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>DataTable</returns>
public static DataTable dataTable(string sqlstr)
{
OleDbDataAdapter da = new OleDbDataAdapter();
DataTable datatable = new DataTable();
using (OleDbConnection conn = new OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["webtest"].ConnectionString))
{
using (OleDbCommand cmd = new OleDbCommand(sqlstr, conn))
{
try
{
conn.Open();
da.SelectCommand = cmd;
da.Fill(datatable);
return datatable;
}
catch (System.Data.OleDb.OleDbException e)
{
conn.Close();
throw e;
}
finally
{

cmd.Dispose();
conn.Close();
}

}
}
}


/// <summary>
/// 执行指定Sql语句,同时给传入DataTable进行赋值
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <param name="dt">ref DataTable dt </param>
public static void dataTable(string sqlstr, ref DataTable dt)
{
OleDbDataAdapter da = new OleDbDataAdapter();
using (OleDbConnection conn = new OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["webtest"].ConnectionString))
{
using (OleDbCommand cmd = new OleDbCommand(sqlstr, conn))
{
try
{
conn.Open();
da.SelectCommand = cmd;
da.Fill(dt);
}
catch (System.Data.OleDb.OleDbException e)
{
conn.Close();
throw e;
}
finally
{

cmd.Dispose();
conn.Close();
}

}
}
}

}
dys_198102 2009-04-17
  • 打赏
  • 举报
回复
下边是按6楼老大的做法写的,欢迎大家指点一下。运行没有出错。
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.Text.RegularExpressions;
using System.Data.OleDb;
//using System.Data.SqlClient;

/// <summary>
///WebData 的摘要说明
/// </summary>
public class WebData
{

public WebData()
{
//
//TODO: 在此处添加构造函数逻辑
//
}


/// <summary>
/// 执行Sql查询语句
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// 执行SQL语句,返回影响的记录数
/// </summary>
/// <param name="SQLString">SQL语句</param>
/// <returns>影响的记录数</returns>
public static int ExecuteSql(string sqlstr)
{
using(OleDbConnection conn=new OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["webtest"].ConnectionString))
{
using (OleDbCommand cmd = new OleDbCommand(sqlstr, conn))
{
try
{
conn.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.OleDb.OleDbException e)
{
conn.Close();
throw e;
}
finally
{
cmd.Dispose();
conn.Close();
}
}
}
}


/// <summary>
/// 执行Sql更新语句
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>布尔值</returns>
public static int ExecuteUpdate(string sqlstr)
{
using(OleDbConnection conn=new OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["webtest"].ConnectionString))
{
using (OleDbCommand cmd = new OleDbCommand(sqlstr, conn))
{
try
{
conn.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.OleDb.OleDbException e)
{
conn.Close();
throw e;
}
finally
{
cmd.Dispose();
conn.Close();
}
}
}

}



/// <summary>
/// 返回指定Sql语句的SqlDataReader,请注意,在使用后请关闭本对象,同时将自动调用closeConnection()来关闭数据库连接
/// 方法关闭数据库连接
/// </summary>
/// <param name="sqlstr">传入的Sql语句</param>
/// <returns>SqlDataReader对象</returns>
public static OleDbDataReader dataReader(string sqlstr)
{
OleDbDataReader dr=null;
using (OleDbConnection conn = new OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["webtest"].ConnectionString))
{
using (OleDbCommand cmd = new OleDbCommand(sqlstr, conn))
{
try
{
conn.Open();
dr = cmd.ExecuteReader();
return dr;
}
catch (System.Data.OleDb.OleDbException e)
{
conn.Close();
throw e;
}
finally
{

cmd.Dispose();
conn.Close();
}

}
}
}

///<summary>
///关闭datareader
///传入SqlDataReader的ref
///</summary>
public static void closeDataReader(ref OleDbDataReader dr)
{
try
{
dr.Close();
dr.Dispose();
}
catch (Exception)
{ }
}

liucfy 2009-04-10
  • 打赏
  • 举报
回复
连接对象怎么能采用静态的呢???那样不就没有连接池了吗??
tianfang25 2009-04-10
  • 打赏
  • 举报
回复
灌水无罪,接分有理!!!
llainn 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Sandy945 的回复:]
b/s 开发中不要出现 static
你先把static 去了

这个过程 你应该就会明白些东西了
[/Quote]

b/s 开发中不要出现 static ??????

为啥???

我去掉了能明白啥????

我是新人,请指教.
jian_xiaowei 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Sandy945 的回复:]
b/s 开发中不要出现 static
你先把static 去了

这个过程 你应该就会明白些东西了
[/Quote]
------------------------------------------
有这个规定吗??
为什么就不能有static的呢,看看asp.net库源代码,很多都有static啊。
该用的地方用,不该用的地方就不用
jian_xiaowei 2009-04-08
  • 打赏
  • 举报
回复
而且,一个数据库连接同时只能有一个datareader,如果同时有2个的话,。。。。。
delphi_new 2009-04-08
  • 打赏
  • 举报
回复
Mr_Edwin 2009-04-08
  • 打赏
  • 举报
回复
还有什么方法降低数据库连接
dys_198102 2009-04-07
  • 打赏
  • 举报
回复
按楼上老大的意思,是不是我只删除static关键字就行了..
protected static SqlConnection conn = new SqlConnection();
protected static SqlCommand comm = new SqlCommand();
改成
protected SqlConnection conn = new SqlConnection();
protected SqlCommand comm = new SqlCommand();

可以不??
gui0605 2009-04-07
  • 打赏
  • 举报
回复
方法你用静态没问题,但是下边
protected static SqlConnection conn = new SqlConnection();
protected static SqlCommand comm = new SqlCommand();
这样的对象就不要使用静态了
zz005 2009-03-31
  • 打赏
  • 举报
回复
学习了
jiejie526 2009-03-31
  • 打赏
  • 举报
回复
路过,帮顶吧
tabbycat 2009-03-30
  • 打赏
  • 举报
回复
protected static SqlConnection conn = new SqlConnection();
protected static SqlCommand comm = new SqlCommand();

static 是共有的,只有一个数据库连接,真节约
  • 打赏
  • 举报
回复
用微软给你提供的sqlhelper.cs
dys_198102 2009-03-26
  • 打赏
  • 举报
回复
好像可以用6楼老兄的方法解决,还有更好的方法没有,大家方便的话提出来,以供学习,谢谢。
加载更多回复(14)

62,268

社区成员

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

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

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

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