这个类库的作用是帮助程序员快速,自由的生成html页面。原先以为他可以算是一个简易模板引擎。但是现在仔细考虑了一下,觉得他还算不上是引擎。只能算是一个辅助类库。07年9月,兼职工作停止后,就没有在用过。前一段时间研究异步编程,顺便类库也加上了可以异步执行的功能。内部的一些算法也做了优化和更支持并发处理的调整。
主要有两个改变,一个是可以用{$静态包含文件:Include(/Include/Bottom.htm)$}这样的参数形式。直接包含静态文件内容做参数。 还可以通过{$动态包含文件:Exec(/Include/Exec.htm)$} 这样的参数形式,包含其他模板页,得到解析结果作为参数。
在page_load执行完毕后。所有有异步标志的标签{$异步显示表格:12:20::异步$}会开始异步执行。如果页面要连接多个数库。这个功能会有用处。
并且里面有我以前兼职项目的模板和处理类代码。可以看下习惯用法。Demo是昨天写的发给四个邮件联系的程序员的。今天修改了一下,现在也传到这里,希望看了以后,对其他程序员的思想提高有些帮助。
地址: http://files.cnblogs.com/vitality2007/ShowDemo.rar
Logic 项目的ShowTest.cs 的 210 行象下有点错误,导致异步翻页出错。刚发现,下载文件内已经修改了。
最近使用微软企业库,在做分页绑定的时候发现好象还没有多少通用的方法.为了灵活和换数据库,我不能使用存储过程.为了开发速度最快.我就是用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语句分页问题.
摘要: 使用模板在php和java里很普及。微软官方没有给我门提供类似php模板的工具类。应为aspx页面本身就是模板。控件也是模板,并且微软官方提供的接口之丰富,功能支持之多使他们没有必要在提供类似php模板之类的工具类库。 标准的aspx页面也是可以实现MVC的。但是有的时候会觉得MVC功能实现的不是很彻底。比如一个程序员和一个美工结合。可以对页面进行逻辑和外观上的改版。但是一个美工自己是只能修改外观...
阅读全文
摘要: 在很多时候。我门需要一种页面。这种页面不需要回送。为了速度。不需要使用服务器控件。必须保持高响应。他只要做动态显示。有不能做成静态页面。比如一些vip的文章显示。投票查看了。 webform框价功能强大。但是看看一个system.web.ui.page的源码。[ToolboxItem(false),DesignerSerializer("Microsoft.VisualStudio.Web.Web...
阅读全文
摘要: 最近新公司的工作主要是做静态页面,写策划。还有就是学习CommunityServer项目。加起来做这些已经一个月了。周六去了上地七街一家公司。和人家谈了谈,发现这个模板类已经放了好长时间了。回来后觉得应该补上模板类一直需要的一个功能了。就是支持信息载体类。就是说在自定义的标签解析函数内,我门可以获取外界传近来的自己定义的各种各样的信息载体类内的数据。加上信息载体类后,用模板类,也可以说用模板引擎来...
阅读全文
摘要: 下载/Files/vitality2007/TemplateWeb.rar 不管用什么样的服务器端技术。客户端接受的都是html字符串。在接受的项目中,于是我就使用了一种比较极端的方式。完全抛弃服务器端控件。自己写函数一个table一个td的拼出最终显示页。有点类似与以前asp的开发方式。不使用服务器端控件。可以加快页面生成速度,节省了服务器资源。连微软都提倡尽量避免使用服务器端控件。用ajax实...
阅读全文
摘要: 本次StringTempletReplet.dll组件更新了一些算法。主要是更依赖内存里静态变量内的数值。做到了在不改变模板的条件下。缓存模板,缓存委托,缓存标签解析数据。但是这会更消耗一些内存。为了可以动态更换模板,不得不每次检测文件的时间。在这个上消耗了不少时间。也许将来应该去掉动态更换模板的功能,只提供一个通知模板类重新读哪个模板文件的接口。取消了这个页面 (RetuenString.asp...
阅读全文
摘要: 做web开发也有几年了。自己在不同的公司有不同的认识。最近做blog项目。认识到了模板类在web开发中的作用。晚上在家。总想可以做一个专门的为asp.ne开发而设计的模板类。于是就写了这个模板类。http://www.93913.com/Edit_html/UploadFile/20065/200652205536669.gif 就用网络快车等东西下这个地址的图片把下来的文件改为*.rar文件就好...
阅读全文