Hej, Du får nog peta in parametrarna i recordsetet själv. Det är väl knappast aktuellt men i ADO.NET kan en DataAdapter göra det du vill. Jag gjorde så att jag satt i Stored proceduren: För att uppdatering skall fungera måste primärnyckeln vara med i ditt recordset. Det går ej att joina tabeller eller använda funktioner (t ex isnull(kolumn, ersättningsvärde)). ADO kan inte tolka till vilken kolumn och tabell din variabel hör. Om jag läser ditt inlägg och tolkar det rätt så vill du ha värden som är kopplat till ett ID och då räcker det så här: >Jag kan inte se varför du vill göra det. OK, du vill ha ett <br> Jag har säkert missuppfattat allt nu, men kan du inte bara göra såhär? Det enklaste sättet (som jag tycker) är att ha 2 procedurer i en och samma procedur. Nu vet jag inte vad du skall returnera men säg att det är en insert-procedur och du skulle sedan vilja veta hur många poster som finns efter att du gjort en insert:Stored procedure: Möjligt att få ouput parameters till en RS
Är det möjligt att få parametrar som är definierade som OUTPUT till en recordset typ:
<code>
With cmd
.CommandText = "test_proc"
.CommandType = adCmdStoredProc
.ActiveConnection = "Provider=SQLOLEDB;Data Source=SQWEBDEV;Initial Catalog=TOLTEST" & _
";User ID=sa;Password=sa"
Set param1 = .CreateParameter("KEYID", adVarChar, adParamInput, 1, "L")
.Parameters.Append param1
Set param3 = .CreateParameter("OI_OLIOLUOKKA", adVarChar, adParamOutput, 2)
.Parameters.Append param3
Set param4 = .CreateParameter("OI_OIKEUS", adVarChar, adParamOutput, 2)
.Parameters.Append param4
'Set rs = .Execute(, adExecuteNoRecords)
Set rs = .Execute ' <--- out parametrarna hit ?
</code>
Jag vet att man får outparametrarnas värde från command objektet.
Proceduren ser typ ut såhär:
CREATE PROCEDURE test_proc
@KEYID VARCHAR,
@OI_OIKEUS VACHAR OUT,
@OI_OLIOLUOKKA VARCHAR OUT
AS
...
...Sv: Stored procedure: Möjligt att få ouput parameters till e
/TommySv: Stored procedure: Möjligt att få ouput parameters till e
SELECT outparam1=0,outparam2=0 FROM xxx för att få dom till recordsettet.
Frågar är nu hur går det att edidetar innehållet i recordset.
rs.fields(0) är nu 0 och vill ändra värdet typ rs.fields(0) = 1
Nu kommer det error: "Current recordset does not support updating. This may be a limitation of the provider, or the selected lock type."
Har testat med alla locktypes.
Koden ser tex. ut såhär:
<code>
rs.CursorLocation = adUseServer
rs.CursorType = adOpenDynamic
rs.LockType = adLockOptimistic
Set rs = cmd.Execute()
</code>Sv: Stored procedure: Möjligt att få ouput parameters till e
Jag kan inte se varför du vill göra det. OK, du vill ha ett recordset för att transportera värdena. Om du alltid bara hämtar en rad kan du lika väl skapa en klass eller egendefinierad datatyp som du petar in värdena i?
Sedan får du skapa en funktion som sparar värdena med hjälp av en lagrad procedur eller bygger sql-satsen och kör kommandot som krävs för att uppdatera. Detta går ju bra även om du använder ett frikopplat recordset, det är bara det att du inte kan använda de inbyggda Update eller UpdateBatch metoderna på recordset objektet.
/TommySv: Stored procedure: Möjligt att få ouput parameters till e
-- Store Proceduren
<code>
CREATE PROC
@ID INT
AS
SELECT fält1, fält2
FROM tblTabell
WHERE ID = @ID
GO
--ASP SIDAN
'Variabel
sID = Request("tID")
'Referens till connection objekt
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open "DSN","UID","PASSWORD"
'Referens till command objeket
Set oCmd = Server.CreateObject("ADODB.Command")
Set oCmd.ActiveConnection = oConn
oCmd.CommandText = "sproc_getValues"
oCmd.CommandType = adCmdStoredProc
'Skjut in värdet
oCmd.Parameters.Append oCmd.CreateParameter("ID", adInteger, adParamInput, 4, sID)
'Exekvera command objektet
Set oRs = oCmd.Execute
'Skriv ut värdena
Do While Not oRs.EOF
Response.Write oRs.Fields("fält1")
Response.Write oRs.Fields("fält2")
oRs.MoveNext
Loop
'Döda all referenser
Set oRs = Nothing
Set oCmd = Nothing
oConn.Close
Set oConn = Nothing
</code>
Nu använder jag inte WITH, man får sämre överskådlighet, plus att asp tolken blir känsligare för diverse sakeroting.... Men det är ju bara vad jag tycker.. ;)
När du lägger adParamOutput i din parameter kollektion så tänk på att dom alltid måste ligga överst...
EX:
<code>
oCmd.Parameters.Append oCmd.CreateParameter("sID", adInteger, adParamOutput) 'OUTPUT Alltid överst
oCmd.Parameters.Append oCmd.CreateParameter("sVärde1", adVarChar, adParamInput, 50, sträng)
oCmd.Parameters.Append oCmd.CreateParameter("sVärde2", adVarChar, adParamInput, 50, sträng)
oCmd.Execute
</code>
woohooooooo... Sv: Stored procedure: Möjligt att få ouput parameters till e
>recordset för att transportera värdena. <br>
>Om du alltid bara hämtar en rad kan du lika väl skapa en klass eller <br>
>egendefinierad datatyp som du petar in värdena i?
<br><br>
Saken e den att jag håller på att konvertera ett stort program som använder SOLID databas till att använda SQL Server.
<br>
I Solid kan en procedur se ut såhär:<br>
<code>
CREATE PROCEDURE CHKHARRA ( KEYID INTEGER )
RETURNS ( INDEX SMALLINT )
BEGIN
SET INDEX = 999;
...
...
END
</code>
<br>
Och med DAO har jag tillgång till värdet INDEX i en recordset. Med ADO+Sql server kommer OUT värdena till command objektet.
<br><br>
Problemet är det att programmet är mycket stort och innehåller >1500 stored procedurer. Jag skulle villa undvika att göra ändrigar i själva koden (ziljoner CALL:s i själva vb-koden) . Därför vill jag få OUT värdena i recorset object.
<br><br>
rs("index") <-- I would love to do that :-)
<br><br>
Därför tänkte jag att det skulle gå att för det första returnera OUT parametrarnas namn i en SELECT index=0 FROM xxx
och sen i VB-koden sätta det egentliga index värdet från command objektet i recordsetten.
<br><br>
Typ att min RS skulle funka som en vanlig collection.
<br><br>
rs("index") = cmd.parameters("index")
<br><br>
Häls,
SeabasSv: Stored procedure: Möjligt att få ouput parameters till e
SELECT 999 AS [INDEX]
/JohanSv: Stored procedure: Möjligt att få ouput parameters till e
create procedure testIns
@namn varchar(50)
as
insert into test (namn) values(@namn)
select count(*) as antal from test
-------------
Som du ser ovan så så använder du den på följande sätt Query Analyzer:
testIns 'Kalle'
För att göra anropet via ASP så ser det ut som följer:
<%
varde = "Olle"
set rst=con.execute("testIns '" & varde & "')
antal = rst(0)
response.write "Det finns " & antal & " poster i tabellen test"
%>
Hälsningar
/Pelle