PDA

View Full Version : Viết Counter bằng ASP



aspnet
23-10-2002, 00:33
<SPAN class=spnMessageText id=msg>Đầu tiên ta có một file cơ sở dữ liệu bằng Access tên là Counter.mdb với bảng (Table) là Counter và trường (Fields) tên là Count - với kiểu dữ liệu là Long Integer
Và file counter của chúng ta sẽ được trình bày như sau:


&lt;%
'Khai báo biến sẽ sử dụng
Dim Count 'Nhận giá trị của số Counter
Dim strSQL 'Nhận giá trị của câu truy vấn SQL
Dim Conn 'Kết nối đến cơ sở dữ liệu
Dim objRS 'Kết nối Recordset

'Tạo và mở kết nối tới file cơ sở dữ liệu Counter.mdb
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &amp; Server.MapPath("Counter.mdb")
</SPAN>

<SPAN class=spnMessageText>strSQL = "SELECT * FROM Counter "
Set objRS = Conn.Execute(strSQL)

'Kiểm tra xem trong trường Count có giá trị hay không?
If NOT objRS.EOF Then 'Tương đương - Nếu chưa đến cuối mẩu tin (mẩu tin không rỗng) thì

'Gán biến Count bằng với giá trị của mẩu tin trong cơ sở dữ liệu
Count = objRS("Count")
'Và sau đó tăng giá trị của biến Count lên thêm 1 đơn vị
Count = (Count + 1)

'Rồi cập nhật giá trị mới này vào cơ sở dữ liệu
'Câu truy vấn SQL để cập nhật giá trị vào CSDL
strSQL = "UPDATE Counter SET Count = (" &amp; Count &amp; ") "
'Thực thi câu truy vấn này
Set objRS = Conn.Execute(strSQL)

'Ngược lại nếu đã đến cuối mẩu tin trong CSDL, tức là trong CSDL trường Count chưa có giá trị
ELSE

'Gán cho biến Count giá trị bắt đầu từ 1
Count = 1

'Và cập nhật vào CSDL
'Câu truy vấn SQL thêm mới dữ liệu vào CSDL
strSQL = "INSERT INTO Counter (Count) VALUES (" &amp; Count &amp; ") "

'Thực thi câu truy vấn
Set objRS = Conn.Execute(strSQL)

End If

'Đóng và huỷ kết nối
objRS.Close
Set objRS = Nothing
strSQL = ""
%&gt;

Giờ các bạn có thể Include file Counter.asp này vào trang nào mà bạn muốn hiển thị bộ đếm và bạn chỉ việc hiển thị giá trị của nó bằng cách
thêm &lt;% =Count%&gt; vào chỗ nào bạn muổn hiển thị. Hoặc có thể bạn cho hiển thị ngay trong file Counter.asp rồi Include cả file Counter.asp này vào nơi cần hiển thị bộ đếm.</SPAN>

newcinc
23-10-2002, 00:49
Hình như bạn viết hơi bị dài:
Chỉ cần thế này là đủ:
DBase: File: counters.mdb
Table: Counters(cval)
----------------------------
'KHai báo connection String đến database
cnDrv="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &server.MapPath("d16092002/Counters.mdb") &";"

'Tao biến Recordset
set rs=Server.CreateObject("ADODB.Recordset")

'Query tăng Counter
StrSQL="UPDATE Counters SET cval=cval+1"

'Thực thi query
rs.Open StrSQL, cnDrv

Sau khi tăng Counter, chúng ta sẽ hiện nó ra:
StrSQL="SELECT cval FROM Counters;"
rs.Open StrSQL, cnDrv
If not rs.EOF and not rs.BOF Then Response.Write(rs("cval")) End If
rs.Close
set rs=nothing

------------------>
Vấn đề không phải là ở chỗ tăng counter, mà ở chỗ counter đặt ở đâu,...
Nếu là counter số người truy cập, đặt trong hàm Application_OnStart() của file global.asa
Nếu là các counter khác, đặt chỗ cần đặt.

Cái mình muốn đề cập là các bạn thường không để ý câu Query: ....set cval=cval+1 vì nghĩ nó không chạy.........

Một vài gòp ý, mong được trao đổi thêm với các bạn vể ASP

White_Rose
23-10-2002, 02:34
Cái này là Hit Point (đếm số lần click) chứ có phải là Counter (đếm số lượt truy cập) đâu:)

