close

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兩章都有類似範例可以參考

希望對讀者有幫助。

arrow
arrow
    創作者介紹
    創作者 MIS2000 Lab 的頭像
    MIS2000 Lab

    MIS2000 Lab -- ASP.NET專題實務 / WebForm + MVC線上教學影片

    MIS2000 Lab 發表在 痞客邦 留言(0) 人氣()