我是这个月才开始接触.NET和数据库的,以前一直用的是C++
所以眼界还比较狭窄,不知道这个类有没有硬伤
比如在概念上就存在严重问题什么的。
呵呵,请大家给点意见和评论,让我学点东西,谢谢。我会来结贴的。^_^
using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;namespace Liuzewei
{
//
// 类名:基于数据集的数据库操作类(通用于 Access、SQL 数据库)
//
// 作者:刘泽围 2007年4月14日
//
// 版权:在中国软件业不存在版权,可以随意使用 ^_^
//
// 说明:
//
// 本类将对源数据库的 查询、修改、删除、新增、更新与绑定 操作抽象为统一的对
// 数据行引用的操作
//
// 而且本类是非静态的,所以使用时无须考虑多次不同数据库操作,彼此之间产生的影响
//
// 本类仅仅是对数据集类的一个简单包装,但鉴于以上两点,使用本类却可以大大减小
// 项目期的复杂度
//
// 示例:
//
// 以Access数据库为例,如果同时要操作多个不同类型的数据库,只要对应实例化即可
//
// 1、实例化对象,必须有主键
// DataBase dataBase( "SELECT [ip], [date], [id] FROM [sitestat]",
// "C:\SiteStat.mdb", false );
//
// 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、绑定,这里是与分页数据源进行绑定
// PagedDataSource pagedDataSource = new PagedDataSource();
// pagedDataSource.DataSource = dataBase.DefaultView;
//
public class DataBase
{
// 本类实例映射自给定源数据库的公用数据集
private DataSet dataSet; // 源数据库与数据集之间的数据适配器
private bool isSqlDataBase;
private SqlDataAdapter sqlDataAdapter;
private SqlCommandBuilder sqlCommandBuilder;
private OleDbDataAdapter oleDbDataAdapter;
private OleDbCommandBuilder oleDbCommandBuilder; //
// 在托管堆上分配内存实例化类本身以及 DataSet,DtaAdapter,CommandBuilder 对象
//
public DataBase( string selectCommandText, string dataBasePath, bool isSqlDataBase )
{
dataSet = new DataSet(); if ( isSqlDataBase )
{
sqlDataAdapter = new SqlDataAdapter( selectCommandText, dataBasePath ); sqlCommandBuilder = new SqlCommandBuilder( sqlDataAdapter );
sqlCommandBuilder.QuotePrefix = "[";
sqlCommandBuilder.QuoteSuffix = "]"; sqlDataAdapter.Fill( dataSet );
}
else
{
oleDbDataAdapter = new OleDbDataAdapter( selectCommandText,
"Provider=Microsoft.JET.OLEDB.4.0; Data Source = "+dataBasePath ); oleDbCommandBuilder = new OleDbCommandBuilder( oleDbDataAdapter );
oleDbCommandBuilder.QuotePrefix = "[";
oleDbCommandBuilder.QuoteSuffix = "]"; oleDbDataAdapter.Fill( dataSet );
} this.isSqlDataBase = isSqlDataBase;
}
//
// 返回 DefaultView 用于调用者与本类实例公用数据集进行绑定
//
public DataView DefaultView
{
get { return dataSet.Tables[0].DefaultView; }
}
//
// 将本类实例公用数据集中数据更新到源数据库中
//
public void Update()
{
if ( isSqlDataBase )
sqlDataAdapter.Update( dataSet );
else
oleDbDataAdapter.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;
}
}
}
所以眼界还比较狭窄,不知道这个类有没有硬伤
比如在概念上就存在严重问题什么的。
呵呵,请大家给点意见和评论,让我学点东西,谢谢。我会来结贴的。^_^
using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;namespace Liuzewei
{
//
// 类名:基于数据集的数据库操作类(通用于 Access、SQL 数据库)
//
// 作者:刘泽围 2007年4月14日
//
// 版权:在中国软件业不存在版权,可以随意使用 ^_^
//
// 说明:
//
// 本类将对源数据库的 查询、修改、删除、新增、更新与绑定 操作抽象为统一的对
// 数据行引用的操作
//
// 而且本类是非静态的,所以使用时无须考虑多次不同数据库操作,彼此之间产生的影响
//
// 本类仅仅是对数据集类的一个简单包装,但鉴于以上两点,使用本类却可以大大减小
// 项目期的复杂度
//
// 示例:
//
// 以Access数据库为例,如果同时要操作多个不同类型的数据库,只要对应实例化即可
//
// 1、实例化对象,必须有主键
// DataBase dataBase( "SELECT [ip], [date], [id] FROM [sitestat]",
// "C:\SiteStat.mdb", false );
//
// 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、绑定,这里是与分页数据源进行绑定
// PagedDataSource pagedDataSource = new PagedDataSource();
// pagedDataSource.DataSource = dataBase.DefaultView;
//
public class DataBase
{
// 本类实例映射自给定源数据库的公用数据集
private DataSet dataSet; // 源数据库与数据集之间的数据适配器
private bool isSqlDataBase;
private SqlDataAdapter sqlDataAdapter;
private SqlCommandBuilder sqlCommandBuilder;
private OleDbDataAdapter oleDbDataAdapter;
private OleDbCommandBuilder oleDbCommandBuilder; //
// 在托管堆上分配内存实例化类本身以及 DataSet,DtaAdapter,CommandBuilder 对象
//
public DataBase( string selectCommandText, string dataBasePath, bool isSqlDataBase )
{
dataSet = new DataSet(); if ( isSqlDataBase )
{
sqlDataAdapter = new SqlDataAdapter( selectCommandText, dataBasePath ); sqlCommandBuilder = new SqlCommandBuilder( sqlDataAdapter );
sqlCommandBuilder.QuotePrefix = "[";
sqlCommandBuilder.QuoteSuffix = "]"; sqlDataAdapter.Fill( dataSet );
}
else
{
oleDbDataAdapter = new OleDbDataAdapter( selectCommandText,
"Provider=Microsoft.JET.OLEDB.4.0; Data Source = "+dataBasePath ); oleDbCommandBuilder = new OleDbCommandBuilder( oleDbDataAdapter );
oleDbCommandBuilder.QuotePrefix = "[";
oleDbCommandBuilder.QuoteSuffix = "]"; oleDbDataAdapter.Fill( dataSet );
} this.isSqlDataBase = isSqlDataBase;
}
//
// 返回 DefaultView 用于调用者与本类实例公用数据集进行绑定
//
public DataView DefaultView
{
get { return dataSet.Tables[0].DefaultView; }
}
//
// 将本类实例公用数据集中数据更新到源数据库中
//
public void Update()
{
if ( isSqlDataBase )
sqlDataAdapter.Update( dataSet );
else
oleDbDataAdapter.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;
}
}
}
欢迎+期待各位继续回帖发表见解。谢谢
谢谢你的指点,我现在确实迷茫,看了本C#的书就开始乱搞ASP。NET,呵呵,这几天在论坛吹泡泡休息,过几天继续看书。
http://community.csdn.net/Expert/topic/5349/5349356.xml?temp=.7169001
希望对你思想上转变有帮助.
DataBase dataBase( 一个sql语句,"C:\SiteStat.mdb", false );
楼主把C:\SiteStat.mdb数据库地址传入不是一个好方法
你可以在web.config里写上数据库连接地址
<appSettings>
<add key="dataBasePath" value="C:\SiteStat.mdb"/>
</appSettings>
private string dataBasePath =
System.Configuration.ConfigurationSettings.AppSettings["dataBasePath"];
就可以得到数据库的连接地址
既然写基类,这些操作不属于 某个具体的对象,就应该用static
而不应该DataBase dataBase;来声明一个对象 再通过对象来调用就如
class DataBase
{
public static void Update(string sql)
{
//通过传入sql语句,来执行更新的操作
}
}
就可以直接 DataBase.Update(传入的sql语句)
而不是先声明对象DataBase dataBase;dataBase.Update(传入的sql语句)
既然写基类,这些操作不属于 某个具体的对象,就应该用static
而不应该DataBase dataBase;来声明一个对象 再通过对象来调用
---------------------------------------------
如果是为了使用方便,大可以用工厂方法,而不是把功能类中所有方法写成静态方法。
对于静态方法还要考虑到同步的问题,还要考虑并发时性能的问题。
认真思考,多做实践。
自己也想写个来
可苦于没抽象出来,放弃了
upup
或者用接口IDBConnection,IDBCommand,IDBDataAdapter..........
为什么要把Access和SqlServer写在一起呢?还有最好不要直接执行sql语句啦,建议都参数的形式来执行。
/// ******
/// </...>
http://community.csdn.net/Expert/topic/5466/5466831.xml?temp=.6231348