最近使用微软企业库,在做分页绑定的时候发现好象还没有多少通用的方法.为了灵活和换数据库,我不能使用存储过程.为了开发速度最快.我就是用datagrid绑定了.
以前长用的 DataAdapter.Fill(ds, StartRecordNo, PageSize, TableName); 这样获取某一页的数据.但是用微软企业库总么获得这样的数据按 .网上介绍 Database 类的 GetDataAdapter() 函数的文章太少了. 不过最终做成通用分页函数了.
用一条sql语句 select * from AAA 这样的语句,不是分页sql语句.得到总数目,总页数
现在定义的数据访问接口
public
interface
ISysMangerProvider
{
//
执行sql语句获得DataSet数据
DataSet GetDataSetBySqlcomm(
string
Sqlcomm);
//
执行sql语句获得DataSet数据 ,提供分页
DataSet GetDataSetBySqlcomm(
int
StartRecordNo,
int
PageSize,
string
Sqlcomm,
string
TableName);
//
执行sql语句返回影响的行数目
int
ExecSqlcomm(
string
Sqlcomm);
}
我门在微软企业库外面在包一层,放一些可以通用的函数 ,也可以简化数据提供者类的构造,和减少代码膨胀
#region
数据提供者,通用基础类
///
<summary>
///
数据提供者,通用基础类
///
</summary>
public
abstract
class
DataProviderBaseClass
{
#region
定义变量
protected
Database db;
//
protected object ReturnObjectValue;
#endregion
#region
构造函数
protected
DataProviderBaseClass()
{
}
protected
DataProviderBaseClass(
int
i):
this
()
{
db
=
DatabaseFactory.CreateDatabase();
}
protected
DataProviderBaseClass(
string
connectionName):
this
()
{
db
=
DatabaseFactory.CreateDatabase(connectionName);
}
protected
DataProviderBaseClass(SelectDataBae SDB):
this
()
{
db
=
DatabaseFactory.CreateDatabase(PublicNews.ChangeDataBase(SDB));
}
#endregion
#region
执行sql语句得到DataSet类型数据
///
<summary>
///
执行sql语句得到DataSet类型数据
///
</summary>
///
<param name="Sqlcomm"></param>
///
<returns></returns>
protected
DataSet ExecuteDataSetBySqlcomm(
string
Sqlcomm)
{
DataSet ds;
using
(DbConnection dbConnection
=
this
.db.CreateConnection())
{
ds
=
this
.db.ExecuteDataSet(CommandType.Text, Sqlcomm);
dbConnection.Close();
}
return
ds;
}
#endregion
#region
执行sql语句获得DataSet数据 ,提供分页
///
<summary>
///
执行sql语句获得DataSet数据 ,提供分页
///
</summary>
///
<param name="PageNo">
当前行数
</param>
///
<param name="PageSize">
一页分页数量
</param>
///
<param name="Sqlcomm">
sql语句
</param>
///
<returns>
DataSet对象
</returns>
protected
DataSet ExecuteDataSetBySqlcomm(
int
StartRecordNo,
int
PageSize,
string
Sqlcomm,
string
TableName)
{
DataSet ds
=
new
DataSet();
using
(DbConnection dbConnection
=
this
.db.CreateConnection())
{
DbCommand dbCommand
=
this
.db.GetSqlStringCommand(Sqlcomm
+
"
; select @@Rowcount ;
"
);
DbDataAdapter dbDataAdapter
=
this
.db.GetDataAdapter();
dbCommand.Connection
=
dbConnection;
dbDataAdapter.SelectCommand
=
dbCommand;
dbConnection.Open();
dbDataAdapter.Fill(ds, StartRecordNo, PageSize, TableName);
dbConnection.Close();
}
return
ds;
}
#endregion
#region
执行sql语句返回影响的行数目
///
<summary>
///
执行sql语句返回影响的行数目
///
</summary>
///
<param name="stringcomm"></param>
///
<returns></returns>
protected
int
ExecIntBySqlcomm(
string
Sqlcomm)
{
using
(DbConnection dbConnection
=
this
.db.CreateConnection())
{
dbConnection.Open();
int
i
=
this
.db.ExecuteNonQuery(CommandType.Text, Sqlcomm);
dbConnection.Close();
return
i;
}
}
#endregion
#region
检测DataSet对象是否有数据
///
<summary>
///
检测DataSet对象是否有数据
///
</summary>
///
<param name="Ds">
要检测的对象
</param>
///
<returns>
返回结果
</returns>
public
static
bool
CheckDataSet(DataSet Ds)
{
try
{
if
(Ds
!=
null
&&
Ds.Tables.Count
>
0
&&
Ds.Tables[
0
].Rows.Count
>
0
)
{
return
true
;
}
else
{
return
false
;
}
}
catch
{
throw
;
}
}
#endregion
#region
检测DataSet对象是否有数据,分页支持
///
<summary>
///
检测DataSet对象是否有数据,分页支持
///
</summary>
///
<param name="Ds">
要检测的对象
</param>
///
<returns>
返回结果
</returns>
public
static
bool
CheckDataSetForPage(DataSet Ds,
ref
int
ResultCount)
{
try
{
if
(Ds
!=
null
&&
Ds.Tables.Count
>
0
&&
Ds.Tables.Count
==
2
&&
Ds.Tables[
0
].Rows.Count
>
0
)
{
ResultCount
=
Convert.ToInt32(Ds.Tables[
1
].Rows[
0
][
0
]);
if
(ResultCount
==
0
)
{
return
false
;
}
else
{
return
true
;
}
}
else
{
return
false
;
}
}
catch
{
throw
;
}
}
#endregion
}
#endregion
好了 最后数据提供者类就很简单了.
public
class
SysMangerProvider : DataProviderBaseClass ,ISysMangerProvider
{
#region
构造函数
public
SysMangerProvider():
base
(
1
)
{
}
public
SysMangerProvider(
string
connectionName):
base
(connectionName)
{
}
public
SysMangerProvider(SelectDataBae SDB):
base
(SDB)
{
}
#endregion
#region
执行sql语句得到DataSet类型数据
///
<summary>
///
执行sql语句得到DataSet类型数据
///
</summary>
///
<param name="Sqlcomm"></param>
///
<returns></returns>
public
DataSet GetDataSetBySqlcomm(
string
Sqlcomm)
{
return
base
.ExecuteDataSetBySqlcomm(Sqlcomm);
}
#endregion
#region
执行sql语句获得DataSet数据 ,提供分页
///
<summary>
///
执行sql语句获得DataSet数据 ,提供分页
///
</summary>
///
<param name="PageNo">
当前行数
</param>
///
<param name="PageSize">
一页分页数量
</param>
///
<param name="Sqlcomm">
sql语句
</param>
///
<returns>
DataSet对象
</returns>
public
DataSet GetDataSetBySqlcomm(
int
StartRecordNo,
int
PageSize,
string
Sqlcomm,
string
TableName)
{
return
base
.ExecuteDataSetBySqlcomm(StartRecordNo, PageSize, Sqlcomm, TableName);
}
#endregion
#region
执行sql语句返回影响的行数目
///
<summary>
///
执行sql语句返回影响的行数目
///
</summary>
///
<param name="stringcomm"></param>
///
<returns></returns>
public
int
ExecSqlcomm(
string
Sqlcomm)
{
return
base
.ExecIntBySqlcomm(Sqlcomm);
}
#endregion
}
在前台绑定的时候就非常简单了
int
ResultCount
=
0
;
this
.ds
=
this
.SM.GetDataSetBySqlcomm(startIndex,
this
.DataGrid1.PageSize,
"
select * from PageInfo
"
,
"
ShowList
"
);
if
(DataProviderBaseClass.CheckDataSetForPage(
this
.ds,
ref
ResultCount))
{
this
.DataGrid1.VirtualItemCount
=
ResultCount;
this
.DataGrid1.DataSource
=
this
.ds.Tables[
0
];
this
.DataGrid1.DataBind();
}
else
{
this
.Response.Write(
"
对不起,没有获取到数据。
"
);
}
好了 解决用微软企业库的sql语句分页问题.