aspnet
23-10-2002, 13:28
Sorry, có lẽ mình hơi nhầm một chút ...:rolleyes: Cái này lần trước mình viết lấy cả IP để đếm mỗi lần khách ghé từng site :rolleyes::rolleyes:

aspnet
23-10-2002, 19:59
HIc, sao diễn đàn này cái phần post bài sao chuối quá, hic, khó chịu thật, tự dưng nó cứ thêm mấy cái tag html vào là sao nhỉ?

newcinc
24-10-2002, 03:24
Bài viết được gửi bởi White_Rose
Cái này là Hit Point (đếm số lần click) chứ có phải là Counter (đếm số lượt truy cập) đâu:)

Bạn hiểu lầm rồi...
Đoạn code đó chỉ là cập nhật và hiển thị một counter nào đó....
Còn chuyện Hit Couter hay Đếm số người truy cập thì đều sử dụng cùng đoạn code đó được, vấn đề là đặt nó ở đâu thôi.

Hit counter thì đặt trong trang muốn đếm

Đếm người truy cập thì đặt trong global.asa

Mình đã nói rồi mà...

White_Rose
24-10-2002, 12:44
Nếu đếm số người theo mình nên sử dụng thêm một trường lưu IP thì hơn vì nhiều host không hỗ trợ global.asa.

DTB
26-10-2002, 03:11
đúng thế.
Và trong trường hợp đó đoạn code của NewCinC tuy ngắn nhưng không xài được.
Xài đoạn code của Aspnet thì có đủ cả Update lẫn Insert. Nhưng chắc phải chỉnh lại chút đỉnh để xài lâu dài, cho nhiều tình huống khác nhau.

newcinc
26-10-2002, 09:25
Trời....
DTB là ai mà kết luận hàm hồ dzậy ta?
Tớ chỉ cho bạn một cách: copy đoạn code của tớ về rồi thử chạy xem nó có chạy không?
Còn counter thì chỉ cần Select ra và Update thôi. Counter mà cho Insert thì ........ để làm số liệu giả à.......
Tớ đã làm đoạn code đó cho các site sau:
www.webvieclam.com
www.matbao.com
www.daigiatrade.com
www.tandonghiepiz.com
www.kinhdofood.com
....
sao không có trang nào không chạy ngoại trừ DTB vậy nhỉ????????

aspnet
26-10-2002, 12:21
Chắc chắn nhất thì phải có INSERT nữa, phải có trường hợp khi CSDL mới bắt đầu. chưa có dứ liệu chứ.

White_Rose
26-10-2002, 14:02
Đúng đó. Nếu mình tạo file Counter.mdb với bảng Counters rỗng không thì nó biết UPDATE cái gì? Trừ phi lúc design tự mình thêm một record vào.

Còn điều này mình muốn hỏi bạn (thú thực mình không biết và cũng chưa thủ mà chỉ đoán thôi): Liệu mở một Recordset với câu lệnh UPDATE là đúng (là tốt?)?

newcinc
27-10-2002, 09:34
Counter của bạn luôn phải Insert 1 lần đầu tiên???? --> khi design dbase thì thêm 1 record vào cũng là tương tự.

---
Theo lý thuyết (tức là theo một số sách vở về ASP), không nên dùng recordset cho các câu query action. Bạn có nghĩ tại sao họ lại khuyên vậy không?
--> Nếu bạn design query trong database luôn, ASP script chỉ đơn thuần là gọi query đó và truyền các parameters cho query đó thực hiện thì dùng recordset trong trường hợp này không được.
---------------------------------
Với update Counters ở trên, nếu dùng recordset, bạn sẽ tiết kiện được một biến Server vì recordset được dùng chung với query Select....
----> Tiết kiệm là thượng sách --> tốc độ là thượng sách.
--
--------------------------
gửi ASPNET:
trexanhit.com là của cậu phải không?
---------------
Gửi mọi người:
Các bạn nghĩ sao về việc cùng xây dựng website: www.manguon.com????
Mình đang sử dụng ASP và Access.
Dự kiến, mình sẽ dùng dbase là SQL Server cho nhanh. Ai tâm huyết muốn tham gia không? Tham gia ở đây là tham gia đúng nghĩa, không chỉ hô hào như chuyện làm software gì đó hồi lâu trên này nhé....
Project manguon.com đang làm. Bạn sẽ tiếp tục xây dựng cùng chúng tôi nếu bạn thích và có khả năng

