[习题]ADO.NET #8,文章(产品)的浏览次数 / 点阅数 / 点击次数,怎么作?<br>兼论 DataReader 新增/删除/修改的写法,.ExecuteNonQuery()方法
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两章都有类似范例可以参考
希望对读者有帮助。