PDA

View Full Version : Thuật giải phân trang dùng DataReader



NgocHien
15-07-2003, 19:17
Ai có thể cho em 1 thuật giải phân trang dùng DataReader không ?, em ko thích dùng Dataset, hãy giúp em với.

vanlang
15-07-2003, 20:15
hic .. sử dụng đồ có sẵn lại hổng chịu ..thì cũng pó tay chấm com thôi

White_Rose
16-07-2003, 00:35
Ai có thể cho em 1 thuật giải phân trang dùng DataReader không ?, em ko thích dùng Dataset, hãy giúp em với.
Áp dụng chỉ với những table có unique index (ngon nhất là có Primary Key).
table M:
ID Primary Key
name int

Ở đầu trang, lấy ra số lượng record của table (nếu như trang này dùng lại nhiều lần thì có thể save lại trong ViewState cho đỡ phải đọc lại).


Sub Page_Load()
//... connect to database
if not ispostback then
sql = "SELECT COUNT(*) AS num FROM M"
//..ExecuteReader vào dtr
dtr.Read()
ViewState("numofM")=dtr("num")
dtr.Close()
end if
//....
End Sub

sau đấy, nếu cần đọc trang thứ n nào đó thì dùng đoạn code sau (per là số lượng record mỗi trang)


len = n * per
if (n*per)>ViewState("numofM") then
t = ViewState("numofM") mod per
Else
t = per
End If
sql = "SELECT * FROM (SELECT TOP " + t.ToString() +
" * FROM (SELECT TOP " + len.ToString() +
" * FROM M ORDER BY id) ORDER BY id DESC) ORDER BY id"
//...ExecuteReader

NgocHien
17-07-2003, 09:16
Như anh White_Rose hướng dẫn thì ta dùng 2 câu lệnh SQL rồi, trong khi đó DAtareader chỉ thực thi 1 câu lệnh SQL thôi.

White_Rose
17-07-2003, 11:52
Phần lấy count chỉ thực hiện một lần khi trang được load lần đầu tiên thôi.
command thi hành executereader bao nhiêu lần chẳng được?

sql = "SELECT * FROM t1"
cmd.CommandText = sql
dtr = cmd.executereader()
'......
dtr.close()
sql = "SELECT * FROM t2"
cmd.CommandText = sql
dtr = cmd.executereader()
'......
dtr.close()

fitfit
21-07-2003, 10:42
Thế nếu dùng ĐataReaer thì khi Bind vào DataGrid có sử dụng đươc sự kiện PageIndexChanged ko ?? Và nếu được thì Mã viết thế nào ???

White_Rose
21-07-2003, 22:43
Có thể được với điều kiện bản phải thực hiện bằng tay (thiết lập AllowCustomPaging = True).
chi tiết mã bạn xem luôn trong SDK hay MSDN, rất rõ ràng.

tieutho
10-09-2003, 20:56
Private Sub DataGrid_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEvent Args) Handles DataGrid.PageIndexChanged
Dim start As Integer
start = grdChuadau.CurrentPageIndex * DataGrid.PageSize
grdChuadau.CurrentPageIndex = e.NewPageIndex
DataGrid.DataBind()
End Sub

Tại Datagrid ban cho AllowPaging = true

tieutho
10-09-2003, 20:58
Private Sub DataGrid_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEvent Args) Handles DataGrid.PageIndexChanged

Dim start As Integer
start = Datagrid.CurrentPageIndex * DataGrid.PageSize
Datagrid.CurrentPageIndex = e.NewPageIndex
DataGrid.DataBind()
End Sub

Tại Datagrid ban cho AllowPaging = true

(tai ctrlV :-))

Cận
11-09-2003, 18:59
Cho em hỏi: ViewState("Abc") cũng giống như Application("abc") hả anh ?

snoopy
12-12-2003, 10:12
Mình làm theo như WhiteRose chỉ thì được câu sql như sau:

"SELECT * FROM (SELECT TOP 4 * FROM (SELECT TOP 4 * FROM Category ORDER BY CategoryId) ORDER BY CategoryId DESC) ORDER BY CategoryId"

Khi chạy sql server báo lỗi:

Server: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'ORDER'.

xin hỏi các bạn làm được k dậy? Chỉ giúp cho mình với...hichic

White Rose
29-12-2003, 03:55
ViewState chỉ có tác dụng trên page và được lưu lại chừng nào trang vẫn được gọi lại nhờ post-back. Nếu click vào một hyperlink thì coi như nó teo :D

To snoopy: Bạn thi hành trên table nào? Mình đang ví dụ với table là Category, Primary-Key là CategoryID

P/S: Ặc, BBG có câu giống mình thế, đúng là cùng chí hướng :D

Blackhead
31-12-2003, 02:26
- Mình có tạo một cái Button bên Flash sau đó mang nó qua C# để điều khiển ... nhưng mình không biết phải khai báo đường dẫn tương đối cho nó làm như thế nào? ... Bạn nào biết xin chỉ giúp ... cám ơn nhiều ....