May
21
之前的文章了解了三层架构的概念,《三层结构》原文链接:http://tommyhu.cn/three-tier-structure_8770/
今天说明搭建具体方法,另有实例提供下载
下载文件 (已下载 71 次)
解压密码:www.tommyhu.cn
步骤:
1、先在D盘建一个新文件夹
2、打开VS2008,新建一个网站,更改名字后存放在1中的文件夹中,此时要记得给该网站建一个新的文件夹,专门用来存放该网站所有的文件;
3、搭建数据访问层,点击文件——添加——新建项目——类库,更改名字之后,存放在1中的文件夹中,同样也为数据访问层,建立一个新的文件夹,专门存放数据访问层的文件,取名叫DAL;
4、搭建业务逻辑层,点击文件——添加——新建项目——类库,更改名字之后,存放在1中的文件夹中,同样也为业务逻辑层,建立一个新的文件夹,专门存放业务逻辑层的文件,取名叫BLL;
5、至此,三层架构算是搭建完成了,接下来我们为整个项目添加另一个类库,用来存放数据实体,用来在各层之间传递数据,取名为Models,该类库中的每一个类文件对应数据库中的一个数据表。
注意事项:
1、搭建各层时要注意命名空间的命名,命名空间下的每个类应声明为public类型的,不然在别的命名空间访问不到该类。
2、引用哪个类库时,要把先把该类库的dll文件添加到引用文件夹中,方法为右击引用文件夹——添加引用——点击浏览,则能找到你刚才建的类库的相关dll文件,如果要引用.NET的类库,则点击.NET选项,能看见所有的.NET的类库。
今天说明搭建具体方法,另有实例提供下载
下载文件 (已下载 71 次)解压密码:www.tommyhu.cn
步骤:
1、先在D盘建一个新文件夹
2、打开VS2008,新建一个网站,更改名字后存放在1中的文件夹中,此时要记得给该网站建一个新的文件夹,专门用来存放该网站所有的文件;
3、搭建数据访问层,点击文件——添加——新建项目——类库,更改名字之后,存放在1中的文件夹中,同样也为数据访问层,建立一个新的文件夹,专门存放数据访问层的文件,取名叫DAL;
4、搭建业务逻辑层,点击文件——添加——新建项目——类库,更改名字之后,存放在1中的文件夹中,同样也为业务逻辑层,建立一个新的文件夹,专门存放业务逻辑层的文件,取名叫BLL;
5、至此,三层架构算是搭建完成了,接下来我们为整个项目添加另一个类库,用来存放数据实体,用来在各层之间传递数据,取名为Models,该类库中的每一个类文件对应数据库中的一个数据表。
注意事项:
1、搭建各层时要注意命名空间的命名,命名空间下的每个类应声明为public类型的,不然在别的命名空间访问不到该类。
2、引用哪个类库时,要把先把该类库的dll文件添加到引用文件夹中,方法为右击引用文件夹——添加引用——点击浏览,则能找到你刚才建的类库的相关dll文件,如果要引用.NET的类库,则点击.NET选项,能看见所有的.NET的类库。
May
19
addScalar 显式 指定 返回数据的类型,即指定返回的值为什么类型!
SQLQuery 还有很多使用价值,例如在处理非 hbm 对象的时候。
再举几个实例说明其中几个实用技巧。
1, addScalar 显式指定返回数据的类型;以下是代码片段~~
String sql = "select count(*) as cnt from tblRead" + Misc.formatMoon(year, month) ...
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("cnt", Hibernate.INTEGER);
...
count = (Integer) query.uniqueResult();
2, 返回的结果集是多个列的情况,以下是代码片段~~
String sql = "select day, count(*) as cnt from tblRead" + Misc.formatMoon(year, month) ...
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("day", Hibernate.INTEGER);
query.addScalar("cnt", Hibernate.INTEGER);
...
Iterator results = query.list().iterator();
while (results.hasNext())
{
Object[] rows = (Object[]) results.next();
int day = (Integer) rows[0];
int cnt = (Integer) rows[1];
...
}
SQLQuery 还有很多使用价值,例如在处理非 hbm 对象的时候。
再举几个实例说明其中几个实用技巧。
1, addScalar 显式指定返回数据的类型;以下是代码片段~~
String sql = "select count(*) as cnt from tblRead" + Misc.formatMoon(year, month) ...
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("cnt", Hibernate.INTEGER);
...
count = (Integer) query.uniqueResult();
2, 返回的结果集是多个列的情况,以下是代码片段~~
String sql = "select day, count(*) as cnt from tblRead" + Misc.formatMoon(year, month) ...
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("day", Hibernate.INTEGER);
query.addScalar("cnt", Hibernate.INTEGER);
...
Iterator results = query.list().iterator();
while (results.hasNext())
{
Object[] rows = (Object[]) results.next();
int day = (Integer) rows[0];
int cnt = (Integer) rows[1];
...
}
May
18
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
#region OnPreInit 第一步
protected override void OnPreInit(EventArgs e)
{
//检查 IsPostBack 属性来确定是不是第一次处理该页。
//创建或重新创建动态控件。
//动态设置主控页。
//动态设置 Theme 属性。
//读取或设置配置文件属性值。
//注意
//如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被重写。
base.OnPreInit(e);
}
#endregion
#region OnInit 第二步
protected override void OnInit(EventArgs e)
{
//在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。
base.OnInit(e);
}
#endregion
#region OnInitComplete 第三步
protected override void OnInitComplete(EventArgs e)
{
//由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。
base.OnInitComplete(e);
}
#endregion
#region PreLoad 第四步
protected override void OnPreLoad(EventArgs e)
{
//如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。
//在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。
base.OnPreLoad(e);
}
#endregion
#region OnLoad 第五步
protected override void OnLoad(EventArgs e)
{
//Page 在 Page 上调用 OnLoad 事件方法,然后以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。
//使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。
base.OnLoad(e);
}
#endregion
#region 控件事件 第六步
protected void Button1_Click(object sender, EventArgs e)
{
//用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
//注意
//在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。
}
#endregion
#region OnLoadComplete 第七步
protected override void OnLoadComplete(EventArgs e)
{
//对需要加载页上的所有其他控件的任务使用该事件。
base.OnLoadComplete(e);
}
#endregion
#region OnPreRender 第八步
protected override void OnPreRender(EventArgs e)
{
//在该事件发生前:
//Page 对象会针对每个控件和页调用 EnsureChildControls。
//设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息,请参见下面的数据绑定控件的数据绑定事件。
//页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。
base.OnPreRender(e);
}
#endregion
#region SaveStateComplete 第九步
protected override void OnSaveStateComplete(EventArgs e)
{
//在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。
//使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。
base.OnSaveStateComplete(e);
}
#endregion
#region Render 第十步
//Render
//这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。
//如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件。
//用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。
#endregion
#region OnUnload 第十一步
protected override void OnUnload(EventArgs e)
{
//该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。
//对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。
//注意
//在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。
base.OnUnload(e);
}
#endregion
}
当页面进行回发时,如点击按钮,以上事件都会重新执行一次,这时的执行顺序为:
1. OnPreInit
2. OnInit
3. OnInitComplete
4. OnPreLoad
5. Page_Load
6. OnLoad
7. Button_Click
8. OnLoadComplete
9. OnPreRender
可以看到,Button_Click事件位于OnLoad之后执行,可以测试一下:
public partial class TestControls : System.Web.UI.Page
{
static int count = 0;
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(count+ "Page_Load <br />");
count++;
}
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
Response.Write(count + "OnPreInit <br />");
count++;
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
Response.Write(count + "OnInit <br />");
count++;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Response.Write(count + "OnLoad <br />");
count++;
}
protected override void OnPreLoad(EventArgs e)
{
base.OnPreLoad(e);
Response.Write(count + "OnPreLoad <br />");
count++;
}
protected override void OnLoadComplete(EventArgs e)
{
base.OnLoadComplete(e);
Response.Write(count + "OnLoadComplete <br />");
count++;
}
protected override void OnInitComplete(EventArgs e)
{
base.OnInitComplete(e);
Response.Write(count + "OnInitComplete <br />");
count++;
}
protected override void OnUnload(EventArgs e)
{
base.OnUnload(e);
}
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
Response.Write(count + "OnDataBinding <br />");
count++;
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
Response.Write(count + "OnPreRender <br />");
count++;
}
protected void btnGraphics_Click(object sender, EventArgs e)
{
//Bitmap bmp = new Bitmap(10, 10);
//Graphics g = Graphics.FromImage(bmp);
Response.Write(count + "btnGraphics_Click <br />");
count++;
}
}
May
17
C#中List与IList的区别
List<T>类:表示可通过索引访问的对象的强类型列表,提供用于对列表进行搜索、排序和操作的方法。
IList<T>接口:表示可按照索引单独访问的一组对象。
下面谈谈它们之间的区别:
首先,
List<T>是一个类,
IList<T>是一个接口。
接口和类的区别是本质的,类是负责功能的实现,而接口则是负责功能的定义。
所以它们的区别本质上也就是类和接口的区别。
具体来说,IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口。它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,那么使用IList<T>完全可以胜任。
但是更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序。这个时候IList<T>就爱莫能助了。
1、当你只想使用接口的方法时,ILis<>这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.
2、IList <>是个接口,定义了一些操作方法这些方法要你自己去实现
List <>是泛型类,它已经实现了IList <>定义的那些方法
IList <Class1> IList11 =new List <Class1>();
List <Class1> List11 =new List <Class1>();
这两行代码,从操作上来看,实际上都是创建了一个List<Class1>对象的实例,也就是说,他们的操作没有区别。
只是用于保存这个操作的返回值变量类型不一样而已。
那么,我们可以这么理解,这两行代码的目的不一样。
List <Class1> List11 =new List <Class1>();
是想创建一个List<Class1>,而且需要使用到List<T>的功能,进行相关操作。
而
IList <Class1> IList11 =new List <Class1>();
只是想创建一个基于接口IList<Class1>的对象的实例,只是这个接口是由List<T>实现的。所以它只是希望使用到IList<T>接口规定的功能而已。
再举一个例子,比如你要实现一个集合类,但是你认为添加的时候要做一下判断,不能重复,你可以这样做:
//方法1:
public class MyCollection1 : List<MyItem>
{
public new void Add(MyItem item)
{
if (this.Contains(item)) return;
base.Add(item);
}
}
//方法2:
public class MyCollection2 : IList<MyItem>
{
private List<MyItem> innerList = new List<MyItem>();
public void Add(MyItem item)
{
if (this.Contains(item)) return;
base.Add(item);
}
//实现n多的方法后,附带的,有个Add方法,实现即可,实现方法略
}
如果是从List继承而来,那我如果这样写,就能跳过检查了。但是不会调用你写的Add方法,而是调用List的Add方法。
MyCollection1 mc1 = new MyCollection1();
.....
System.Collection.IList listData = mc1;
listData.Add(listData[0]);
这样就不会执行你写的检查代码。但如果用下面方法,则会执行你写的Add方法:
MyCollection2 mc2 = new MyCollection2();
.....
System.Collection.IList listData = mc2;
listData.Add(listData[0]);
总之,正如那些高手说的:
接口实现松耦合...有利于系统的维护与重构...优化系统流程...
鼓励使用接口
这样可以实现功能和具体实现的分离
实现接口分离的原则
不是看实际需要用的
List<T>类:表示可通过索引访问的对象的强类型列表,提供用于对列表进行搜索、排序和操作的方法。
IList<T>接口:表示可按照索引单独访问的一组对象。
下面谈谈它们之间的区别:
首先,
List<T>是一个类,
IList<T>是一个接口。
接口和类的区别是本质的,类是负责功能的实现,而接口则是负责功能的定义。
所以它们的区别本质上也就是类和接口的区别。
具体来说,IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口。它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,那么使用IList<T>完全可以胜任。
但是更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序。这个时候IList<T>就爱莫能助了。
1、当你只想使用接口的方法时,ILis<>这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.
2、IList <>是个接口,定义了一些操作方法这些方法要你自己去实现
List <>是泛型类,它已经实现了IList <>定义的那些方法
IList <Class1> IList11 =new List <Class1>();
List <Class1> List11 =new List <Class1>();
这两行代码,从操作上来看,实际上都是创建了一个List<Class1>对象的实例,也就是说,他们的操作没有区别。
只是用于保存这个操作的返回值变量类型不一样而已。
那么,我们可以这么理解,这两行代码的目的不一样。
List <Class1> List11 =new List <Class1>();
是想创建一个List<Class1>,而且需要使用到List<T>的功能,进行相关操作。
而
IList <Class1> IList11 =new List <Class1>();
只是想创建一个基于接口IList<Class1>的对象的实例,只是这个接口是由List<T>实现的。所以它只是希望使用到IList<T>接口规定的功能而已。
再举一个例子,比如你要实现一个集合类,但是你认为添加的时候要做一下判断,不能重复,你可以这样做:
//方法1:
public class MyCollection1 : List<MyItem>
{
public new void Add(MyItem item)
{
if (this.Contains(item)) return;
base.Add(item);
}
}
//方法2:
public class MyCollection2 : IList<MyItem>
{
private List<MyItem> innerList = new List<MyItem>();
public void Add(MyItem item)
{
if (this.Contains(item)) return;
base.Add(item);
}
//实现n多的方法后,附带的,有个Add方法,实现即可,实现方法略
}
如果是从List继承而来,那我如果这样写,就能跳过检查了。但是不会调用你写的Add方法,而是调用List的Add方法。
MyCollection1 mc1 = new MyCollection1();
.....
System.Collection.IList listData = mc1;
listData.Add(listData[0]);
这样就不会执行你写的检查代码。但如果用下面方法,则会执行你写的Add方法:
MyCollection2 mc2 = new MyCollection2();
.....
System.Collection.IList listData = mc2;
listData.Add(listData[0]);
总之,正如那些高手说的:
接口实现松耦合...有利于系统的维护与重构...优化系统流程...
鼓励使用接口
这样可以实现功能和具体实现的分离
实现接口分离的原则
不是看实际需要用的
May
17
using System.Text;
protected void DataHuanBind()
{
//焦点新闻
StringBuilder StrSql = new StringBuilder();
StrSql.Append("select top 3 id,title,newsurl,lanternurl,classid from hotel_news where ");
StrSql.Append("ischeck=1 and isenglish=0 and islantern=1");
StrSql.Append(" order by id desc");
SqlDataReader sdr = SqlHelper.ExecuteReader(StrSql.ToString());
StringBuilder builder1 = new StringBuilder();
StringBuilder builder2 = new StringBuilder();
StringBuilder builder3 = new StringBuilder();
while (sdr.Read())
{
builder1.Append(",");
builder1.Append(sdr.GetString(sdr.GetOrdinal("lanternurl")));
builder2.Append(",");
builder2.Append("<a class=\"bla\" href=\"");
builder2.Append(GetUrl(sdr.GetString(sdr.GetOrdinal("newsurl")), sdr.GetInt32(sdr.GetOrdinal("classid"))));
builder2.Append("\" target=\"_blank\"><strong>");
builder2.Append(sdr.GetString(sdr.GetOrdinal("title")));
builder2.Append("</strong></a>");
builder3.Append(",");
builder3.Append(GetUrl(sdr.GetString(sdr.GetOrdinal("newsurl")), sdr.GetInt32(sdr.GetOrdinal("classid"))));
}
sdr.Close();
if (builder1.Length > 0)
{
builder1.Remove(0, 1);
builder2.Remove(0, 1);
builder3.Remove(0, 1);
picurl = builder1.ToString().Split(',');
titleurl = builder2.ToString().Split(',');
newsurl = builder3.ToString().Split(',');
if (picurl.Length != 3)
{
picurl = "nothing,nothing,nothing".Split(',');
titleurl = "nothing,nothing,nothing".Split(',');
newsurl = "nothing,nothing,nothing".Split(',');
}
}
else
{
picurl = "nothing,nothing,nothing".Split(',');
titleurl = "nothing,nothing,nothing".Split(',');
newsurl = "nothing,nothing,nothing".Split(',');
}
}
参考:
http://521dd.blog.sohu.com/entry/4567837/
http://blog.csdn.net/erroraspx/archive/2010/02/14/5308712.aspx
May
16
May
15
Lady.GaGa-[Poker Face]MV
Lady GaGa1986年出生于纽约的Yonkers,双亲为意大利人。小时候就读于名为the Sacred Heart的天主教学校,时尚名媛Paris Hilton(帕丽斯·希尔顿)和Caroline Kennedy都是她的校友。2006年,Gaga在自纽约大学辍学之后,签约Interscope Records成为作曲人。曾为布兰妮、菲姬、小野猫、阿肯等知名歌手作曲。当Akon发现Gaga同时具有幕前演唱的实力后,他签约Gaga到自己旗下,自此她开始筹备首张个人专辑。2008年,Gaga发布了自己的首张个人专辑《The Fame》,她自己解释此专辑为“有关让所有人都能感觉到如何著名。”
[
阅读全文]
阅读全文]
May
15
震撼!澳洲第一快闪团悉尼港飙舞Lady Gaga及凯莉米洛等歌星热门舞曲引路人围观!
“快闪行动”的简称。
“快闪行动”是新近在国际流行开的一种嬉皮行为,可视为一种短暂的行为艺术。简单地说就是:许多利用网络联系的人,通过短信或bbs约定一个指定的地点,在明确指定的时间同时做一个指定的不犯法却很引人注意的动作,然后赶快走人。又译“聪明暴民(Smart Mobs)”、“暴民(Mobs)”、“快闪暴走族”(flash mobs)、“快闪族”、“聪明行动帮”等等。反正,五花八门,称呼混乱。其中“闪”在闽南语中的意思是躲开、让开。
“快闪行动”的简称。
“快闪行动”是新近在国际流行开的一种嬉皮行为,可视为一种短暂的行为艺术。简单地说就是:许多利用网络联系的人,通过短信或bbs约定一个指定的地点,在明确指定的时间同时做一个指定的不犯法却很引人注意的动作,然后赶快走人。又译“聪明暴民(Smart Mobs)”、“暴民(Mobs)”、“快闪暴走族”(flash mobs)、“快闪族”、“聪明行动帮”等等。反正,五花八门,称呼混乱。其中“闪”在闽南语中的意思是躲开、让开。
[
阅读全文]
阅读全文]






Windows Media Player文件