haji
27-10-2002, 15:01
cái counter của newcinc sử dụng được đó chứ ,
ở đây chỉ cần dùng mẹo update ..field=field+1
field đó format la number mặc định sẽ là 0 (trong access) khi có người vào trang đó sẽ +1 .
cái này có thể count cho trang web hay từng topic và catagory , còn nếu muốn mỗi lượt truy cập chỉ count 1 lần thỉ thêm khoảng 2 ,3 dòng if session =... là xong
ví dụ trang này :
http://www27.brinkster.com/K6T2/v2/thuvien/default.asp

Nhưng mà hình như trong asp , code ngắn gọn có đồng nghĩa với việc chạy nhanh không ? tui có 2 forum , 1 là của Snitz , 1 là tự viết . cái snitz bự như vậy mà chạy nhanh hơn cái của tui đó

newcinc
27-10-2002, 20:33
không phải code ngắn gọn sẽ chạy nhanh hơn... điều này chỉ đúng một phần nhỏ...
Phần lớn là: tiết kiệm tài nguyên máy chủ thì chạy sẽ nhanh hơn.
Snitz Forum code rất nhiều, nhưng vẫn chạy chậm vì dùng rất nhiều recordset...
Bạn có thể tiết kiệm lại. Với forum Snitz, bạn chỉ cần khai báo 3 Recordset là đủ....
--> Chắc chắn tốc độ sẽ cải thiện rõ rệt

White_Rose
27-10-2002, 20:54
thế với table rỗng thì update thế nào????
Thường thường mình chỉ dùng mỗt một recordset. Chưa khi nào phải dùng đến cái thứ 2 cả. dùng xong thì close đi là hơn. Nếu cần sử dụng lại thì cho nó vào một mảng. truy xuất dữ liệu qua recordset chậm lắm.
Với lại tốc độ xử lý trên server và tốc độ đường truyền, cái nào lâu hơn???

DTB
28-10-2002, 01:14
To NewCinC:
DTB là tên tôi: Dương Thái Bình.
Tôi không nói là nó "không chạy được".
Tôi chỉ nói là "không xài được".
đơn giản là vì nó....dở.
Sorry! Cái nào tốt thì nói tốt, cái nào chưa tốt thì nói chưa tốt. Tôi không thể làm khác được. Vì lợi ích chung của mọi người ở đây. Xin thông cảm.

--------- trích -------
Cái mình muốn đề cập là các bạn thường không để ý câu Query: ....set cval=cval+1 vì nghĩ nó không chạy.........
-----------------------của NewCinC------------

Tại bạn tưởng thế thôi. Ai mà không biết cái đó.
Trong đoạn code của Aspnet không xài như vậy là vì trước hết Aspnet đã mở ra để kiểm tra xem nó có sẵn con số counter hay chưa, nếu có thì nhân tiện đọc luôn con số đó rồi gán vào 1 biến. Việc Aspnet tăng nó lên trước rồi mới Update đâu phải vì Aspnet dốt. Chỉ đơn giản là tăng trước rồi khi nào cần thì xài hay là khi nào xài mới tăng mà thôi. Nếu "khi nào xài mới tăng" thì nếu xài biến đó nhiều lần thì phải thực hiện phép cộng nhiều lần. Nếu cộng trước thì chổ nào cần hiển thị thì chỉ ghi <%=count()%>. Nhưng chuyện đó không quan trọng. Không thể vì thế mà kết luận nó "hơi bị dài". Chữ "hơi bị" là của miền Bắc. Nó có nghĩa là "quá xá, quá sức không nói nổi".

Thế mà, đoạn code của Aspnet dài là do các dòng chú thích cẩn thận, tỉ mỉ.
đoạn code của NewCinC ngắn hơn là vì nó đảm nhận nhiệm vụ ít hơn.

Giả sử ta cần đếm số lần "hít" cho các topic của 1 forum. Như vậy khi có 1 topic mới thì đoạn code của NewCinC để thêm vào 1 record cho topic đó nằm ở đâu? (Xin đừng nói là "thêm vào lúc design database" nhé!). Nếu đem nối vào đoạn code ở trên thì nó có ngắn hơn của Aspnet không?

Nếu bạn nói là table của mình chỉ có duy nhất 1 record thì lỗi này càng nghiêm trọng hơn đó.
Nếu có 2000 topic thì phải có 2000 table, mỗi table chỉ có 1 record?

