[原创]从ASP到ASP.Net-风的学习手记(一)
文章作者:勇敢的风 [E.S.T顾问团] feng.cnblog.com.cn信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])
近日与坏坏和老龙准备共同创作一个站点,在写计划书时一直考虑是否要使用.Net来写,最后考虑到多方面的原因决定用.Net来写。在此之前除了熟悉ASP外对.Net几乎一无所知,那么就要从0开始,于是下载了MSND和VS.Net,下决心开始学习.Net。
声明:这篇文章所写的内容只是近一个星期以来对.Net的一个学习总结或者叫学习备注,文中的内容纯属一个新人的对.Net的理解,因此谈不上教程。
这篇文章的内容里面没有介绍任何.Net中提供的控件,目的是为了能让学习ASP的朋友能够对ASP.Net有所了解,所以尽可能的从ASP的角度出发去介绍.Net中的部分要点。
我的环境:
.Net 2.0 这里阐述的很多东西在1.1下是不能使用的。
SQL2005
一、数据库的链接
遇到的第一个问题就是数据库链接,ADO.Net与ADO的出入太大,十分摸不着头绪。于是就源码、看源码,首先使用vs.Net来做些简单的链接,然后看看代码。发现了.Net站点的控制文件web.config,找了不少资料,一片麻,一点都不明白,干脆死套好了(过程就不说了,这里直接提供代码),于是就用vs.Net的功能让其自动创建如下:
web.config的数据链接部分:
<connectionStrings>
<add name="conn" connectionString="Data Source=127.0.0.1;Initial Catalog=maindb;Persist Security Info=True;User ID=ppp;Password=ppp" providerName="System.Data.SqlClient" />
</connectionStrings>
调用方法:
dim Conn As SQLConnection = New SQLConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)
PS:这里使用MSSQL Server 2005,在2000中本地计算机用local表示,2005则要用localhost表示
二、数据库的使用
ADO.Net的核心是DataSet,请参阅MSDN
链接代码:
Dim ds As DataSet = New DataSet("ds")
Dim Conn As SQLConnection = New SQLConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)
Dim da As New SqlDataAdapter("select * from user",conn) 'SqlDataAdapter是sqlclient的一个子类,请参阅MSDN
'PS:用DataSet时可以省略open()方法
da.fill(ds,"user") 'fill是SqlDataAdapter中将数据内容导入DataSet的方法。user表在dataset中用ds.tables(0)或者da.tables("user")来表示
如此就可以使用DataSet来调用数据库的数据了
具体方法请参阅DataTable类、DataRow类和DataColumn类
代码如下:
ds.tables(0).rows(0)(0)
或者
da.tables(0).rows(0).itme(0)
DataSet也可以理解为DataTable的集合,DataTable我个人认为才是ADO.Net的真正核心,MSDN中也提到了
如此我们可以直接跳过DataSet来直接建立DataTable,代码如下:
Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("mconn").ConnectionString)
Dim da As New SqlDataAdapter("select * from account", conn)
Dim dt As New DataTable("dt")
da.Fill(dt)
response.write(dt.rows(0)(0))
三、数据更改
ADO.Net中提供了较为简单的更改方法,据说效率太低,代码如下:
ds.tables(0).rows(0).item("name") = "ssd" '更新
da.update(ds,"user") '更新到user表
Dim dr As datarow
dr = ds.Tables(1).NewRow() '新建行
dr("name") = "feng" '添加新建数据
ds.Tables(1).Rows.Add(dr) '应用
da.update(ds,"user")'更新到user表
ds.Tables(1).Rows(0).delete() '删除行
da.update(ds,"user")'更新到user表
PS:为了提高效率和节省内存在使用Fill方法后建议使用Dispose方法来清除da的内容,并不使用该方法更新数据库
当然还有其它的一些方法,非常之繁琐,难道没有像ADO那样简单的一句话更新的方法吗,于是我就找到了如下的方法:
为了方便,和贴近ADO,我将其写成一个函数,至于为什么这样我也没有去深入了解,管他呢,能用就可以了
Function update(str,conn)
Dim SqlCommand As New SqlCommand(str,conn)
conn.open()
update = SqlCommand.ExecuteNonQuery()
conn.close
End Function
update("update user set name = 'feng' ",conn)
四、优化读取效率
这部分内容没有详细测试,请参阅本节最后的补充,这里我简单的写了一个分页的类,代码如下:
Class Table_info
Public ds As DataSet = New DataSet("ds")
Public Conn As SQLConnection = New SQLConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)
Public Index As String = " id "'Index 索引字段 或者 叫关键字段
Public Word As String = " * "'Word 显示字段
Public Table As String 'Table 显示表
Public Order As String = "" 'Order 对关键字的排序 值为 desc 和 asc
Public Search As String 'Search where 后的内容,不包含 where
Public QueryString As String = "?page=" 'QueryString 页链接信息
Public PageInfo As String 'Pageinfo 翻页信息
Public TableCount As Integer 'TableCount 信息量
Public PageCount As Integer 'PageCount 页数量
Public Page As Integer = 1 'Page 页次
Public PageSize As Integer = 20 'PageSize 页显示量
WriteOnly Public Property SetConn() As SQLConnection
Set(ByVal v As SQLConnection)
Conn = v
End Set
End Property
WriteOnly Public Property SetQueryString() As String
Set(ByVal v As String)
QueryString = v
End Set
End Property
WriteOnly Public Property SetIndex() As String
Set(ByVal v As String)
Index = v
End Set
End Property
WriteOnly Public Property SetWord() As String
Set(ByVal v As String)
Word = v
End Set
End Property
WriteOnly Public Property TableSet() As String
Set(ByVal v As String)
Table = v
End Set
End Property
WriteOnly Public Property SearchSet() As String
Set(ByVal v As String)
Search = v
End Set
End Property
WriteOnly Public Property OrderSet() As String
Set(ByVal v As String)
Order = v
End Set
End Property
WriteOnly Public Property PageSizeSet() As Integer
Set(ByVal v As Integer)
PageSize = v
End Set
End Property
WriteOnly Public Property PageSet()
Set(v)
If IsNumeric(v) then
Page = v
End if
End Set
End Property
function execute()
If Order <> "" Then
If Order = "asc"
Order = " Order by " & Index & " asc "
Else
Order = " Order by " & Index & " desc "
End If
End If
If Table = "" Then
execute = "请设定表名"
Exit function
End If
Dim da As New SqlDataAdapter("select " & Word & " from " & Table & Search & Order,Conn)
da.fill(ds,Table)
TableCount = ds.Tables(0).rows.count
ds = Nothing
If (TableCount Mod PageSize) = 0 Then
PageCount = TableCount\PageSize
Else
PageCount = TableCount\PageSize + 1
end If
If page > PageCount Then page = PageCount
If page > 0 then
page = page - 1
Else
page = 0
End If
ds = New DataSet()
da.fill(ds,Page * PageSize ,PageSize,Table)
da.Dispose()
da = nothing
page = page + 1
PageInfo = "共找到" & TableCount & "条信息,分" & PageCount & "页,每页" & PageSize & "个,当前第" & Page & "页。"
if page < 2 then
PageInfo += " 首页 上页 "
Else
PageInfo += " <a href=""" & QueryString & 1 & """>首页</a> <a href=""" & QueryString & (page - 1) & """>上页</a> "
End if
if page - PageCount >= 0 then
PageInfo += " 下页 尾页 "
else
PageInfo += " <a href=""" & QueryString & (page+1) & """>下页</a> <a href=""" & QueryString & PageCount & """>尾页</a> "
end if
PageInfo += "第<input type=""text"" name=""page"" size=""4"" value=""" & Page & """>页 <input type=""button"" name=""Submit"" value=""转到"" onclick=""window.location.href='" & QueryString & "' + page.value"">"
End function
End Class
用法:
dim Conn As SQLConnection = New SQLConnection(ConfigurationManager.ConnectionStrings("mConn").ConnectionString)
Dim dt As New DataTable()
Dim tt As New Table_info()
tt.Setconn = conn
tt.SetQueryString = "cc.ASPx?page="
tt.Tableset = "user"
tt.pageset = request("page")
response.write(tt.execute)
dt = tt.ds.tables(0)
response.write(dt.rows(0)("name"))
PS:用法中的dt可以不使用的,用了只是为了以后写起来方便,这种方法是会占用额外的内存的,不过也可以释放tt.ds.table(0)他所占用的内存。
补充:
1、这个类中Fill方法是用了2次,不知是否会影响效率
2、关于效率,没有测试直接用Tables(n)的速度如何
3、这个类中只能调用1个表,暂时没有好的方法来调用2个表
五、从VBScript到VB.Net的注意事项
在使用ASP的时候我们一直使用VBScript或者JavaScript作为脚本,到了.Net就要换成VB.Net或者J#,由于我对JavaScript知之甚少,所以这里仅介绍VB.Net
在VBS中response.write可以省略括号,VB.Net就不能省略
在VBS中有Property Get、Property Set 在VB.Net中只有Property,Get和Set在Property中设置
在VBS中函数、过程可以写在<%%>中,在.Net中却只能写在Script的块中
VB.Net可以使用[+=]了
VB.Net可以使用递归函数了
其它的可以参阅MSND中的VB新增功能
六、XML
XML的确是个好东西,可以将数据库中常用的,数量不多的数据直接导入到XML文件中,这样我们就可以大大节省数据库的负担,而DataSet与XML的无缝结合使得这种方法便的十分简单。
导入代码:
ds.WriteXml(server.mappath("my.xml")) '一般导入
ds.WriteXml(server.mappath("my.xml"),XmlWriteMode.WriteSchema) '导入时导入数据格式和数据类型,建议使用该方法来导入,以方便以后再读取XML文件后可以计算其内容
读取XML代码:
Dim ds As Dataset = New dataset()
ds.ReadXml(server.mappath("my.xml"))
PS:在前面的定义DataSet的代码中使用了dataset(name),如果将带有名字的ds导入XML文件后就能明白这个name的用处了。
七、计算DataSet
DataTable提供了Compute的方法,我们可以通过该方法来计算DataSet内的所有表数据
代码:
ds.tables(0).comput("sum(money)","true")
说明:
上面代码表示获得money列的合计
第一个参数为聚合集函数(如:count等等),函数的值为表的列名
第二个参数为Sql语法中 where 的字符串
true看起来很不好理解,如果把它看作 1=1就好理解了
ds.tables(0).comput("sum(money)","sex = '男'")'计算所有男性的金额合计
PS:该方法可以用于已导入数据格式的XML数据库的计算
文章中所提供的代码我会用到我与坏坏和老龙合作的新的站点中。
以上是我接触.Net一周来的一些使用.Net的心得,欢迎高手指点。
如果是我。我会用JSP。.Net 太笨重了。。 呵呵,确实如此。不过我也该学学.net,主流脚本就差.net了。 看来过段时间我学PHP时就要和楼上两位多多讨教咯。呵呵。希望介时能不吝赐教。 偶就是学.NET的,
学.NET的聪明~~HOHO [s:289] 个人感觉还是PHP好 [quote]引用第1楼bink于2007-05-23 22:23发表的 :
如果是我。我会用JSP。.Net 太笨重了。。[/quote]
你不觉得JSP成本太高吗?如果不是商务站点用这个还行,一般的就算了 我个人认为。垃圾站。ASP
小型站。PHP
中大型站。.NET
超级大站用JSP。
有特殊需要的。CGI。 风叔可以加我,我搞asp.net 两年多了,你做项目时有啥小问题,我还是可以帮上的!
PS:你用VB.net来写asp.net可以是可以!不过个人感觉,别把asp带到.net里,不然你会痛苦的!还有,你的分页控件太繁琐了,我用c#来写,只要一半左右的代码量!
MyQQ:23911 互相交流!进步! 例如:asp.net中,用c#读取web.config文件的配置节内容,只需:
System.Configuration.ConfigurationSettings.AppSettings["Web.config中的值"].ToString();
而且!提个建议:代码尽量不要把asp习惯带到asp.net,(就是代码写在页面)这样对于源代码保护来说,一点都没作用,而且影响执行效率,类库编译为静态链接库存放,大大提高代码执行效率,更重要的是能保护你的代码! [quote]引用第5楼wwwst于2007-05-24 12:31发表的 :
[s:289] 个人感觉还是PHP好[/quote]
看了一早上的PHP CODE,现在头还晕,已经推荐风学python 毕竟是新手,没办法,asp的东西不得不带进来
另外Configuration是1.1的东西,2.0应该用ConfigurationManager
其他的建议很好,由于刚入手,还需多多指点
PS:[风叔!!!]我有那么老么??? python
唉~~还要重0开始
先看.net
只能是以后有时间再学了
页:
[1]