写在前面的话
.net已经上路了,前几天着重写了写asp.net(VB)的基本安装、语法、变量、原计划把服务器控制结构和过程编程也写上,但,
这和asp里面的没什么区别,在循环结构里面多了一个with...end with操作一个对象的属性的,其他的都差不多,想看详细教程的请查阅Msdn,我就跳过这一节了,另外跳转结构---子例程和函数也跳过,不过,里面的模块化很有意思的,还有传递参数的时候按照引用还是值传递这个很是重要,至于其中的区别,学过c++的都知道,不太明白的请查阅相关资料......由于篇幅关系,我把事件驱动编程和回送也跳过,相应用户的事件组,这个很有必要在这里说说。
官方定义事件:事件是由来自代码外部的某种力量在应用程序中引发的一个操作.将事件驱动环境按照顺序分为以下4个部分:
1、发生一个事件,like用户单击按钮;
2、系统检测到事件,asp.net注册已发生的事件;
3、系统对事件做反应,执行一些代码;
4、系统返回其初始状态,等待下一事件;
html叶子是按照代码的顺序依次执行的,而事件驱动编程强调的是相应用户,执行事件,等待相应的思想。
ASP.NET支持3个主要的事件组,第一组是html内部的事件,这些事件在浏览器上执行。第二组包含在asp.net生成页面时自动发生,我们使用这些事件建立页面.第三种包含了用户与页面交互时发生的所有事件(这种最强大)。
事件驱动编程和回送回送是处理过程,该过程包括:浏览器将信息发送到浏览器,告诉服务器处理事件,服务器执行次事件处理程序中的代码,并将得到的html再传送到浏览器,回送只作用于有属性runat="server"的web窗口,且只有asp.net控件才能将信息传送到服务器。
下面看个事件驱动的实例结束本节.呵呵.
实例:我们要做这件事,设计一个"东西",要实现的是能加减乘除操作,并且显示出计算结果。
现看看算法吧:
sub page_load(sender as object,e as eventargs)
btnadd.backcolor=system.drawing.color.lightgray
btnsubtract.backcolor=system.drawing.color.lightgray
btnfactor.backcolor=system.drawing.color.lightgray
btnra.backcolor=system.drawing.color.lightgray
end sub
sub ca(sender as object,e as eventargs)
select case sender.id
case "btnadd"
labtxt.text=cdbl(input1.text)+cdbl(input2.text)
case "btnsubtract"
labtxt.text=cdbl(input1.text)-cdbl(input2.text)
case "btnfactor"
labtxt.text=cdbl(input1.text)*cdbl(input2.text)
case "btnra"
labtxt.text=cdbl(input1.text)/cdbl(input2.text)
end select
sender.backcolor=system.drawing.color.yellow
end sub
分析上面代码:page_load事件当整个页面第一次可见时发生,这里实现了令4个按钮的背景颜色为淡灰色。子例程ca执行的是用户点击按钮操作后发生的事件,然后回送labtxt上,最后改变选择web控件对象(按钮)的背景颜色,注意到:
sub ca(sender as object,e as event)
'some code .............
end sub
它是事件处理程序提供的参数向处理程序传递参数事件信息,其中第一个参数sender提供了引发事件对象的引用,第二个参数E是一个事件类,用于捕捉所处理时间状态的信息,并传递与该事件对应的对象。
下面在视图中拉上这7个控件,注意这里需要正确填写每个控件的ID,并且要在每个按钮上添加事件:
onclick="ca"
意思就是说当点击这个按钮是发生事件ca,这是不可缺少的。
一切搞定了的话,最后的aspx页面效果就像这样:
<%@ Page Language="VB" %>
<script runat="server">
sub page_load(sender as object,e as eventargs)
btnadd.backcolor=system.drawing.color.lightgray
btnsubtract.backcolor=system.drawing.color.lightgray
btnfactor.backcolor=system.drawing.color.lightgray
btnra.backcolor=system.drawing.color.lightgray
end sub
sub ca(sender as object,e as eventargs)
select case sender.id
case "btnadd"
labtxt.text=cdbl(input1.text)+cdbl(input2.text)
case "btnsubtract"
labtxt.text=cdbl(input1.text)-cdbl(input2.text)
case "btnfactor"
labtxt.text=cdbl(input1.text)*cdbl(input2.text)
case "btnra"
labtxt.text=cdbl(input1.text)/cdbl(input2.text)
end select
sender.backcolor=system.drawing.color.yellow
end sub
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<p>
<asp:TextBox id="input1" runat="server"></asp:TextBox>
<asp:Button id="btnadd" runat="server" Text=" + " onclick="ca"></asp:Button>
<asp:Button id="btnsubtract" runat="server" Text=" - " onclick="ca"></asp:Button>
</p>
<p>
<asp:TextBox id="input2" runat="server"></asp:TextBox>
<asp:Button id="btnfactor" runat="server" Text=" * " onclick="ca"></asp:Button>
<asp:Button id="btnra" runat="server" Text=" ÷ " onclick="ca"></asp:Button>
</p>
<p>
<asp:Label id="labtxt" runat="server" Width="201px" Height="26px"></asp:Label>
</p>
<!-- Insert content here -->
</form>
</body>
</html>
对象就是能看到,感到,听到,触摸到,尝到或闻到的东西,在这里我们这样“定义”:对象是一个自包含的实体,用一组可识别的特性和行为来标识。
在面向对象的编程(oop)的编程方式,用使用下面的两个术语。
类:这是对象的模板,定义了对象的特性。
实例:这是一个真实的对象,可以与之交互的东西。
属性,方法和事件
在OOP中,下面的术语描述对象的特性。
属性:这是一个名次,描述了某个对象的属性
方法:这是一个动词,描述了对象可以完成的工作,或者希望它完成的工作。
事件:描述了对象为相应某个动作而执行的操作。
.net中的对象
在.net中,其实所有的东西都是对象。为什么要使用对象?
在编程时,对象的面向对象编程和面向对象设计的一部分,它们具有非常大的优势,许多人认为这是一个复杂的主题,但实际上,它非常简单,可以用四个简单的术语来解释:抽象、封装、多态和继承。
抽象:这是一个隐藏复杂性,类的内部工作情况,所以用户不必知道它的运作方式,就像。如果想要看电视,就不必知道电视机时如何工作的,只需打开电视机,搜索频道即可,on/off开关抽象了实际的操作,在string例子里,有一个trim方法,它可以删除字符串尾部的空格,同样不需要知道他是如何完成这个任务的,只要知道它有这个功能即可。
封装:每个对象都包含进行操作所需要的所有信息,这个对象称为封装,因此对象不比依赖其他对象来完成自己的操作,在术语TOupper()方法中,string不必到其他地方获取信息来把所有的字符转换为大写。
多态:这个术语用于表示不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行,名称一样,但底层实现的代码是不一样的。
继承:它定义了类如何相互关联,共享特性的,继承的工作方式是,定义类和子类,其中子类继承了父类的所有特性,继承的重要性是,它迫使类型相似的类具有一致性,并允许共享代码,如果决定创建一个新类,就不必定义父类的所有特性。
好了,我们看个实例吧,创建一个user类,他具有一下特性:
属性:name ,point,level
方法:post(),reply(),change()
ok,现在在你的webmatrix里面创建吧。
看看以下源码:
public class user
public sub new() private _name as string public property name as string
get set(byval value as string) end property
public property point as integer set(byval value as integer)
if value<0 then end set
end property
public property level as string
get set(byval value as string) end property
end class
end sub
private _point as integer
private _level as string
return _name
end get
_name=value
end set
get
return _point
end get
value=0
end if
_point=value
return _level
end get
_level=value
end set
sub page_load(sender as object,e as eventargs) name.text=blueidea.name
dim blueidea as new user()
blueidea.name="5do8"
blueidea.point="5000"
blueidea.level="终极会员"
point.text=blueidea.point
level.text=blueidea.level
end sub
name: 5do8
point:5000
level:终极会员
代码分析如下:
1、首先用class关键字定义类,后面是类名,而public是表示可以用于其他的程序;
2、然后是构造函数,new(),如果不写的话也行,因为,net默认提供构造函数的,这和c++里面的一个模式;
3、定义私有变量,用来存储类的属性,这些变量在代码的外部不能访问,如何使用这些变量,就要使用property语句即可;
public property name as string set (byval value as string)
get
return _name
end get
_name=value
end set
end property
第一行里面的public声名在外部可以访问,property声明一个属性,它后面是属性的名及其类型。get返回私有变量的值,这是内部机制,接下来的set语句,在属性中存储一个值时执行这个语句,这里仅仅把私有属性设置为参数传送的值,set 语句有些像方法调用,只传一个参数,该参数在设置属性时由.net自动赋值。
..........其他的依次同理....最后是结束类end class。
创建实例的时候:
dim blueidea as new user()
blueidea.name="5do8"
blueidea.point="5000"
blueidea.level="终极会员"
第一行创建user类的一个实例,名称是blueidea。接下来是设置它的属性值。最后绑定在web控件上。
这就是一个很简单的使用类的实例,但不像c++那样,asp.net好像没有提供析构函数释放一些不必要的内存占用等。
另外,高级类属性和方法就不说了,很多,慢慢的在实践中应该可以掌握的。
本文作者: #p#副标题#e#
.net框架包含几个命名空间,其中有几十个用于数据库访问的类,主要有system.data.sqlclient和system.data.oledb两大类,这里我主要介绍小巧一点的system.data.oledb空间中的类,因为system.data.sqlclient只与microsoft sql server数据库一起工作,
而前者是支持access或者oracle 数据库。
system.data.oledb名称空间包含以下这些类:
1、oledbconnection(代表一个打开的数据库连接)
2、oledbcommand(代表一个sql语句或存储过程)
3、oledbdatareader(代表从数据库查询返回的结果)
执行常见的数据库任务
在接下来的一些日子里面,我会陆续的写上如何创建和打开数据库,获取和显示数据库记录,添加新的数据库记录,更新数据库记录,删除数据库记录等。这些都是很基本的操作,但能令初学者心血彭湃的。呵呵。
当您使用microsoft access或者oracle,需要使用以下的页面指令来导入system.data.oledb命名空间:
<%@ import namespace = "system.data.oledb"%>
使用sql server数据库的链接的话是:
<%@ import namespace = "system.data.sqlclient"%>
打开数据库
要访问数据库,首先要创建和打开数据库链接,创建连接的方式看你的数据库类型,如下代码创建了一个sql数据库的连接:
<%@ import namespace = "system.data.sqlclient"%>
第一行导入命名空间,在page_load子例程中创建和打开,先创建一个名为sqlconn的实例,通过向sqlconnection类的构造器传递一个字符串参数,对sqlconn类进行初始化,最后通过sqlconnection类的open()方法实际打开链接。
同样的道理,我们可以类似的打开access的数据库,如下的代码:
<%@ import namespace ="system.data.oledb" %>
sub page_load()
dim conn as oledbconnection
conn=new oledbconnection("provider=microsoft.jet.oledb.4.0;data source=d:\web\web\net\data\db.mdb")
conn.open()
end sub
在使用完数据库链接时,应尽快关闭它是很重要的,每个数据库都有连接数量的限制,关闭链接使它可以供其他的页面使用,应使用下面的语句关闭sqlconnection或者oledbconnection:
yourconnname.close
在ASP.net页面中最常用的是SQL中的select语句:
select szd_first,szd_last
from site_data在ASP.net页面中最常用的是SQL中的select语句:
select szd_first,szd_last
from site_data
where id='2'
在asp.net页面执行一个select语句需要以下4步完成:
1、创建和打开数据库
2、创建沂河代表sql select语句的数据库命令
3、用executereader()方法执行这个命令,并且返回一个datareader.
4、遍历datareader,显示查询的结果。
在使用ado.net查询中,查询的结果在一个datareader中返回,更准确的说,查询的结果由一个sqldatareader或oledbdatareader表示,datareader代表一个只向前的数据库记录流,这意味着datareader每次只代表一个记录,要想获取流中的下一个记录,必须调用read()方法,要想显示所有的记录,必须反复调用read()的方法,直到流的尾部,不能回头。例如asp里面的游标只向前移动。
下面的程序显示了sql server读取数据库的记录:
<%@ import namespace="system.data.sqlclient"%>
<%
dim sqlconn as sqlconnection
dim sqlcmd as sqlcommand
dim sqlreader as sqldatareader
sqlconn=new sqlconnection("server=localhost;uid=sa;pwd=sd;database=data")
sqlconn.open()
sqlcmd=new sqlcommand("select szd_first from site_data",sqlconn)
sqlreader=sqlcmd.executereader()
while sqlconn.read()
response.write("<li>")
response.write(sqlreader("szd_first"))
end while
sqlreader.close
sqlconn.close
%>分析:先导入sql server的ado.net类需要的名称空间,然后创建一个数据库conn,这和asp相似,接着用一个sql select语句的sql字符串初始化sqlcmd对象,这个语句从名为site_data的表中读取所有的记录。然后调用sqlcommand类的executereader()方法执行这个命令,返回执行结果的sqlreader,然后遍历所有记录。
下面演示一个从access数据库里面读出数据的源码:
<%@ Page Language="VB" %>
<%@ import namespace="system.data.oledb"%>
<script runat="server">
sub page_load()
dim conn as oledbconnection
dim accmd as oledbcommand
dim acreader as oledbdatareader
conn= new oledbconnection("provider=microsoft.jet.oledb.4.0;data source=d:\web\web\net\data\db.mdb")
conn.open()
accmd=new oledbcommand("select szd_lastname from site_n",conn)
acreader=accmd.executereader()
while acreader.read()
response.write("<LI>" & acreader("szd_lastname"))
end while
acreader.close
conn.close
end sub
</script>
有时候,我们要查询符合条件的一条记录,如果按照上面的executereader,效率显然很差,这里介绍另外一种方法executescalar,在几张集聚功能的count,max,min等,这个例子:
sub page_load()
dim conn as oledbconnection
dim accmd as oledbcommand
conn= new oledbconnection("provider=microsoft.jet.oledb.4.0;data source=d:\web\web\net\data\db.mdb")
conn.open()
accmd=new oledbcommand("select count(*) from site_n ",conn)
actxt.text=accmd.executescalar()
conn.close
end sub
where id=