一个投票系统的源程序
类别: ASP教程
SurveyDescr.asp
<!--#include file = "include/Startup.asp"-->
<!--#include file = "utils/Survey.asp"-->
<%
// output relevant meta tags
Init( "Survey your readers" );
// output common top of page
Header( \'Survey your readers\' );
// output page content
Content ( );
// output common bottom of page
Footer( );
// ============================================
// the content of this page - every page has a function \'Content\' that
// is called above.
// ============================================
function Content ( )
{
Out ( \'<td colspan=2 width="80%" valign="top">\' );
// if the survey hasnt been submitted yet...
if ( !Request.Form.Count )
{
//...display some blah, blah
Out ( \'Finally, surveys come to CoverYourASP! I\'ve been wanting to ask you guys and gals
questions for a long time, and now I can. It\'s up to you if you want to answer of course!\' );
Out ( \'<p>Of course, the real benefit to you is that if you tell me what you like I\'ll probably
provide it. If you send in your <a href="Donate.asp">donations</a> the probability increases rather
dramatically!\' );
Out ( \'<p>Take the example survey below if you have the time and inclination. I plan to post more
in a special survey category, and start offering incentives to take them.\' );
Out ( \'<p>Afterwards, look at the code. I think you\'ll be surprised how simple it is to create
surveys with this code. This page has one function call in it, with just one parameter - the name of the
survey! All questions, answers and results are stored in the database.\' );
}
// show the survey, or process it\'s input
ProcessSurvey ( \'Who are you and what do you think?\' );
if ( !Request.Form.Count )
Out ( \'<p><a href="ShowSource.asp?page=SurveyDescr"><img src="images/source.gif" align="right"
border=0></a>Please submit the survey first before looking at the source code - this link is on the result
page too!\' );
else
Out ( \'<p><center><a href="ShowSource.asp?page=SurveyDescr"><img src="images/source.gif"
border=0></a></center>\' );
Out ( \'</td>\' );
Out ( \'<td width="20%" valign="top">\' );
// show rotating banners
ShowBanners ( 4 );
Out ( \'</td>\' );
}
%>
utils/Survey.asp
<%
// ============================================
// NOTE: all source code downloaded from CoverYourASP was written by
// James Shaw (unless stated otherwise), and is copyright (c) 2000 by
// James Shaw. You may use this source code on your web sites, but
// please don\'t publish or distribute in any way.
//
// I would appreciate an HTML comment in any code you use, i.e.
// <!-- portions (c) james@CoverYourASP.com-->
// (see Footer(), documented in SSI.asp for details on how to do this)
//
// <shameless plug>
// Please contact me to discuss any ASP contract work you may have.
// </shameless plug>
// ============================================
// ============================================
// display or process the named survey
// ============================================
function ProcessSurvey ( sName )
{
// has the survey form been submitted?
if ( Request.Form.Count )
{
// connect to the database
DBInitConnection ( );
var sSurvey = "" + Request.Form ( "Survey" );
// only update the survey when no cookie
if ( "" == Request.Cookies ( sSurvey ) )
{
// get the data from the form and update the database
// use an enumerator to get name and value
var e = new Enumerator ( Request.Form );
while ( !e.atEnd ( ) )
{
var oItem = e.item();
// increment the current number of times this answer has been chosen
oConnection.Execute ( \'UPDATE SurveyAnswers SET Hits=Hits+1 WHERE Question="\' + oItem + \'" AND
Answer="\' + Request.Form ( oItem ) + \'";\' );
e.moveNext ( );
}
// note that setting cookie here assumes we are buffering
// the Reponse.Writes - cookies must be set before any
// HTML is sent to the client
Response.Cookies ( sSurvey ) = "1";
// I\'m not setting the \'expires\' on the cookie, so it\'ll go
// away when the browser is closed. I just wanted to stop
// the survey incrementing if the page refreshed.
}
// now display all the answers to the survey
Out ( \'<p>Thanks for taking part in our "\' + sSurvey + \'" survey! The answers that everyone has
given so far are shown below:\' );
// the last question we displayed
var sLast = "";
// get all the selected answers, sorted by question and hits
DBGetRecords ( \'SELECT SurveyAnswers.Question,Answer,Hits FROM SurveyAnswers INNER JOIN
SurveyQuestions ON SurveyQuestions.Question=SurveyAnswers.Question WHERE Survey="\' + sSurvey + \'" AND
Hits>0 ORDER BY SurveyAnswers.Question,Hits DESC;\' );
var fScale;
while ( !oRecordSet.EOF )
{
// display question when it changes
var sIntQuestion = "" + oRecordSet ( 0 );
// slice off chars used for sorting
var sQuestion = sIntQuestion.slice ( 2 );
// get answer
var sIntAnswer = "" + oRecordSet ( 1 );
// slice off chars used for sorting
var sAnswer = ExpandMacros ( sIntAnswer.slice ( 2 ) );
var nReaders = oRecordSet ( 2 ) - 0;
if ( sQuestion != sLast )
{
Out ( \'<h5>\' + sQuestion + \'</h5>\' );
sLast = sQuestion;
Out ( \'<font color="red">"\' + sAnswer + \'" was the top answer (\' + nReaders + \' readers)
</font><br>\' );
fScale = 300.0 / nReaders;
}
else
{
Out ( \'"\' + sAnswer + \'" was chosen by \' + nReaders + \' readers<br>\' );
}
Out ( \'<img src="images/Dot.gif" height="8" width="\' + (nReaders * fScale) + \'"><br>\' );
oRecordSet.MoveNext ( );
}
// release the connection ASAP
DBReleaseConnection ( );
}
else
{
// some initial instructions
Out ( \'<p>There aren\'t any important instructions when answering these questions - except you
don\'t have to answer any. All are optional - if you don\'t like a question, or none of the answers are
relevant, just move onto the next one!\' );
// connect to the database
DBInitConnection ( );
// get the questions from the database
DBGetRecords ( \'SELECT Question FROM SurveyQuestions WHERE Survey="\' + sName + \'" ORDER BY
Question;\' );
if ( oRecordSet.EOF )
{
Out ( \'No questions were found for survey "\' + sName + \'"<p>\' );
return;
}
// store the questions in an array
var sIntQuestions = new Array;
var nQuestions = 0;
while ( !oRecordSet.EOF )
{
sIntQuestions [ nQuestions++ ] = "" + oRecordSet ( 0 );
oRecordSet.MoveNext ( );
}
Out ( \'<form action="\' + Request.ServerVariables ( \'SCRIPT_NAME\' ) + \'" method="post">\' );
// some hidden fields to pass data through to results page
Out ( \'<input type="hidden" name="Survey" value="\' + sName + \'">\' );
// now loop through the questions
for ( var nQuestion=0; nQuestion<nQuestions; nQuestion++ )
{
var sIntQuestion = sIntQuestions [ nQuestion ];
// slice off chars used for sorting
var sQuestion = sIntQuestion.slice ( 2 );
// get the answers from the database
DBGetRecords ( \'SELECT Answer,AnswerType FROM SurveyAnswers WHERE Question="\' + sIntQuestion + \'"
ORDER BY Answer;\' );
Out ( \'<h5>\' + sQuestion + \'</h5>\' );
while ( !oRecordSet.EOF )
{
// get the answer
var sIntAnswer = "" + oRecordSet ( 0 );
// slice off chars used for sorting
var sAnswer = ExpandMacros ( sIntAnswer.slice ( 2 ) );
var sAnswerType= "" + oRecordSet ( 1 );
switch ( sAnswerType )
{
case \'radio\':
Out ( \'<input type="radio" name="\' + sIntQuestion + \'" value="\' + sIntAnswer + \'"> \' +
sAnswer );
break;
default:
break;
}
Out ( \'<br>\' );
// get next answer
oRecordSet.MoveNext ( );
}
}
Out ( \'<p><input type="submit" value="Submit answers">\' );
Out ( \'</form>\' );
// release the connection ASAP
DBReleaseConnection ( );
}
}
// ============================================
// add links to text where *? macros are found, e.g. *d expands to
// <a href="Donate.asp">Send a donation!</a>
// NOTE: currently assumes expansions are always at end of line
// ============================================
function ExpandMacros ( sText )
{
var sMacros = new Array (
\'**\',
\'*d\'
);
var sExpansions = new Array (
\'<a href="Contact.asp" target="CYAEXternal">You need to send me feedback!</a>\',
\'<a href="Donate.asp" target="CYAEXternal">send a donation!</a>\'
);
for ( var i=0; i<sMacros.length; i++ )
{
var nPos = sText.indexOf ( sMacros [ i ] );
if ( -1 != nPos )
{
sText = sText.slice ( 0, nPos ) + sExpansions [ i ];
break;
}
}
return sText;
}
%>
utils/Database.asp
<%
// ============================================
// NOTE: all source code downloaded from CoverYourASP was written by
// James Shaw (unless stated otherwise), and is copyright (c) 2000 by
// James Shaw. You may use this source code on your web sites, but
// please don\'t publish or distribute in any way.
//
// I would appreciate an HTML comment in any code you use, i.e.
// <!-- portions (c) james@CoverYourASP.com-->
// (see Footer(), documented in SSI.asp for details on how to do this)
//
// <shameless plug>
// Please contact me to discuss any ASP contract work you may have.
// </shameless plug>
// ============================================
// globals
var oConnection;
var oRecordSet;
// enums
// Connection.State and Recordset.State property
var adStateClosed = 0; // the object is closed.
var adStateOpen = 1; // the object is open.
var adStateConnecting = 2; // the object is connecting.
var adStateExecuting = 4; // the object is executing a command.
var adStateFetching = 8; // the rows of the object are being fetched.
// Recordset.Cursor property
var adOpenUnspecified = -1; // does not specify the type of cursor.
var adOpenForwardOnly = 0; // (default) a forward-only cursor, i.e. you get only one pass thru the data!
var adOpenKeyset = 1; // can go in any direction, and as a bonus you\'ll see changes other users
make. EXPENSIVE!
var adOpenDynamic = 2; // as Keyset, but also you can see additions/deletions other users make.
EXPENSIVE!
var adOpenStatic = 3; // can go in any direction, but read-only.
// Recordset.LockType property
var adLockUnspecified = -1; // does not specify a type of lock.
var adLockReadOnly = 1; // (default) guess!
var adLockPessimistic = 2; // guaranteed to work
var adLockOptimistic = 3; // records locked only when you call Update. fingers crossed
var adLockBatchOptimistic = 4;// required for batch update mode
// ============================================
// example usage:
// DBInitConnection ( );
//
// DBGetRecords ( "SELECT * FROM Somewhere" );
//
// ...use oRecordSet
//
// DBReleaseRecords ( ); // optional step
//
// DBGetRecords ( "SELECT * FROM SomewhereElse" );
//
// ...use oRecordSet
//
// DBReleaseRecords ( ); // optional step
//
// DBReleaseConnection ( );
// ============================================
// ============================================
// initializes database variables for first use on page - leave it to the
// last possible second before calling this function
// ============================================
function DBInitConnection ( )
{
// don\'t open it again if already opened!
if ( oConnection != undefined )
return;
// you can open Recordset objects without a Connection object, but
// it\'s far less efficient if you are opening multiple Recordsets.
//
// if you don\'t create a Connection object ADO creates a new one for
// each new Recordset.Open, even if you use the same connection string.
oConnection = Server.CreateObject( \'ADODB.Connection\' );
// open the database - use MapPath to make relative path into physical path
// NOTE: keep your database path a secret - nasty people are everywhere!
// 2. change the 4.0 to 3.51 when using Access 97
oConnection.Open( \'Provider=Microsoft.Jet.\' + sDBDriver + \'; Data Source=\' + Server.MapPath (
sDBPath ) );
// create a Recordset
oRecordSet = Server.CreateObject( \'ADODB.Recordset\' );
}
// ============================================
// tidies up after DBInitConnection
// ============================================
function DBReleaseConnection ( )
{
// don\'t release the connection if not connected!
if ( oConnection == undefined )
return;
// close and delete the Recordset object
DBReleaseRecords ( );
oRecordSet = undefined;
// Don\'t call Close if the Recordset failed to Open properly, i.e. its
// State is still adStateClosed (0)
if ( oConnection.State != adStateClosed )
oConnection.Close();
oConnection = undefined;
}
// ============================================
// executes the passed in SQL statement and returns a read-only
// forward-only oRecordSet object
// ============================================
function DBGetRecords ( sSQL )
{
// if the Recordset is already open, close it
DBReleaseRecords ( );
// we could use oRecordSet = oConnection.Execute( sSQL ) here
// but then we will always get back a read-only, forward-only cursor.
// (admittedly this is the most used type, but still)
// use oRecordSet.Open and we have far more control. For details
// read the definitions of the enums at the top of this file.
// remember that this can fail if passed garbage, and hence the
// Recordset will remain closed, State == adStateClosed
oRecordSet.Open ( sSQL, oConnection, adOpenForwardOnly, adLockReadOnly );
}
// ============================================
// tidies up after DBGetRecords
// ============================================
function DBReleaseRecords ( )
{
// when you have finished with an open Recordset object, call the
// Close method to release its resources. You can call Open again.
// Don\'t call Close if the Recordset failed to Open properly, i.e. its
// State is still adStateClosed
if ( oRecordSet != undefined && oRecordSet.State != adStateClosed )
oRecordSet.Close();
}
%>
<!--#include file = "include/Startup.asp"-->
<!--#include file = "utils/Survey.asp"-->
<%
// output relevant meta tags
Init( "Survey your readers" );
// output common top of page
Header( \'Survey your readers\' );
// output page content
Content ( );
// output common bottom of page
Footer( );
// ============================================
// the content of this page - every page has a function \'Content\' that
// is called above.
// ============================================
function Content ( )
{
Out ( \'<td colspan=2 width="80%" valign="top">\' );
// if the survey hasnt been submitted yet...
if ( !Request.Form.Count )
{
//...display some blah, blah
Out ( \'Finally, surveys come to CoverYourASP! I\'ve been wanting to ask you guys and gals
questions for a long time, and now I can. It\'s up to you if you want to answer of course!\' );
Out ( \'<p>Of course, the real benefit to you is that if you tell me what you like I\'ll probably
provide it. If you send in your <a href="Donate.asp">donations</a> the probability increases rather
dramatically!\' );
Out ( \'<p>Take the example survey below if you have the time and inclination. I plan to post more
in a special survey category, and start offering incentives to take them.\' );
Out ( \'<p>Afterwards, look at the code. I think you\'ll be surprised how simple it is to create
surveys with this code. This page has one function call in it, with just one parameter - the name of the
survey! All questions, answers and results are stored in the database.\' );
}
// show the survey, or process it\'s input
ProcessSurvey ( \'Who are you and what do you think?\' );
if ( !Request.Form.Count )
Out ( \'<p><a href="ShowSource.asp?page=SurveyDescr"><img src="images/source.gif" align="right"
border=0></a>Please submit the survey first before looking at the source code - this link is on the result
page too!\' );
else
Out ( \'<p><center><a href="ShowSource.asp?page=SurveyDescr"><img src="images/source.gif"
border=0></a></center>\' );
Out ( \'</td>\' );
Out ( \'<td width="20%" valign="top">\' );
// show rotating banners
ShowBanners ( 4 );
Out ( \'</td>\' );
}
%>
utils/Survey.asp
<%
// ============================================
// NOTE: all source code downloaded from CoverYourASP was written by
// James Shaw (unless stated otherwise), and is copyright (c) 2000 by
// James Shaw. You may use this source code on your web sites, but
// please don\'t publish or distribute in any way.
//
// I would appreciate an HTML comment in any code you use, i.e.
// <!-- portions (c) james@CoverYourASP.com-->
// (see Footer(), documented in SSI.asp for details on how to do this)
//
// <shameless plug>
// Please contact me to discuss any ASP contract work you may have.
// </shameless plug>
// ============================================
// ============================================
// display or process the named survey
// ============================================
function ProcessSurvey ( sName )
{
// has the survey form been submitted?
if ( Request.Form.Count )
{
// connect to the database
DBInitConnection ( );
var sSurvey = "" + Request.Form ( "Survey" );
// only update the survey when no cookie
if ( "" == Request.Cookies ( sSurvey ) )
{
// get the data from the form and update the database
// use an enumerator to get name and value
var e = new Enumerator ( Request.Form );
while ( !e.atEnd ( ) )
{
var oItem = e.item();
// increment the current number of times this answer has been chosen
oConnection.Execute ( \'UPDATE SurveyAnswers SET Hits=Hits+1 WHERE Question="\' + oItem + \'" AND
Answer="\' + Request.Form ( oItem ) + \'";\' );
e.moveNext ( );
}
// note that setting cookie here assumes we are buffering
// the Reponse.Writes - cookies must be set before any
// HTML is sent to the client
Response.Cookies ( sSurvey ) = "1";
// I\'m not setting the \'expires\' on the cookie, so it\'ll go
// away when the browser is closed. I just wanted to stop
// the survey incrementing if the page refreshed.
}
// now display all the answers to the survey
Out ( \'<p>Thanks for taking part in our "\' + sSurvey + \'" survey! The answers that everyone has
given so far are shown below:\' );
// the last question we displayed
var sLast = "";
// get all the selected answers, sorted by question and hits
DBGetRecords ( \'SELECT SurveyAnswers.Question,Answer,Hits FROM SurveyAnswers INNER JOIN
SurveyQuestions ON SurveyQuestions.Question=SurveyAnswers.Question WHERE Survey="\' + sSurvey + \'" AND
Hits>0 ORDER BY SurveyAnswers.Question,Hits DESC;\' );
var fScale;
while ( !oRecordSet.EOF )
{
// display question when it changes
var sIntQuestion = "" + oRecordSet ( 0 );
// slice off chars used for sorting
var sQuestion = sIntQuestion.slice ( 2 );
// get answer
var sIntAnswer = "" + oRecordSet ( 1 );
// slice off chars used for sorting
var sAnswer = ExpandMacros ( sIntAnswer.slice ( 2 ) );
var nReaders = oRecordSet ( 2 ) - 0;
if ( sQuestion != sLast )
{
Out ( \'<h5>\' + sQuestion + \'</h5>\' );
sLast = sQuestion;
Out ( \'<font color="red">"\' + sAnswer + \'" was the top answer (\' + nReaders + \' readers)
</font><br>\' );
fScale = 300.0 / nReaders;
}
else
{
Out ( \'"\' + sAnswer + \'" was chosen by \' + nReaders + \' readers<br>\' );
}
Out ( \'<img src="images/Dot.gif" height="8" width="\' + (nReaders * fScale) + \'"><br>\' );
oRecordSet.MoveNext ( );
}
// release the connection ASAP
DBReleaseConnection ( );
}
else
{
// some initial instructions
Out ( \'<p>There aren\'t any important instructions when answering these questions - except you
don\'t have to answer any. All are optional - if you don\'t like a question, or none of the answers are
relevant, just move onto the next one!\' );
// connect to the database
DBInitConnection ( );
// get the questions from the database
DBGetRecords ( \'SELECT Question FROM SurveyQuestions WHERE Survey="\' + sName + \'" ORDER BY
Question;\' );
if ( oRecordSet.EOF )
{
Out ( \'No questions were found for survey "\' + sName + \'"<p>\' );
return;
}
// store the questions in an array
var sIntQuestions = new Array;
var nQuestions = 0;
while ( !oRecordSet.EOF )
{
sIntQuestions [ nQuestions++ ] = "" + oRecordSet ( 0 );
oRecordSet.MoveNext ( );
}
Out ( \'<form action="\' + Request.ServerVariables ( \'SCRIPT_NAME\' ) + \'" method="post">\' );
// some hidden fields to pass data through to results page
Out ( \'<input type="hidden" name="Survey" value="\' + sName + \'">\' );
// now loop through the questions
for ( var nQuestion=0; nQuestion<nQuestions; nQuestion++ )
{
var sIntQuestion = sIntQuestions [ nQuestion ];
// slice off chars used for sorting
var sQuestion = sIntQuestion.slice ( 2 );
// get the answers from the database
DBGetRecords ( \'SELECT Answer,AnswerType FROM SurveyAnswers WHERE Question="\' + sIntQuestion + \'"
ORDER BY Answer;\' );
Out ( \'<h5>\' + sQuestion + \'</h5>\' );
while ( !oRecordSet.EOF )
{
// get the answer
var sIntAnswer = "" + oRecordSet ( 0 );
// slice off chars used for sorting
var sAnswer = ExpandMacros ( sIntAnswer.slice ( 2 ) );
var sAnswerType= "" + oRecordSet ( 1 );
switch ( sAnswerType )
{
case \'radio\':
Out ( \'<input type="radio" name="\' + sIntQuestion + \'" value="\' + sIntAnswer + \'"> \' +
sAnswer );
break;
default:
break;
}
Out ( \'<br>\' );
// get next answer
oRecordSet.MoveNext ( );
}
}
Out ( \'<p><input type="submit" value="Submit answers">\' );
Out ( \'</form>\' );
// release the connection ASAP
DBReleaseConnection ( );
}
}
// ============================================
// add links to text where *? macros are found, e.g. *d expands to
// <a href="Donate.asp">Send a donation!</a>
// NOTE: currently assumes expansions are always at end of line
// ============================================
function ExpandMacros ( sText )
{
var sMacros = new Array (
\'**\',
\'*d\'
);
var sExpansions = new Array (
\'<a href="Contact.asp" target="CYAEXternal">You need to send me feedback!</a>\',
\'<a href="Donate.asp" target="CYAEXternal">send a donation!</a>\'
);
for ( var i=0; i<sMacros.length; i++ )
{
var nPos = sText.indexOf ( sMacros [ i ] );
if ( -1 != nPos )
{
sText = sText.slice ( 0, nPos ) + sExpansions [ i ];
break;
}
}
return sText;
}
%>
utils/Database.asp
<%
// ============================================
// NOTE: all source code downloaded from CoverYourASP was written by
// James Shaw (unless stated otherwise), and is copyright (c) 2000 by
// James Shaw. You may use this source code on your web sites, but
// please don\'t publish or distribute in any way.
//
// I would appreciate an HTML comment in any code you use, i.e.
// <!-- portions (c) james@CoverYourASP.com-->
// (see Footer(), documented in SSI.asp for details on how to do this)
//
// <shameless plug>
// Please contact me to discuss any ASP contract work you may have.
// </shameless plug>
// ============================================
// globals
var oConnection;
var oRecordSet;
// enums
// Connection.State and Recordset.State property
var adStateClosed = 0; // the object is closed.
var adStateOpen = 1; // the object is open.
var adStateConnecting = 2; // the object is connecting.
var adStateExecuting = 4; // the object is executing a command.
var adStateFetching = 8; // the rows of the object are being fetched.
// Recordset.Cursor property
var adOpenUnspecified = -1; // does not specify the type of cursor.
var adOpenForwardOnly = 0; // (default) a forward-only cursor, i.e. you get only one pass thru the data!
var adOpenKeyset = 1; // can go in any direction, and as a bonus you\'ll see changes other users
make. EXPENSIVE!
var adOpenDynamic = 2; // as Keyset, but also you can see additions/deletions other users make.
EXPENSIVE!
var adOpenStatic = 3; // can go in any direction, but read-only.
// Recordset.LockType property
var adLockUnspecified = -1; // does not specify a type of lock.
var adLockReadOnly = 1; // (default) guess!
var adLockPessimistic = 2; // guaranteed to work
var adLockOptimistic = 3; // records locked only when you call Update. fingers crossed
var adLockBatchOptimistic = 4;// required for batch update mode
// ============================================
// example usage:
// DBInitConnection ( );
//
// DBGetRecords ( "SELECT * FROM Somewhere" );
//
// ...use oRecordSet
//
// DBReleaseRecords ( ); // optional step
//
// DBGetRecords ( "SELECT * FROM SomewhereElse" );
//
// ...use oRecordSet
//
// DBReleaseRecords ( ); // optional step
//
// DBReleaseConnection ( );
// ============================================
// ============================================
// initializes database variables for first use on page - leave it to the
// last possible second before calling this function
// ============================================
function DBInitConnection ( )
{
// don\'t open it again if already opened!
if ( oConnection != undefined )
return;
// you can open Recordset objects without a Connection object, but
// it\'s far less efficient if you are opening multiple Recordsets.
//
// if you don\'t create a Connection object ADO creates a new one for
// each new Recordset.Open, even if you use the same connection string.
oConnection = Server.CreateObject( \'ADODB.Connection\' );
// open the database - use MapPath to make relative path into physical path
// NOTE: keep your database path a secret - nasty people are everywhere!
// 2. change the 4.0 to 3.51 when using Access 97
oConnection.Open( \'Provider=Microsoft.Jet.\' + sDBDriver + \'; Data Source=\' + Server.MapPath (
sDBPath ) );
// create a Recordset
oRecordSet = Server.CreateObject( \'ADODB.Recordset\' );
}
// ============================================
// tidies up after DBInitConnection
// ============================================
function DBReleaseConnection ( )
{
// don\'t release the connection if not connected!
if ( oConnection == undefined )
return;
// close and delete the Recordset object
DBReleaseRecords ( );
oRecordSet = undefined;
// Don\'t call Close if the Recordset failed to Open properly, i.e. its
// State is still adStateClosed (0)
if ( oConnection.State != adStateClosed )
oConnection.Close();
oConnection = undefined;
}
// ============================================
// executes the passed in SQL statement and returns a read-only
// forward-only oRecordSet object
// ============================================
function DBGetRecords ( sSQL )
{
// if the Recordset is already open, close it
DBReleaseRecords ( );
// we could use oRecordSet = oConnection.Execute( sSQL ) here
// but then we will always get back a read-only, forward-only cursor.
// (admittedly this is the most used type, but still)
// use oRecordSet.Open and we have far more control. For details
// read the definitions of the enums at the top of this file.
// remember that this can fail if passed garbage, and hence the
// Recordset will remain closed, State == adStateClosed
oRecordSet.Open ( sSQL, oConnection, adOpenForwardOnly, adLockReadOnly );
}
// ============================================
// tidies up after DBGetRecords
// ============================================
function DBReleaseRecords ( )
{
// when you have finished with an open Recordset object, call the
// Close method to release its resources. You can call Open again.
// Don\'t call Close if the Recordset failed to Open properly, i.e. its
// State is still adStateClosed
if ( oRecordSet != undefined && oRecordSet.State != adStateClosed )
oRecordSet.Close();
}
%>
- 上一篇: 用ASP制作个性化的调查板(附源程序)
- 下一篇: 深入研究“用ASP上载文件”(一)
-= 资 源 教 程 =-
文 章 搜 索