我是这个月才开始接触.NET和数据库的,以前一直用的是C++  
所以眼界还比较狭窄,不知道这个类有没有硬伤  
比如在概念上就存在严重问题什么的。  
 
呵呵,请大家给点意见和评论,让我学点东西,谢谢。我会来结贴的。^_^  
using System;
using System.Data;
using System.Data.Common;
using System.Web.UI.WebControls;namespace Liuzewei
{
    // 类名:基于数据集的数据库操作通用类(支持所有数据库且内置分页功能)
    //
    // 作者:刘泽围
    //
    // 版权:在中国软件业不存在版权,可以随意使用 ^_^
    //
    // 版本:
    //
    //      2007年4月15日 内置了分页功能、将数据集与源数据之间的数据操作实现改为工厂模式
    //                    特别致谢 CSDN 论坛会员 sp1234(假装热心灌水实则灌水搞垮论坛)
    //
    //      2007年4月14日 对 用数据集操作源数据库 时的种种不确定与迷茫迫使我动手写了这么
    //                    个类并贴到了 CSDN 论坛,谢谢所有回复了帖子与给予我点拨的朋友们
    //
    // 说明:
    //
    //      本类将对源数据库的 查询、修改、删除、新增、更新与绑定操作抽象为统一的对数
    //      据行引用 的操作
    //
    //      本类内置分页功能,而且本类是非静态类,所以使用时无须考虑多次不同数据库操作
    //      ,彼此之间产生的影响
    //
    //      本类内部采用工厂模式实现,使本类支持 .NET 支持的所有数据库,同时你还可以很
    //      简单的针对你常用的数据库类型从本类相应派生出一个新类以方便你的使用
    //
    //      本类仅仅是对 .NET FCL 的一个简单包装,但在逻辑层次上本人还是经过仔细考虑的
    //      比如说将所有操作抽象为统一操作时有考虑过尽量不损失原有的功能、性能与灵活性
    //      总之,使用本类简单方便灵活,同时可以减小项目期的复杂度
    //
    // 示例:
    //
    //      以Access数据库为例,如果同时要操作多个不同类型的数据库,只要对应实例化即可
    //
    //      1、实例化对象,必须有主键
    //         DataBase dataBase( "SELECT [ip], [date], [id] FROM [sitestat]",
    //              "Provider=Microsoft.JET.OLEDB.4.0; Data Source = C:\SiteStat.mdb",
    //              "System.Data.OleDb" );
    //
    //      2、查询数据行,得到结果数据行的引用
    //         DataRow[] dataRows = dataBase.Select( "id > 10" );
    //
    //      3、显示数据行,dataRows来自于查询数据行时返回的引用
    //         for ( int i = 0; i < dataRows.Length; i++ )
    //             Response.Write( dataRows[i]["ip"].ToString() );
    //
    //      4、修改数据行并更新到源数据库,dataRows来自于查询数据行时返回的引用
    //         dataRows[2]["ip"] = "127.0.0.1";
    //         dataBase.Update();
    //
    //      5、删除数据行并更新到源数据库,dataRows来自于查询数据行时返回的引用
    //         for ( int i = 0; i < dataRows.Length; i++ )
    //             dataRows[i].Delete();
    //         dataBase.Update();
    //
    //      6、插入新数据行并更新到源数据库
    //         DataRow[] newDataRows = dataBase.NewDataRows( 2 );
    //         newDataRows[0]["ip"] = "127.0.0.2";
    //         newDataRows[1]["ip"] = "127.0.0.3";
    //         dataBase.Update();
    //
    //      7、由其他控件或数据对象进行绑定,这里以 Repeater 进行分页绑定为例
    //         int totalPage; // 绑定数据集中的第2页,每页10行数据,并返回总页数
    //         repeater.DataSource = dataBase.DataView( 10, 1, out totalPage );
    //         repeater.Bind();
    //
    //      8、针对特定数据库派生新类,这里以 Access 数据库为例
    //         public class OleDataBase : DataBase {
    //             public OleDataBase( string queryString, string dataBasePath )
    //                 : base( queryString, "Provider=Microsoft.JET.OLEDB.4.0; 
    //                   Data Source = "+dataBasePath, "System.Data.OleDb" ){}}
    //         这里仅调用了基类构造函数以简化操作,当然你可以做得更多 
    //         使用时除了实例化时参数不同以外,其他操作完全同基类对象
    //         OleDataBase oleDataBase = new OleDataBase( "SE...", "C:\S....mdb );
    public class DataBase
    {
        #region 受保护成员        // 本类实例映射自给定源数据库的公用数据集
        protected DataSet dataSet = new DataSet();        // 源数据库与数据集之间的数据适配器
        protected DbDataAdapter dataAdapter;
        protected DbCommandBuilder commandBuilder;        #endregion
        #region 构造函数        // 在托管堆上分配内存实例化类本身以及 DataSet,DataAdapter,CommandBuilder 对象 
        public DataBase( string commandText, string connectionString,
                         string providerInvariantName )
        {
            DbProviderFactory providerFactory =
                DbProviderFactories.GetFactory( providerInvariantName );            DbConnection connection = providerFactory.CreateConnection();
            connection.ConnectionString = connectionString;            DbCommand command = providerFactory.CreateCommand();
            command.CommandText = commandText;
            command.Connection = connection;            dataAdapter = providerFactory.CreateDataAdapter();
            dataAdapter.SelectCommand = command;            commandBuilder = providerFactory.CreateCommandBuilder();
            commandBuilder.QuotePrefix = "[";
            commandBuilder.QuoteSuffix = "]";
            commandBuilder.DataAdapter = dataAdapter;            dataAdapter.Fill( dataSet );
        }        #endregion
        #region 公有方法        // 将本类实例公用数据集中数据更新到源数据库中
        public void Update()
        {
            dataAdapter.Update( dataSet );            return;
        }        // 从本类实例公用数据集中查询现有数据行
        // 调用者可以对返回数据行引用进行显示、修改和删除操作
        // 操作完毕调用 Updata() 将操作更新到源数据库中
        public DataRow[] Select( string expression )
        {
            DataRow[] dataRows;
            dataRows = dataSet.Tables[0].Select( expression );            return dataRows;
        }        // 从本类实例公用数据集中开辟新数据行
        // 调用者可以对返回数据行引用进行填充、修改和删除操作
        // 操作完毕调用 Updata() 将操作更新到源数据库中
        public DataRow[] NewDataRows( int lenth )
        {
            DataRow[] dataRows = new DataRow[lenth];            for ( int i = 0; i < lenth; i++ )
            {
                dataRows[i] = dataSet.Tables[0].NewRow();
                dataSet.Tables[0].Rows.Add( dataRows[i] );
            }            return dataRows;
        }        // 返回 DataView 用于调用者绑定本类实例公用数据集进行显示
        public DataView DataView()
        {
            return dataSet.Tables[0].DefaultView;
        }        // 返回 DataView 用于调用者绑定本类实例公用数据集的某一分页进行显示
        public DataView DataView( int pageSize, int currentPage, out int totalPage )
        {
            int totalRows = dataSet.Tables[0].Rows.Count;            totalPage = (totalRows / pageSize) + ((totalRows % pageSize == 0) ? 0 : 1);            DataSet pagedDataSet = new DataSet();
            dataAdapter.Fill( pagedDataSet, currentPage * pageSize, pageSize,
                              "pagedTable" );            return pagedDataSet.Tables["pagedTable"].DefaultView;
        }        #endregion
    }
}

解决方案 »

  1.   

    ASP.net微软验证用户输入的进程在哪里?即在.net报错之前或同时通知用户错误原因。望高手给与指点,不胜感激!!!
      

  2.   

    严重BUG:- -!dataAdapter.Fill( pagedDataSet, currentPage * pageSize, pageSize,
                                  "pagedTable" );应为----》dataAdapter.Fill( pagedDataSet, (currentPage-1) * pageSize, pageSize,
                                  "pagedTable" );
      

  3.   

    pagedDataSet.Tables["pagedTable"]奇怪,为什么都喜欢这么用呢?pagedDataSet.Tables[0],我一直这么用来着,
      

  4.   

    TO : jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程) ( ) 信誉:100    Blog   加为好友  2007-04-15 15:19:17  得分: 0  
     
     
       pagedDataSet.Tables["pagedTable"]奇怪,为什么都喜欢这么用呢?pagedDataSet.Tables[0],我一直这么用来着,
    这里因为不涉及到大量的 将 "pagedTable" 转换为数字的操作,所以用更容易理解的 字符串来选择表。