[ASP/VbScript/MSSQL] Resultaat van een ADODB.Command tonen

Pagina: 1
Acties:

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 05-05 12:57

Pelle

🚴‍♂️

Topicstarter
Zelfs whoami (O+) kon me niet helpen met dit probleem, dus ik hoop dat er iemand anders een helder idee heeft ;)

Ik heb een SP geschreven, en die komt ongeveer hier op neer:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE PROCEDURE [dbo].[testsp] (
    @naam   VARCHAR(32),
    @adres  VARCHAR(32)
)
AS

INSERT INTO testtabel (naam,  adres)
VALUES                (@naam, @adres)

SELECT @@IDENTITY AS 'insertid'

GO


testtabel heeft een veldje 'id' dat autonummert, en ik wil dus met deze SP een record inserten, en vervolgens de id returnen zodat ik deze weer kan gebruiken in m'n ASP/VBScript code.
Als ik deze SP draai in de Query-Analyzer, dan krijg ik heel netjes als resultaat een veldje 'insertid' met daarin de id van het record dat ik zojuist heb geinsert.
Echterrrrr, als ik dit in ASP probeer, dan gaat het fout.

Mijn code ziet er zo uit:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
set InsertRecord                = Server.CreateObject("ADODB.Command")

InsertRecord.ActiveConnection   = "bla bla connection string"
InsertRecord.CommandText        = "[dbo].[testsp]"
InsertRecord.CommandType        = 4
InsertRecord.CommandTimeout     = 0
InsertRecord.Prepared           = true
InsertRecord.Parameters.Append  InsertRecord.CreateParameter("@RETURN_VALUE",   3,   4)
InsertRecord.Parameters.Append  InsertRecord.CreateParameter("@naam",           200, 1, 32, "Sjaak de Bever")
InsertRecord.Parameters.Append  InsertRecord.CreateParameter("@adres",          200, 1, 32, "Knelstraat 169")

set result_recordset = InsertRecord.Execute

response.write result_recordset.fields.item("insertid").value


Daar krijg ik alleen een dikke foutmelding op:
Item cannot be found in the collection corresponding to the requested name or ordinal.
En dat is heel raar, want als ik op exact een soortgelijke manier een SP aanroep met daarin gewoon een SELECT veld FROM tabel, dan gaat het wel goed.

Na een paar uur prutsen en googlen kwam ik geen steek verder, en toen raadde whoami me aan om met een output parameter te werken. Ook dat heb ik geprobeerd:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE PROCEDURE [dbo].[testsp] (
    @insertid   INT OUTPUT,
    @naam       VARCHAR(32),
    @adres      VARCHAR(32)
)
AS

INSERT INTO testtabel (naam,  adres)
VALUES                (@naam, @adres)

SELECT @insertid = SCOPE_IDENTITY() FROM testtabel

GO


..met de volgende code:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set InsertRecord                = Server.CreateObject("ADODB.Command")

InsertRecord.ActiveConnection   = "bla bla connection string"
InsertRecord.CommandText        = "[dbo].[testsp]"
InsertRecord.CommandType        = 4
InsertRecord.CommandTimeout     = 0
InsertRecord.Prepared           = true
InsertRecord.Parameters.Append  InsertRecord.CreateParameter("@RETURN_VALUE",   3,   4)
InsertRecord.Parameters.Append  InsertRecord.CreateParameter("@insertid",       3,   2)
InsertRecord.Parameters.Append  InsertRecord.CreateParameter("@naam",           200, 1, 32, "Sjaak de Bever")
InsertRecord.Parameters.Append  InsertRecord.CreateParameter("@adres",          200, 1, 32, "Knelstraat 169")

set result_recordset = InsertRecord.Execute

response.write InsertRecord.Parameters("@insertid").value


Maar helaas pindakaas, er verschijnt niets op mijn scherm (ook geen foutmelding overigens).
Wie o wie heeft er een idee hoe ik dit voor elkaar ga krijgen?

  • whoami
  • Registratie: December 2000
  • Nu online
Ik zou die eerste parameter (@return_value) weglaten.
(code regel nr 8 zou ik verwijderen).

https://fgheysels.github.io/


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
een tijd geleden dat ik met sp's gewerkt heb, maar:
- er staat me iets van bij dat output parameters altijd als laatste moeten worden genoemt...
- verder moet je bij je createParameter aangeven dat het om een output parameter (adovbs.inc adParamOutput) gaat, bij jou zie ik dat niet staan (of ik lees verkeerd :))

ffies een voorbeeldje:

ASP:
1
2
3
4
5
6
7
8
9
10
        With objCom
            .activeConnection   = objCon
            .commandType        = adCmdStoredProc
            .CommandText        = "foobar" 
            .Parameters.Append .CreateParameter("@foo", adVarChar, adParamInput, 15, strFoo)
            .Parameters.Append .CreateParameter("@bar", adGUID, adParamOutput, 38)
        End With
        objCommand.Execute
    
        strFooBar = objCommand("@bar")

[ Voor 39% gewijzigd door faabman op 23-06-2005 17:08 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • whoami
  • Registratie: December 2000
  • Nu online
faabman schreef op donderdag 23 juni 2005 @ 17:05:

- er staat me iets van bij dat output parameters altijd als laatste moeten worden genoemt...
Is dat zo ?
Ik heb de gewoonte van m'n output parameters altijd als laatste op te geven, maar ik ben/was er niet van bewust dat dit zo moest zijn ?
- verder moet je bij je createParameter aangeven dat het om een output parameter (adovbs.inc adParamOutput) gaat, bij jou zie ik dat niet staan (of ik lees verkeerd :))
Dat moet je idd wel doen.
En dat had ik jou gezegd Pelle :P

