code:
<%
dim conn as adodb.connection
dim cmd as adodb.command
dim prm as adodb.parameter
dim rs as adodb.recordset
dim ret as long
dim proc as string
dim alldata() as variant
dim colnames() as variant
dim i as long
dim datetime as datetime
const storedprocedure = "[dbo].[datatypetester]"
const titlestring = "ado parameter test 3 / multiple recordset tester
a example of how to retrieve multiple recordsets from ado and how to set parameters in ado for sql server stored procedures
"
redim alldata(0) initialize array dimension
datetime = now()
response.write titlestring
set conn = server.createobject("adodb.connection")
set cmd = server.createobject("adodb.command")
conn.open application("connectionstring")
with cmd
set .activeconnection = conn
.commandtext = storedprocedure
always use ado constants
.commandtype = adcmdstoredproc
check into the namedparameters property at some point
it doesnt require the order to be enforced, but it is always a good idea to enforce it anyway (for the documentation aspect of coding)
return parameter needs to be first
.parameters.append cmd.createparameter("return", adinteger, adparamreturnvalue, 4)
.parameters.append .createparameter("@mybigint", adbigint, adparaminput, 8, 996857543543543)
.parameters.append .createparameter("@myint", adinteger, adparaminput, 4, 543543)
.parameters.append .createparameter("@mysmallint", adsmallint, adparaminput, 2, 32765)
.parameters.append .createparameter("@mytinyint", adtinyint, adparaminput, 1, 254)
.parameters.append .createparameter("@mybit", adboolean, adparaminput, 4, true)
only decimal and numeric needs precision and numericscale
.parameters.append .createparameter("@mydecimal", addecimal, adparaminput, 9, 765.5432321)
with .parameters.item("@mydecimal")
.precision = 10
.numericscale = 7
end with
set prm = .createparameter("@mynumeric", adnumeric, adparaminput, 5, 432.6544)
prm.precision = 7
prm.numericscale = 4
.parameters.append prm
set prm = nothing
.parameters.append .createparameter("@mymoney", adcurrency, adparaminput, 8, 543.1234)
.parameters.append .createparameter("@mysmallmoney", adcurrency, adparaminput, 4, 543.1234)
.parameters.append .createparameter("@myfloat", addouble, adparaminput, 8, 5.4e+54)
.parameters.append .createparameter("@myreal", adsingle, adparaminput, 4, 2.43e+24)
.parameters.append .createparameter("@mydatetime", addbtimestamp, adparaminput, 8, datetime)
.parameters.append .createparameter("@mysmalldatetime", addbtimestamp, adparaminput, 4, datetime)
.parameters.append .createparameter("@mychar", adchar, adparaminput, 4, "qwe")
.parameters.append .createparameter("@myvarchar", advarchar, adparaminput, 10, "variable!")
.parameters.append .createparameter("@mytext", adlongvarchar, adparaminput, len(titlestring))
.parameters.item("@mytext").appendchunk titlestring
.parameters.append .createparameter("@mynchar", adwchar, adparaminput, 4, "wide")
.parameters.append .createparameter("@mynvarchar", advarwchar, adparaminput, 10, "")
.parameters.append .createparameter("@myntext", adlongvarwchar, adparaminput, len(titlestring))
.parameters.item("@myntext").appendchunk titlestring
note the difference in these - without the {} the string implicitly converts
the advarchar version is of course commented out
.parameters.append .createparameter("@myguid", advarchar, adparaminput, 36, "58f94a80-b839-4b35-b73c-7f4b4d336c3c")
.parameters.append .createparameter("@myguid", adguid, adparaminput, 16, "{58f94a80-b839-4b35-b73c-7f4b4d336c3c}")
set rs = .execute
get column names
redim colnames(rs.fields.count - 1)
for i = 0 to rs.fields.count - 1
colnames(i) = rs.fields.item(i).name
next
do while not (rs is nothing)
get initial recordset
if not rs.eof then
for retrieving more than about 30 or so recordsets you would probably want to use a collection
alldata(ubound(alldata)) = rs.getrows(adgetrowsrest)
end if
this will be nothing if no recordset is returned
set rs = rs.nextrecordset
resize array if needed
if not (rs is nothing) then redim preserve alldata(ubound(alldata) + 1)
loop
must release the recordset before retrieving output parameters and/or the return value
releaseobj rs, true, true
ret = cstr(.parameters.item("return").value)
end with
releaseobj cmd, false, true
releaseobj conn, true, true
show stored procedure
proc = getstoredproceduredefinition(storedprocedure)
with response
outputnamedgetrowsarray alldata, colnames
.write " "
.write "return value: " & ret & "
"
.write "
" & proc & "
"
end with
displayaspfile server.mappath("adodb.command3.asp")
response.write ""
%>