Q:  如何统计某一篇文章的「浏览数」、「点阅数」、「点击次数」? 怎么做?

本文的完整解说,已经出版书籍,放在 ASP.NET专题实务 II,也就是「下集」

 

A:  请您先参考这两篇文章,有了这些基础,才能作下去。

第一,请您先看过这篇文章 ([ADO.NET] DataReader的标准范例 for ASP.NET 2.0 / 3.5 ),再来继续下面的内容

第二,[习题] 补充本书第14章 的范例--自己撰写ADO.NET程式 / 网站的首页

本范例,是第二篇文章的补充。


'----自己写的----
Imports System
Imports System.Web.Configuration
Imports System.Data
Imports System.Data.SqlClient
'----自己写的----   


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim my_hit_no As Integer = 0  '--点阅数   
       
        If IsNumeric(Request("id")) And Request("id") <> "" Then

            Dim Conn As SqlConnection = New SqlConnection
            Conn.ConnectionString = WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString
            Dim dr As SqlDataReader = Nothing
            Dim cmd As New SqlCommand("select * from test where id = @ID, Conn)
            cmd.parameters.AddWithValue("@ID", Request(ïd"))   '---- 参数写法,避免SQL Injection攻击 

            Try
                Conn.Open()   '---- 这时候才连结DB                 
                dr = cmd.ExecuteReader()   '---- 这时候执行SQL指令,取出资料                  
                Dim myArticle As String = Nothing

                '****************************************(start)                 
                dr.Read()
                Label1_title.Text = dr.Item("title").ToString()
                Label2_summary.Text = dr.Item("summary").ToString()
                Label3_test_time.Text = dr.Item("test_time").ToString()
                '//////////// 文章分段 /////////////////////////////////////                 
                myArticle = dr.Item("article").ToString()
                Label4_article.Text = Replace(myArticle, vbCrLf, "<br>")
                '////////////////////////////////////////////////////////////////                  
                Label5_author.Text = dr.Item("author").ToString()
                Label6_hit_no.Text = dr.Item("hit_no")  '--点阅数                 
                my_hit_no = CType(dr.Item("hit_no"), Integer)  '--点阅数                 
                '****************************************(end)    
          
            Catch ex As Exception   '---- 如果程式有错误或是例外状况,将执行这一段                 
                Response.Write("Error Message----  " & ex.ToString())
            Finally
                If Not (dr Is Nothing) Then
                    cmd.Cancel()                     '----关闭DataReader之前,一定要先「取消」SqlCommand                     
                    dr.Close()
                End If

                '===============================================                 
                '== 点阅 / 点击次数加一 
                Dim cmd1 As New SqlCommand("update test set hit_no = @hit_no where id = @id", Conn)
                cmd1.Parameter.AddWithValue("@hit_no", (my_hit_no + 1))
                cmd1.Parameter.AddWithValue("@id", Request("id"))
                cmd1.ExecuteNonQuery()
                '===============================================    

                cmd1.Cancel()

                If (Conn.State = ConnectionState.Open) Then
                    Conn.Close()
                    Conn.Dispose() '---- 一开始宣告有用到 New的,最后必须以 .Dispose()结束                 
                End If
            End Try

        Else
            Response.Write("Error...没有这篇文章!")
            Response.End()  '--程式中断,不再执行。您也可以改写成 Return。看看画面有何不同?         
        End If
    End Sub

 

本文的完整解说,已经出版书籍,放在 ASP.NET专题实务 II,也就是「下集」

===========================================================================================

如果上面的 DataReader,您要使用「参数」来作,以避免初步的SQL Injection(资料隐码)攻击

请稍作修改如下:

            '**** 重 点!*************************************************
            '**** 改用 SqlCommand的 @参数来作

            Dim cmd As New SqlCommand("select * from test where id = @id", Conn)

            cmd.Parameters.Add("@id", SqlDbType.Int)
            cmd.Parameters("@id").Value = CType(Request("id"), Integer)


            '== 参考网址  http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqlcommand.parameters.aspx
            '************************************************************

===========================================================================================

您有没有发现,连续两篇文章

我用同一个程式范本(范例 [ADO.NET] DataReader的标准范例 for ASP.NET 2.0 / 3.5 )

改啊改的,就能衍生出很多功能。

一点都不难啊

 

先不要急,底子打好了,

您的"能力"才能跟得上您的"想像力"

才不会什么都写不出来。

 

初学者会发现程式写不出来,通常都是

  • 资料表不会设计。
  • 不懂 ADO.NET,只会拖拉「现有的控制项」来做。
  • 手边没有范本可以改写(你要我画面一片空白,一个字一个字慢慢 Key in,我也没这么神。我只不过范例搜集的比较多、比较会改)

 

下面两个方法可以帮您脱离这个困境:

  • 多看书、多看书、多看书
  • 多练习、多练习、多练习

 

ASP.NET专题实务里面的第 13/14两章都有类似范例可以参考

希望对读者有帮助。

相关文章