用C#写的数据访问类,请大家多多批评,同时祝贺儿子周岁生日,大家进来领分
==========================
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Data;
using System.Text;
using System.Data.SqlClient;
using System.Web.Caching;namespace JSY
{
/// <summary>
/// ===数据访问类  作者:贾世义 2005-03-10===
/// </summary>
public class Config :Page 
{
private SqlConnection cn;
private SqlCommand cmd;
private SqlTransaction tran;
private SqlDataReader dr;
private Page LoadPage;
public bool RunStatus=true;//当测试程序时在Web.config <AppSettings>设置<add key="RunStatus" value="0"></add>可以弹出具体错误提示
/// <summary>
/// 构造函数
/// </summary>
/// <param name="page">调用页Page</param>
public Config(Page page)
{
LoadPage=page;
if (LoadPage.Cache["RunStatus"]==null)
{
if (System.Configuration.ConfigurationSettings.AppSettings["RunStatus"]!=null || System.Configuration.ConfigurationSettings.AppSettings["RunStatus"]=="0")
{
LoadPage.Cache["RunStatus"]=0;
}
else
{
LoadPage.Cache["RunStatus"]=1;
}
}
RunStatus=((int)LoadPage.Cache["RunStatus"]==1);
}
/// <summary>
/// 析构函数(如果忘记关闭资源)
/// </summary>
~Config()
{
if (cn != null)
{
Close();
}
} /// <summary>
/// 打开数据库
/// </summary>
private void open() 
{
if (cn==null)
{   
cn = new SqlConnection("server=127.0.0.1;database=YourDB;UID=jsy;PWD=jsy;Pooling=true;Connection Reset=false;Connection Lifetime=5;Min Pool Size=5;Max Pool Size=100;");
cn.Open();
cmd=new SqlCommand();
cmd.Connection=cn;

else if (cn.State==ConnectionState.Closed)
{
cn.Open();
}
}
/// <summary>
/// 关闭数据库
/// </summary>
public void Close() 
{
if (cn != null)
{
if (dr!=null)
{
dr.Close();
}
if (cmd != null)
{
cmd.Dispose();
}
if (tran != null)
{
tran.Dispose();
}
cn.Close();
cn=null;
}
}
/// <summary>
/// 创建Command对象(注意使用参数且不关闭的自己清除参数)
/// </summary>
/// <param name="cmdText">CommandText</param>
/// <param name="iType">CommandType 0:SQL 1:Procedure 2:Table</param>
private void createCmd(ref string cmdText,int iType)
{
open();
cmd.CommandText=@cmdText;
switch (iType)
{
case 0:
cmd.CommandType=CommandType.Text;
break;
case 1:
cmd.CommandType=CommandType.StoredProcedure;
break;
default:
cmd.CommandType=CommandType.TableDirect;
break;
}
}
/// <summary>
/// 调用存储过程创建一个SqlCommand对象
/// </summary>
/// <param name="procName">存储过程</param>
/// <param name="ParamNames">参数数组</param>
/// <param name="ParamValues">参数值数组(少于参数个数时后按""添加)</param>
private void createCmdProc(ref string procName,string[] ParamNames,string[] ParamValues) 
{
createCmd(ref procName,1);
for (int i=0;i<ParamNames.Length;i++)
{
SqlParameter p=new SqlParameter();
p.ParameterName="@"+ParamNames[i];
if (i<ParamValues.Length)
{
p.Value=@ParamValues[i];
}
else
{
p.Value="";
}
cmd.Parameters.Add(p);
}
cmd.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, 0, 0,
string.Empty, DataRowVersion.Default, null));
}
/// <summary>
/// 执行存储过程(执行后关闭数据库)
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="ParamNames">参数数组</param>
/// <param name="ParamValues">参数值数组(少于参数个数时后按""添加)</param>
/// <returns>是否正确执行</returns>
public bool RunProc(string procName,string[] ParamNames,string[] ParamValues) 
{
createCmdProc(ref procName,ParamNames,ParamValues);
bool isRun=false;
try
{
isRun=(cmd.ExecuteNonQuery()!=-1);
Close();
}
catch (SqlException se)
{
Close();
if (RunStatus)
{
LoadPage.Server.Transfer("/Error.htm",true);
}
else
{
LoadPage.Server.Transfer("/Error.aspx?Err="+procName+"<br>"+se.Message,true);
}
}
return isRun;
}
/// <summary>
/// 将数据填充到数据集(数据库不关闭)
/// </summary>
/// <param name="ds">填充的数据集</param>
/// <param name="strSql">select语句</param>
/// <param name="tbl">表名</param>
/// <returns>成功返回true</returns>
private bool getDs(DataSet ds,ref string strSql,string tbl)
{
bool isRun=true;
try
{
createCmd(ref strSql,0);
SqlDataAdapter ada = new SqlDataAdapter(cmd);
ada.Fill(ds,tbl);
}
catch(SqlException se)
{
isRun=false;
Close();
if (RunStatus)
{
LoadPage.Server.Transfer("/Error.htm",true);
}
else
{
LoadPage.Server.Transfer("/Error.aspx?Err="+strSql+"<br>"+se.Message,true);
}
}
return isRun;
}
/// <summary>
/// 按SQL语句获得指定DataTable对象(数据库不关闭)
/// </summary>
/// <param name="strSql">SQL语句</param>
/// <returns>DataTable对象</returns>
public DataTable GetTable(string strSql)
{
DataTable dt=null;
DataSet ds=new DataSet();
if (getDs(ds,ref strSql,"tbl"))
{
if (ds.Tables[0].Rows.Count>1)
{
dt=ds.Tables[0];
}
}
return dt;
}
/// <summary>
/// 按SQL语句获得指定DataReader对象(不能关闭,记得在使用完DataReader关闭)
/// </summary>
/// <param name="strSql">SQL语句</param>
/// <returns>DataReader对象</returns>
public SqlDataReader GetDataReader(string strSql)
{
try
{
createCmd(ref strSql,0);
dr = cmd.ExecuteReader();//System.Data.CommandBehavior.CloseConnection
}
catch(SqlException se)
{
Close();
if(RunStatus)
{
LoadPage.Server.Transfer("/Error.htm",true);
}
else
{
LoadPage.Server.Transfer("/Error.aspx?Err="+@strSql+"<br>"+se.Message,true);
}
}
return dr;
}
/// <summary>
/// 按存储过程获得指定DataReader对象(不能关闭,记得在使用完DataReader关闭)
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="ParamNames">参数数组</param>
/// <param name="ParamValues">参数值数组(少于参数个数时后按""添加)</param>
/// <returns>DataReader对象</returns>
public SqlDataReader GetDataReaderProc(ref string procName, string[] ParamNames,string[] ParamValues)
{
try
{
createCmdProc(ref procName,ParamNames,ParamValues);
dr = cmd.ExecuteReader();
cmd.Parameters.Clear();
}
catch(SqlException se)
{
Close();
if (RunStatus)
{
LoadPage.Server.Transfer("/Error.htm",true);
}
else
{
LoadPage.Server.Transfer("/Error.aspx?Err="+procName+"<br>"+se.Message,true);
}
}
return dr;
}
/// <summary>
/// 执行Sql语句
/// </summary>
/// <param name="strSql">Sql语句</param>
/// <returns>是否成功</returns>
public bool RunSql(string strSql)
{
bool isRun=true;
try 
{
createCmd(ref strSql,0);
isRun=(cmd.ExecuteNonQuery()>0);
}
catch(SqlException se)
{
isRun=false;
Close();
if (RunStatus)
{
LoadPage.Server.Transfer("/Error.htm",true);
}
else
{
LoadPage.Server.Transfer("/Error.aspx?Err="+@strSql+"<br>"+se.Message,true);
}
}
return isRun;
}
/// <summary>
/// 执行Sql语句并关闭数据库
/// </summary>
/// <param name="strSql">Sql语句</param>
/// <returns>是否成功</returns>
public bool RunSqlClose(string strSql)
{
bool isRun=RunSql(strSql);
Close();
return isRun;
}
}
}

