邪恶八进制信息安全团队技术讨论组's Archiver

勇敢的风 2007-5-23 18:01

[原创]从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) &#39;SqlDataAdapter是sqlclient的一个子类,请参阅MSDN
  &#39;PS:用DataSet时可以省略open()方法
  da.fill(ds,"user") &#39;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" &#39;更新
  da.update(ds,"user") &#39;更新到user表

  Dim dr As datarow
  dr = ds.Tables(1).NewRow()  &#39;新建行
  dr("name") = "feng"    &#39;添加新建数据
  ds.Tables(1).Rows.Add(dr)  &#39;应用
  da.update(ds,"user")&#39;更新到user表

  ds.Tables(1).Rows(0).delete()  &#39;删除行
  da.update(ds,"user")&#39;更新到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 = &#39;feng&#39; ",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 "&#39;Index 索引字段 或者 叫关键字段
    Public Word As String = " * "&#39;Word 显示字段
    Public Table As String &#39;Table 显示表
    Public Order As String = "" &#39;Order 对关键字的排序 值为 desc 和 asc
    Public Search As String &#39;Search where 后的内容,不包含 where
    Public QueryString As String = "?page=" &#39;QueryString 页链接信息
    Public PageInfo As String &#39;Pageinfo 翻页信息
    Public TableCount As Integer &#39;TableCount 信息量
    Public PageCount As Integer &#39;PageCount 页数量
    Public Page As Integer = 1 &#39;Page 页次
    Public PageSize As Integer = 20 &#39;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=&#39;" & QueryString & "&#39; + 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")) &#39;一般导入
  ds.WriteXml(server.mappath("my.xml"),XmlWriteMode.WriteSchema) &#39;导入时导入数据格式和数据类型,建议使用该方法来导入,以方便以后再读取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 = &#39;男&#39;")&#39;计算所有男性的金额合计

  PS:该方法可以用于已导入数据格式的XML数据库的计算


  
文章中所提供的代码我会用到我与坏坏和老龙合作的新的站点中。

以上是我接触.Net一周来的一些使用.Net的心得,欢迎高手指点。

bink 2007-5-23 22:23

如果是我。我会用JSP。.Net 太笨重了。。

曾云好 2007-5-24 10:28

呵呵,确实如此。不过我也该学学.net,主流脚本就差.net了。

bink 2007-5-24 11:32

看来过段时间我学PHP时就要和楼上两位多多讨教咯。呵呵。希望介时能不吝赐教。

被偷de贼 2007-5-24 12:04

偶就是学.NET的,
学.NET的聪明~~HOHO

wwwst 2007-5-24 12:31

[s:289]  个人感觉还是PHP好

net-owl 2007-5-24 14:08

[quote]引用第1楼bink于2007-05-23 22:23发表的 :
如果是我。我会用JSP。.Net 太笨重了。。[/quote]
你不觉得JSP成本太高吗?如果不是商务站点用这个还行,一般的就算了

bink 2007-5-24 14:25

我个人认为。垃圾站。ASP
小型站。PHP
中大型站。.NET
超级大站用JSP。
有特殊需要的。CGI。

寂寞宝贝 2007-5-24 16:46

风叔可以加我,我搞asp.net 两年多了,你做项目时有啥小问题,我还是可以帮上的!

PS:你用VB.net来写asp.net可以是可以!不过个人感觉,别把asp带到.net里,不然你会痛苦的!还有,你的分页控件太繁琐了,我用c#来写,只要一半左右的代码量!

   MyQQ:23911  互相交流!进步!

寂寞宝贝 2007-5-24 16:54

例如:asp.net中,用c#读取web.config文件的配置节内容,只需:
System.Configuration.ConfigurationSettings.AppSettings["Web.config中的值"].ToString();

而且!提个建议:代码尽量不要把asp习惯带到asp.net,(就是代码写在页面)这样对于源代码保护来说,一点都没作用,而且影响执行效率,类库编译为静态链接库存放,大大提高代码执行效率,更重要的是能保护你的代码!

无双坏坏 2007-5-24 20:16

[quote]引用第5楼wwwst于2007-05-24 12:31发表的 :
[s:289]  个人感觉还是PHP好[/quote]

看了一早上的PHP CODE,现在头还晕,已经推荐风学python

勇敢的风 2007-5-24 21:56

毕竟是新手,没办法,asp的东西不得不带进来
另外Configuration是1.1的东西,2.0应该用ConfigurationManager
其他的建议很好,由于刚入手,还需多多指点

PS:[风叔!!!]我有那么老么???

勇敢的风 2007-5-24 21:58

python
唉~~还要重0开始
先看.net
只能是以后有时间再学了

页: [1]
© 1999-2008 EvilOctal Security Team