Chắc chắn là không phải thế. Xin nhắc thêm: cả Aspnet lẫn NewCinC trong câu lệnh Update của mình đều không có mệnh đề WHERE. Như thế thì tất cả các record đều bị update. Của Aspnet thì tất cả đều có cùng 1 giá trị. Của NewCinC thì tất cả đều được tăng lên 1. Ai làm số liệu giả nhỉ? Kiểm tra lại các site của bạn đi nha.

Nếu bạn vẫn cương quyết bảo rằng table của mình chỉ có 1 record thì hãy tham khảo:
http://www15.brinkster.com/thaibinhduong
để xem 1 chương trình Free Counter nó chạy như thế nào và trong mục diễn đàn ở đó cũng có nói về cách dùng FileSystemObject để ghi số counter vào file.txt.

Bởi vì nếu 1 table chỉ có mỗi một record thì nó cũng chiếm vài chục Kbyte trên dĩa. Còn file.txt chỉ chiếm vài byte. Ngoài ra, việc mở database chậm hơn rất rất rất nhiều lần so với đọc 1 file.txt.

"Tiết kiệm là thượng sách, tốc đọ là thượng sách". Câu này là của NewCinC

Còn nữa. Trong đoạn code của NewCinC dùng recordset bằng:
rs.Open StrSQL, cnDrv
thì lúc đó server sẽ tự động mở 1 Connection Object hoạt động ở sau lưng (background) cho RecordSet Object đó. Nghĩa là lúc đó tồn tại cả Connection Object lẫn RecordSet Object. Chỉ có điều bạn không đièu khiển được Connection Object đó.

Thực hiện query bằng chính Connection Object như đọan code của Aspnet mới là tiết kiệm tài nguyên cho máy chủ. Bởi vì không phải mở thêm đối tượng là RecordSet Object.

Sau tất cả những điều trên, theo bạn "Ai là người kết luận hàm hồ?"

------
P/S:
Tôi luôn đọc kỹ bài viết của các bạn và luôn luôn viết cẩn thận. Bạn có thể kiểm tra các bài viết của tôi trên forum này.
Nếu có dịp ta sẽ bàn về việc sử dụng 3 object là Connection Object, Command Object và RecordSet Object kỹ hơn.


Thân mến.

newcinc
28-10-2002, 08:41
Giả sử ta cần đếm số lần "hít" cho các topic của 1 forum. Như vậy khi có 1 topic mới thì đoạn code của NewCinC để thêm vào 1 record cho topic đó nằm ở đâu? (Xin đừng nói là "thêm vào lúc design database" nhé!). Nếu đem nối vào đoạn code ở trên thì nó có ngắn hơn của Aspnet không?
Nếu thế thì liệu có cần sử dụng query Insert Counter không? --> Query Insert counter là dư rồi. Tóm lại, việc dùng query Insert Counter trong hai trường hợp đều không cần thiết. Đúng không bạn?


Nếu bạn nói là table của mình chỉ có duy nhất 1 record thì lỗi này càng nghiêm trọng hơn đó.
Nếu có 2000 topic thì phải có 2000 table, mỗi table chỉ có 1 record?[/quote}
Nếu bạn để ý kỹ, cả trường hợp của mình và ASPNET đều là code ví dụ, và chỉ áp dụng cho 1 bảng, 1 record, 1 field. Các trường hợp còn lại thì phải mở rộng ra chứ...

[quote]Việc Aspnet tăng nó lên trước rồi mới Update đâu phải vì Aspnet dốt.
Cái này bạn nói, tớ đưa ra ý kiến cùng với bài của ASPNET, nhưng tớ không hề có ý gì như thế... Chỉ đơn giản là muốn góp ý với mọi ngươì về ASP thôi.

Chắc chắn là không phải thế. Xin nhắc thêm: cả Aspnet lẫn NewCinC trong câu lệnh Update của mình đều không có mệnh đề WHERE. Như thế thì tất cả các record đều bị update. Của Aspnet thì tất cả đều có cùng 1 giá trị. Của NewCinC thì tất cả đều được tăng lên 1. Ai làm số liệu giả nhỉ? Kiểm tra lại các site của bạn đi nha.
Bạn đọc lại điều kiện về table và field của tớ và aspnet. Trong trường hợp ví dụ thì có cần không?