[ Voor 28% gewijzigd door whoami op 23-06-2005 17:08 ]

https://fgheysels.github.io/


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
whoami schreef op donderdag 23 juni 2005 @ 17:06:
Is dat zo ?
Ik heb de gewoonte van m'n output parameters altijd als laatste op te geven, maar ik ben/was er niet van bewust dat dit zo moest zijn ?
Zoals ik al zei, ik weet dat niet zeker 8)7

@Pelle:
Volgens mij staat in dit voorbeeld je oplossing: http://www.asp101.com/articles/wrox/asp30/26100903.asp
(zie, zelfs voor een returnvalue moet je een aparte adovbs constant meegeven...)

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 05-05 12:57

Pelle

🚴‍♂️

Topicstarter
faabman schreef op donderdag 23 juni 2005 @ 17:05:
- verder moet je bij je createParameter aangeven dat het om een output parameter (adovbs.inc adParamOutput) gaat, bij jou zie ik dat niet staan (of ik lees verkeerd :))
Je leest verkeerd idd ;)
Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)
En dat is precies wat ik doe:

code:
1
InsertRecord.Parameters.Append  InsertRecord.CreateParameter("@insertid", 3, 2)


Laatste parameter = 2 = output
1 = input
4 = return value

Ik gebruik integers dus, maar dat maakt geen verschil verder :)

[ Voor 17% gewijzigd door Pelle op 23-06-2005 17:48 ]


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Oké, dan hebben je bij de eerste oplossing misschien te maken met een dubbele recordset, kijk maar eens naar NOCOUNT http://www.drdev.net/article08.htm

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • Dricus
  • Registratie: Februari 2002
  • Laatst online: 15:26

Dricus

ils sont fous, ces tweakers

De manier van parameters toevoegen lijkt me niet correct. Onderstaande code lijkt me beter (zo doe ik het althans in mijn VB apps):
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
set InsertRecord                = Server.CreateObject("ADODB.Command")

InsertRecord.ActiveConnection   = "bla bla connection string"
InsertRecord.CommandText        = "[dbo].[testsp]"
InsertRecord.CommandType        = 4
InsertRecord.CommandTimeout     = 0
InsertRecord.Prepared           = true

' Haal de beschikbare parameters op en zet ze in de Parameters collection
InsertRecord.Parameters.Refresh

' Vul de parameters met een waarde
InsertRecord.Parameters("@naam").Value  = "Sjaak de Bever"
InsertRecord.Parameters("@adres").Value = "Knelstraat 169"

set result_recordset = InsertRecord.Execute

response.write result_recordset.fields.item("insertid").value

De parameter @RETURN_VALUE kun je volgens mij zowieso niet wijzigen, alleen lezen nadat de SP uitgevoerd is.

[ Voor 19% gewijzigd door Dricus op 23-06-2005 19:49 ]

Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 05-05 12:57

Pelle

🚴‍♂️

Topicstarter
Er is niks mis met de manier van parameters toevoegen.

Ik heb http://www.asp101.com/articles/wrox/asp30/26100903.asp doorgenomen, en alles geprobeerd met die output parameters en return_value, maar niks werkt :(

Het gekke is, het werkt allemaal wel in de query analyzer, maar niet in mijn code. En dan doe ik het exact zo als op bovenstaand linkje wordt uitgelegd.

Grmbl :(

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 12:34

mulder

ik spuug op het trottoir

Moet je niet de index ipv de veldnaam gebruiken? (in dit geval)
dus: rst.Fields(0).Value

[ Voor 32% gewijzigd door mulder op 24-06-2005 14:39 ]

oogjes open, snaveltjes dicht


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 05-05 12:57

Pelle

🚴‍♂️

Topicstarter
Ook al geprobeerd op aanraden van whoami, maar werkt ook niet.

Als ik de INSERT weghaal uit m'n SP, dan werkt het wel. Maar zodra er dus een INSERT in staat, kan ik met ASP niks meer uitlezen. Geen recordset, geen outputparameters, geen returnvalues.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 12:34

mulder

ik spuug op het trottoir

En de recordset-count van je recordset?

duh ik heb niet goed gelezen dus

[ Voor 37% gewijzigd door mulder op 24-06-2005 14:56 ]

oogjes open, snaveltjes dicht


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
zet eens SET NOCOUNT ON in je stored proc

onder AS

en onder END

SET NOCOUNT OFF

zie ook : http://www.kamath.com/tutorials/tut007_identity.asp

en lees dan ook ff het stukkie over @@IDENTITY

[ Voor 66% gewijzigd door 4of9 op 24-06-2005 15:15 ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Wat 4of9 zegt, NO COUNT ON aanzetten -of:

code:
1
2
3
set result_recordset = InsertRecord.Execute
resul_recordset.NextRecordset
response.write result_recordset.fields.item("insertid").value

je moet de.NextRecordSet methode aanroepen. Als jij eerst een insert doet, wordt de telling van die insert ( 1 rows(s) afftected) als het ware toegevoegd aan de eerste output naar je recordset object.

Heb ik ooit nog eens een artikeltje over geschreven: http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=174 (heeel lang geleden)

[ Voor 17% gewijzigd door P_de_B op 24-06-2005 17:07 ]

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1