Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
587 views
in Technique[技术] by (71.8m points)

asp classic - Why should I close and destroy a recordset?

I read this article: http://www.utteraccess.com/wiki/Recordsets_for_Beginners, and it says that it's important for me to close and destroy RS's like this:
rs.close Set rs = Nothing
and if I don't, some bugs may happen.

  1. What kind of bugs?
  2. What does rs.close means? Does it mean that the connection to the database is kept open for as long as the rs isn't closed?
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

What T McKeown says is absolutely right

Depending the type of ADODB.Recordset you are returning you can end up with some unnecessary overheads. The purpose of Call rs.Close() is remove these overheads that for most data retrieval purposes are not required.

Take this example, with the connection defined at the start of the page it lives for the entire life of the page.

Dim conn, conn_string, rs

conn_string = "some connection string to your database"

'Memory allocated for ADODB.Connection object
Set conn = Server.CreateObject("ADODB.Connection")
'Connection opened to data source (SQL Server, Oracle, MySQL etc)
Call conn.Open()

Set rs = conn.Execute("SELECT * FROM [sometable]")
Do While Not rs.EOF
  'Long running page (do some processing)
  Call rs.MoveNext()
Loop

'Remove any locks on the tables and dis-associate connection
Call rs.Close()
'Deallocate ADODB.Recordset from memory
Set rs = Nothing

'Connection is still open and needs to be closed
Call conn.Close()
'Connection closed but still allocated in memory
Set conn = Nothing

Over the years I found that working with arrays to display data is far more efficient and saves on the overheads of the ADODB objects.

Dim conn, conn_string, rs, cmd, data

conn_string = "some connection string to your database"

'Memory allocated for ADODB.Command object
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
  'Connection allocated when ADODB.Command is run and only
  'lasts for the life of ADODB.Command object.
  .ActiveConnection = conn_string
  .CommandType = adCmdText
  .CommandText = "SELECT * FROM [sometable]"
  'Allocate memory for ADODB.Recordset
  Set rs = .Execute()
  'Use .GetRows() to build a two dimensional array 
  'containing the ADODB.Recordset data.
  If Not rs.EOF Then data = rs.GetRows()
  Call rs.Close()
  'Deallocate memory for ADODB.Recordset
  Set rs = Nothing
End with
'Deallocate ADODB.Command which closes and de-allocates
'the associated  ADODB.Connection.
Set cmd = Nothing

'All ADODB objects have been deallocated rest of the page can run
'without them using the array to iterate through the data.
If IsArray(data) Then
  'Long running page (do some processing)
End If

For more infomation on working with data in Arrays see this answer to another question, the examples given contain examples of iterating through your data using an Array.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...