Việc coi lại các website của tớ và aspnet, có lẽ bạn nên xem lại. Tất cả hit, counter .. đều chạy đúng. Với riêng tớ, tớ chỉ thích viết 1 ứng dụng web hoàn chỉnh, không dùng đồ free. Bạn có thể tham khảo website của tớ tại các địa chỉ sau:
www.matbao.com
www.webvieclam.com
go.to/jslib
ngoài ra còn một số site cho công ty khác mà tớ viết. Ban có cần địa chỉ không?
Tớ nghĩ (và mọi người nghĩ) các website của tớ không có vấn đề gì... BẠn nên xem lại câu nói của bạn.


Còn nữa. Trong đoạn code của NewCinC dùng recordset bằng:
rs.Open StrSQL, cnDrv
thì lúc đó server sẽ tự động mở 1 Connection Object hoạt động ở sau lưng (background) cho RecordSet Object đó. Nghĩa là lúc đó tồn tại cả Connection Object lẫn RecordSet Object. Chỉ có điều bạn không đièu khiển được Connection Object đó.

Thực hiện query bằng chính Connection Object như đọan code của Aspnet mới là tiết kiệm tài nguyên cho máy chủ. Bởi vì không phải mở thêm đối tượng là RecordSet Object.
Bạn không phân biệt được connection object và connections String rồi...


Sau tất cả những điều trên, theo bạn "Ai là người kết luận hàm hồ?"

------
P/S:
Tôi luôn đọc kỹ bài viết của các bạn và luôn luôn viết cẩn thận. Bạn có thể kiểm tra các bài viết của tôi trên forum này.
Nếu có dịp ta sẽ bàn về việc sử dụng 3 object là Connection Object, Command Object và RecordSet Object kỹ hơn.
Việc trả lời tớ để dành cho bạn nhé.
Dĩ nhiên, nếu có dịp, hãy rủ mọi người bàn về nó. Và hãy xem đề nghị của tớ về việc xây dựng www.manguon.com. TỚ nghĩ đây là cơ hội để mọi người hiểu nhau hơn.

White_Rose
28-10-2002, 18:53
- Query Insert chỉ sử dụng khi mà table vẫn còn empty thôi mà. Nếu đã có rồi thì thôi. Vẫn cần thiết đấy chứ! Đoạn code của bạn chạy đúng có lẽ vì khi design database bạn đã vô tình thêm sẵn một record với giá trị counter là 0 rồi nên câu lệnh Update mới hoạt động mà không cần phải kiểm tra thêm.

rs.Open StrSQL, cnDrv
Mình nghĩ câu lệnh đấy vẫn phải có một connection đến CSDL (nếu mình nhớ đúng thì trong cuốn lập trình ASP với CSDL bìa màu xanh xanh có ghi rõ như vậy). Tuy nhiên kết nối đó là ẩn đi với bạn mà thôi. Hơn nữa vì bạn dùng counter trong 1 ứng dụng hàon chỉnh nên chắc rằng không chỉ có cái counter đó truy xuất đến CSDL. Như vậy nếu tạo ra connection object thì tốt hơn nhiều vì tất cả hành động trên CSDL có thể sử dụng lại connection object này :) Mà cho dù chỉ có counter không thì cũng chưa hẳn đã là không tốt vì trong IIS 5.0 trở lên có sử dụng kĩ thuật poll. Khi bạn CreateObject và Set Nothing một connection object thì chưa hẳn là nó đã nothing hẳn. Nó vẫn tồn tại trong một khoảng thời gian, nếu có truy xuất nào đó dùng đến thì nó có thể được sử dụng lại ngay. Đây là một kĩ thuật được chính MS khuyên programmer nên sử dụng để tăng tốc đối đa các script.

À, bạn nào rành về hai object Stream và Command của ADODB có thể nêu qua các property, method và ý nghĩa vắn tắt của chúng không? Mình tự học mà lúc viết lại chưa cần sử dụng đến nên không rõ lắm. Trong quyển e-book ASP 3.0 tiếng Anh thì không thấy nói đến. Cám ơn các bạn trước nha.

DTB
29-10-2002, 00:18
Nếu thế thì liệu có cần sử dụng query Insert Counter không? --> Query Insert counter là dư rồi. Tóm lại, việc dùng query Insert Counter trong hai trường hợp đều không cần thiết. Đúng không bạn?