解决方案 »

  1.   

    用了太多的WEB元素,不是通用的,没有考虑其他连接情况,没有缓冲池,价值不大,不过还是顶一下.
      

  2.   

    楼主精神可嘉!值得鼓励!UP!不过觉得还是SqlHelper和OracleHelper用起来更爽一点,功能也更为强大。
      

  3.   

    恭喜分了體顯層次結構最好分開,不要放在page(子)類中
      

  4.   

    结构不够清晰连接字符串处理得很不好
    http://community.csdn.net/Expert/TopicView3.asp?id=4164141
    这是我写的,参考一下吧
      

  5.   

    贾版SqlHelper?向楼主学习
    看来偶要努力繁殖后代了:)
      

  6.   

    同意1楼的当example看看还可以。
      

  7.   

    举个调用的例子:
    /// <summary>
    /// 绑定Repeater控件不分页(不关闭数据库)
    /// </summary>
    /// <param name="strSql">SQL语句</param>
    /// <param name="rpt">控件id</param>
    public void BindCtrl(string strSql,Repeater rpt)
    {
    dr=GetDataReader(strSql);
    if (dr!=null)
    {
    rpt.DataSource=dr;
    rpt.DataBind();
    dr.Close();
    }
    }
    以上公布的只是自己写的数据访问的函数,使用了缓冲池;在一次数据访问期间中使用了同一个ADO.NET对象;如果语句出错在调试状态下,直接输出错误语句并停止程序运行,调用时更方便;
    =========================================
    我会继续努力!谢谢大家的批评
      

  8.   

    楼主,我有一事不明,你为什么要承继Page,你这个东西算DataAccess层的东西,为什么又要和UI层扯在一起!我实不明白你为什么要这样,我要是有一个业务层,怎么用?第二,如果我要有一个OutPut参数怎么办,有Return参数怎么办第三,我要Return一个Datatalbe时,如果只有一行,按你的
    ds.Tables[0].Rows.Count>1
    是不是只返回一个空的DataTable,这算不算一个Bug
    一点意见,顺祝贵子健康,感谢楼主分享
      

  9.   

    还有,你应加一个ConnString的属性来设置连接字符串!!
      

  10.   

    非常感谢 listhome(不想睡)(好好学习)
    第一:以上公布的只是自己写的数据访问的函数,在这个类中我还使用了将界面中WEB控件传入形成语句获取数据初始化WEB控件及从WEB控件获取数据,形成语句写入数据库等
    第二:我目前的存储过程均没有使用输出参数
    第三:我写错了
      

  11.   

    恭喜
    ================================================================
    email:[email protected]
    ================================================================
      

  12.   

    和我的思想有点像,不过比我写的类要差多了,呵呵,在bin里用涉及httpcontext的东西在MVC模式中是很麻烦的。
    应该是这样:V aspx-> C 对应aspx.cs文件 -> V bin 里的底层类
    这就是标准的MVC模式了,用起来很爽的
      

  13.   

    恩恩用sqlhelper就可以了。。哈哈
    恭喜恭喜
      

  14.   

    里面几乎所有公共函数名怎么和我一样?__________________________________________
    DotNet中华网:www.aspxcn.org
      

  15.   

    里面几乎所有公共函数名怎么和我一样?__________________________________________
    DotNet中华网:www.aspxcn.org
      

  16.   

    wufeng0524(高处不胜寒)
    我是看过你的高处不胜寒ASP.NET 2.0示例后作的,从你那里学了很多东西,表示非常感谢
    不过我已经进行了很大的改动,除了名称参数相近之外,内部已经进行了彻底改变
    所以,公布的时候没有将您作为原作者,在这里表示歉意
    声明一下,本人并非剽窃。
    以上部分确为本人所写,保留原作者的部分名称也是出于尊重
      

  17.   

    写错了:高处不胜寒ASP.NET 1.0示例后作的