Bởi vì đoạn code của Aspnet là cái "Counter" còn đoạn code của bạn là tăng thêm 1 cho 1 field nào đó.
Counter sẽ được gọi từ đoạn chương trình khác để thực hiện việc đếm. Còn đoạn code của bạn phải copy rồi paste vào.
Aspnet muốn tạo ra 1 công cụ đếm. Vì thế Insert là cần có. Bởi vì có thể công cụ này được gọi để đếm số lần "hit" 1 trang web hoặc số lần download 1 file nào đó (tức là khi trang web đó hoặc file đó được ghi xuống dĩa thì không có table nào theo dõi việc tồn tại của nó).
Còn đoạn code của bạn thì việc insert được thực hiện ở 1 đoạn code khác, nằm phía trên đoạn đó, chẳng hạn như khi tạo mới 1 topic của 1 forum.


DTB:Nếu có 2000 topic thì phải có 2000 table, mỗi table chỉ có 1 record?
NewCinC: Nếu bạn để ý kỹ, cả trường hợp của mình và ASPNET đều là code ví dụ, và chỉ áp dụng cho 1 bảng, 1 record, 1 field. Các trường hợp còn lại thì phải mở rộng ra chứ...


Chung nội dung câu trước. Nghĩa là bạn cũng phải công nhận là: để cho công cụ linh hoạt hơn, dùng được cho nhiều việc hơn thì việc Insert là phải có. Có thể bạn quan tâm lệnh Insert nằm ở đâu là tốt nhất.
Hãy đặt vấn đề ngược lại: lệnh Insert trong đoạn code của Aspnet không thực hiện khi record đó đã có. Aspnet không hề quy định rằng record phải được Insert bằng đoạn Counter này, nhưng nếu cần thì bản thân Counter cũng có thể thực hiện Insert. Chính nhờ thêm đoạn đó mà counter của Aspnet trở nên linh hoạt hơn, hữu ích hơn. Vì vậy tôi đánh giá nó hay hơn đoạn code của bạn.
Về mệnh đề WHERE, tôi nghĩ là ai cũng biết, nên ngay từ đầu tôi không nói gì về chuyện đó. Chỉ nhân tiện khi nói về chuyện "mỗi table 1 record" thôi.


Việc coi lại các website của tớ và aspnet, có lẽ bạn nên xem lại. Tất cả hit, counter .. đều chạy đúng. Với riêng tớ, tớ chỉ thích viết 1 ứng dụng web hoàn chỉnh, không dùng đồ free. Bạn có thể tham khảo website của tớ tại các địa chỉ sau:
www.matbao.com <http://www.matbao.com>
www.webvieclam.com <http://www.webvieclam.com>
go.to/jslib
ngoài ra còn một số site cho công ty khác mà tớ viết. Ban có cần địa chỉ không?
Tớ nghĩ (và mọi người nghĩ) các website của tớ không có vấn đề gì... BẠn nên xem lại câu nói của bạn.


Tôi đề nghị tham khảo trang web của tôi để bạn thấy đoạn code của Aspnet là 1 cái "Counter" (không phải là đoạn code tính toán update cho 1 field). Tôi đâu bảo bạn xài Free-counter đâu.
Các site của bạn có vấn đề gì hay không sao tôi biết được, nó chạy đúng hay không chỉ mình bạn biết.
Câu nói của tôi đã được xem xét kỹ. đó là vì bạn nói thiếu lịch sự với tôi trước.


Bạn không phân biệt được connection object và connections String rồi...


Và lần này lại tiếp tục thế...Nhưng thôi, tôi bỏ qua.
Khi White Rose hỏi:
Liệu mở một Recordset với câu lệnh UPDATE là đúng (là tốt?)?
NewCinC trả lời:


Theo lý thuyết (tức là theo một số sách vở về ASP), không nên dùng recordset cho các câu query action. Bạn có nghĩ tại sao họ lại khuyên vậy không?
--> Nếu bạn design query trong database luôn, ASP script chỉ đơn thuần là gọi query đó và truyền các parameters cho query đó thực hiện thì dùng recordset trong trường hợp này không được.
---------------------------------
Với update Counters ở trên, nếu dùng recordset, bạn sẽ tiết kiện được một biến Server vì recordset được dùng chung với query Select....
----> Tiết kiệm là thượng sách --> tốc độ là thượng sách.


Và đây là đoạn trích trong quyển ASP 2.0 của 8 tác giả, do Worx Press (ở Anh) xuất bản nam 1998, trang 227:
So far, to query or update a data source, we've used the Connection Object to execute commands which run a stored procedure or an SQL query. Instead, however, we can use the Command Object directly ...
In this case a Connection Object is still established, but no intermediate connection variable is maintained ...
For a single access to our data source, where we don't need to maintain a connection for several operations, it's possible to creat a recordset directly, without going through the Connection or Command Objects. The Connection is still created in the background automatically, just as it was when we used the Command Object without specifically creating a Connection Object frist...


Và hãy xem đề nghị của tớ về việc xây dựng www.manguon.com. <http://www.manguon.com.> TỚ nghĩ đây là cơ hội để mọi người hiểu nhau hơn.

Tất nhiên là ủng hộ thôi. Thế nhưng công việc thế nào? Tổ chức ra sao, mục đích là làm cái gì ở đó ...NewCinC hãy nói luôn ra thử xem, để mọi người xem có đủ khả năng, điều kiện tham gia hay không.

--------------
To White Rose:
Stream là trong FileSystemObject phải không?
Nếu đúng thì hãy mở topic mới đi.
Còn Connection Object, Command Object và Recorset Object thì nên mở chung 1 topic, vì chúng liên quan mật thiết với nhau.

newcinc
29-10-2002, 00:41
To DTB: Hiện tại mình đã đọc và có cả ba cuốn về ASP mà bạn nói nè (ASP 2.0, ASP 3.0, Dbase w ASP)... có lẽ không cần dẫn chứng cho mình làm gì. Đúng hay sai, nhanh hay chậm sẽ chứng minh qua thực tế...
Bởi vậy stop vấn đề Counter ở đây. Bởi vì tớ biết có nói nữa thì ai cũng cho là mình giỏi mà thôi... Vấn đề sẽ là: thực tế chứng minh tất cả...
Bạn nào tâm huyết với www.manguon.com liên hệ với newCinC tại địa chỉ:
Lê Hải Bình
Lầu 3, 484 Lạc Long Quân Q11
Tel: 9743670 - 8901011
Fax: 9743670
Cell: 0908242800

Hiện tại, mình đang có 2 thành viên tham gia build manguon.com. Có thêm bao nhiêu bạn dám thử sức thì mình chưa biết. Và mình không muốn hô hào suông. Bạn nào thực lòng muốn hợp tác thì đến Công ty. Khỏi cần post bài lên hô hào như các phong trào trước (ở netcenter và ở đây cũng vậy... chẳng mang lại gì...)

aspnet
29-10-2002, 01:02
Đây là diễn đàn thảo luận mà, mong mọi người đừng quá găng nha ;););) Lú đầu mình cũng có để thêm cả mệnh đề WHERE Count > 0 trước khi hiển thị counter nhưng lại nghĩ không cần thiết nên đã bỏ nó đi...
Mình cũng ủng hộ xây dựng www.manguon.com nếu đóng góp được gì sẽ đóng góp ;)

aspnet
29-10-2002, 01:06
Nói chung mọi chủ đề đều phải bàn luận như vầy thì mới sôi nổi chứ đúng không các bạn ;);)

White_Rose
29-10-2002, 02:30
:) tranh luận thôi mà. hơi găng một chút cũng chẳng sao hết cả hi hi

To DTB: mình có đoạn mã thế này (ở trong MultiUploads tìm được)


'Create a Stream instance
Dim AF_strm1, AF_strm2
Set AF_strm1 = Server.CreateObject("ADODB.Stream")
Set AF_strm2 = Server.CreateObject("ADODB.Stream")

'Open the stream
AF_strm1.Open
AF_strm1.Type = 1 'Binary
AF_strm2.Open
AF_strm2.Type = 1 'Binary
AF_strm1.Write RequestBin
AF_strm1.Position = AF_ValueBeg

Nó là của ADODB chứ không phải của FSO. Mà mình cũng không tìm được tài liệu nói về nó nữa, hic.

DTB
30-10-2002, 01:58
Thế thì tôi không biết vì tôi đang xài ADO 1.5, nó không có object Stream này.
Bạn hãy thử tìm trong phần help của ODBC trong dĩa window xem sao.

pioneer
10-01-2003, 14:40
Minh muốn tạo counter chi cho trang HTML , thì phải lam sao?