Toon posts:

[ASP/ADO] Parameter stored procedure -> @@identity

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik pass via ado/asp parameters door naar m'n stored procedure (sql-server 8):

set param = cmd.CreateParameter("paramnaam", type, direction, size, value)

Nu wil ik voor een bepaalde parameter de @@IDENTITY sql-server-var als 'value' meegeven. (vraag me niet waarom, lang ingewikkeld verhaal), dus zoiets:

set param = cmd.CreateParameter("paramnaam", type, direction, size, "@@IDENTITY")

ik heb van alles geprobeerd, maar krijg alle mogelijke errors (oa: Application uses a value of the wrong type for the current operation)

Iemand die me hier uit de brand kan helpen?

btw: Ik moet het op dit moment op deze manier doen, dus kom ajb niet met andere mogelijkheden

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
sql-server 8 :? Nieuw, nee dreft :+

Uhm volgens mij kan je @@identity helemaal niet meegeven maar kan je het alleen opvragen, en geeft het het identity nummer terug van de laatst ingevoegde record.

Edit: Je moet hem wel gewoon in een variable stoppen:

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'

  • palloquin
  • Registratie: Juli 2000
  • Laatst online: 29-01-2021
Hoi,

Wat je nu doet is het megeven van de string waarde @@IDENTITY, niet de eventuele waarde van SQL variable @@IDENTITY...

Het probleem is dat de waarde van deze SQL variable niet zomaar in je applicatie (in dit gaval ASP project) beschikbaar is...

Je zult bij de eerdere (insert) operatie de waarde moeten mee uitlezen..

Ik zal ff op zoeken hoe je dat ook alweer deed...

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Op donderdag 07 februari 2002 13:24 schreef KoekenBoes het volgende:
btw: Ik moet het op dit moment op deze manier doen, dus kom ajb niet met andere mogelijkheden
Je zegt het zelf al: "de sql-server-var @@identity", hoe wil je die in godsnaam doorsturen als value vanuit ASP waar die helemaal niet bekend is :?

Anders gezegd, wat wil je precies bereiken, ik snap het namelijk niet helemaal.

Today's subliminal thought is:


  • palloquin
  • Registratie: Juli 2000
  • Laatst online: 29-01-2021
Is 'ie weer...

Met deze code (gepikt van 4guysfromrolla) kun je bij een het executen van een SQL (insert) query) de @@identity terug krijgen...
Set objRS = objCon.Execute(strSQL & ";select @@identity").nextrecordset

dim myID = objRS(0)
ff wat uitleg:

Eigenlijk voor je met 1 statement 2 queries uit, deze zijn gescheiden door een puntkomma ";"

De resultset van die queries hang je aan een Recordset Object (ObjRS) en je geeft meteen een .nextRecordset om dat je de 2e recordset nodighebt die terug komt...

HTH

Verwijderd

Topicstarter
kijk, je kan een stored procedure op deze manier uitvoeren (sql commandline):

exec <storedprocnaam> 'param1', 'param2', @@IDENTITY, 'param4'

Werkt feiloos (zodra ervoor een insert is gedaan natuurlijk, anders wort bij de 3e param gewoon Null geinsert)

dan neem ik toch aan dat je via createparameter ook kan aangeven dat de waarde @@IDENTITY moet zijn :?

Ik snap wel dat asp @@identity niet kent, maar daar gaat het ook niet om, het gaat erom dat asp op deze manier een sp aanroept met bepaalde parameters en hun waardes. Het gaat er dus om dat asp tegen de sp moet zeggen: Insert bij deze parameter je laatste identity (@@identity)

btw: sql-server 7 sjorry ;)

Verwijderd

Topicstarter
Op donderdag 07 februari 2002 13:36 schreef palloquin het volgende:
..
Klopt, weet ik wel: maar zoals ik hierboven al aangaf: het moet via createparameter doorgepasst worden. Ik heb dus een werkende versie van mijn vb nodig.

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Kijk gewoon even naar het voorbeeld wat ik gepaste had, je moet gewoon de @@identity selecteren dan ben je van al het gezeik af.

  • palloquin
  • Registratie: Juli 2000
  • Laatst online: 29-01-2021
Ahah... Ik snap..

Google leverd niets op?

Verwijderd

Topicstarter
Op donderdag 07 februari 2002 13:45 schreef raptorix het volgende:
Kijk gewoon even naar het voorbeeld wat ik gepaste had, je moet gewoon de @@identity selecteren dan ben je van al het gezeik af.
btw: Ik moet het op dit moment op deze manier doen, dus kom ajb niet met andere mogelijkheden
-> ingewikkeld verhaal...

Google levert idd niks op (of ik gebruik de verkeerde zoekterment)

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Volgens mij lullen we langs elkaar heen, haal je die @@identity nou eerst op of probeer je hem er in te stoppen?

Verwijderd

Topicstarter
Het gaat erom dat de stored-procedure op deze manier wordt aangeroepen:

exec <sp-naam> <param1>, @@identity, <param2>

op de commandline werkt dit feilloos

Ik haal hem dus in principe zowel op als dat ik 'm insert, maar daar gaat het niet om. Het gaat erom dat createparameter een functie is die de parameters creeert om de sp aan te roepen. Ik neem dus aan dat als het zo via de commandline gaat het ook met createparameter moet kunnen. Het enige wat hier gebeurt is dat asp voor de sp-executie zorgt ipv dat ik het handmatig moet doen.

Ik weet dus dat je het ook eerst via een select statement kan opvragen etc.. Maar het gaat er nu even om dat het zo ook moet kunnen en het me nog niet lukt.

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Heb je geprobeerd om die @@identity in asp te casten?

Verwijderd

Topicstarter
Op donderdag 07 februari 2002 14:09 schreef raptorix het volgende:
Heb je geprobeerd om die @@identity in asp te casten?
:? come again?

Verwijderd

Waarom stop de die @@IDENTITY dan niet gewoon in je stored procedure??

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Ik snap ook nog steeds niet wat je precies, wil je wil identity terugstoppen terwijl je dat toch echt gewoon gebruikt om alleen op te halen :?

Verwijderd

Geef anders ook even de stored procedure of dat gedeelte waar je de @@IDENTITY wilt gebruiken?

Verwijderd

Topicstarter
heb ik al geprobeerd, maar dat is in dit geval niet mogelijk. Wegens zoals ik al zei; een ingewikkeld, lang verhaal wat nu niet van toepassing is. Het gaat erom dat ik bovenstaande werkende moet hebben.

Verwijderd

Topicstarter
Op donderdag 07 februari 2002 14:21 schreef ml1 het volgende:
Geef anders ook even de stored procedure of dat gedeelte waar je de @@IDENTITY wilt gebruiken?
sp is niet van toepassing, het gaat erom dat het via createparameter gaat werken
Ik snap ook nog steeds niet wat je precies, wil je wil identity terugstoppen terwijl je dat toch echt gewoon gebruikt om alleen op te halen
Ik roep een stored-procedure aan, die een update doet op een tabel, deze tabel bevat een veld die wijst naar een pk v/e andere tabel. In het geval in dit veld een id moet worden gestopt v/e record die net toegevoegd is heb je @@identity nodig om dat laatste ge-insertte id op te vragen, capiche?

Maar in dit geval ligt het allemaal niet zo makkelijk en heb_ik_toch_echt een werkend vb via createparameter nodig.

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Op donderdag 07 februari 2002 14:27 schreef KoekenBoes het volgende:
Ik roep een stored-procedure aan, die een update doet op een tabel, deze tabel bevat een veld die wijst naar een pk v/e andere tabel. In het geval in dit veld een id moet worden gestopt v/e record die net toegevoegd is heb je @@identity nodig om dat laatste ge-insertte id op te vragen, capiche?
Het is misschien handig als je gewoon veldnamen noemt, heb het nu 8 keer gelezen maar snap echt nog steeds niet wat je nou wilt

Verwijderd

Topicstarter
bekijk mijn voorbeeld van die exec sp-naam eens, dat is exact wat er moet gebeuren. Het enige wat ik wil is createparameter werkende krijgen zodat tegen de sp wordt gezegd: Insert bij dit veld @@identity (precies zoals ik het via de commandline zou doen)

veldnamen zijn totaal niet relevant

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Op donderdag 07 februari 2002 14:48 schreef KoekenBoes het volgende:
bekijk mijn voorbeeld van die exec sp-naam eens, dat is exact wat er moet gebeuren. Het enige wat ik wil is createparameter werkende krijgen zodat tegen de sp wordt gezegd: Insert bij dit veld @@identity (precies zoals ik het via de commandline zou doen)

veldnamen zijn totaal niet relevant
Als je de sproc niet kan of wil wijzigen zit er niets anders op dan in ASP de @@identity waarde op te vragen en deze waarde mee te geven aan de sproc.

Today's subliminal thought is:


Verwijderd

Topicstarter
wacht ff: Handmatig via de commandline werkt het perfect, Met de sp is dus niks mis. Wat ik nu doe is hetzelfde alleen tik ik het niet handmatig in; Ik laat asp het voor me doen. Dan zou je toch denken dat ik exact dezelfde aanroep ook via asp zou moeten kunnen genereren? Daar is deze functie namelijk voor bedoeld: Een sp aanroepen met bepaalde parameters die je meegeeft.

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Op donderdag 07 februari 2002 15:02 schreef KoekenBoes het volgende:
Daar is deze functie namelijk voor bedoeld: Een sp aanroepen met bepaalde parameters die je meegeeft.
Maar dan moeten die parameters natuurlijk wel wat betekenen.
En daar gaat het nu om. Op de commandline heeft @@identity een waarde, binnen ASP niet. Punt.

Dus: vraag de waarde (dus het getalletje) vooraf op en geeft deze mee aan de sproc. Of wijzig je sproc zodat deze zelf de @@identity opvraagt.

Today's subliminal thought is:


Verwijderd

Topicstarter
dat is het probleem niet, de waarde van value moet gewoon een string zijn, in dit geval de string "@@IDENTITY". asp hoeft de waarde van identity niet te weten, de sp moet alleen met de parameter bevattende de string @@identity aangeroepen te worden. Exact zoals bij de commandline.

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Om een string te executen als een sql commando kan je gebruik maken van sp_executesql.
Maar dan moet je dus wel je sproc verbouwen. En op dat moment kan je dus net zo goed (lees: beter) gewoon meteen @@identity hard-coden in de sproc.

Today's subliminal thought is:


Verwijderd

Topicstarter
sp_executesql is een interne tsql functie

Ik zal het nogmaals een keer proberen uit te leggen:
  • Ik heb een stored procedure, genaamd 'sp1'
  • die heeft 3 parameters: @naam, @beschrijving en @fkid
  • ik roep 'm via de commandline op deze manier aan: exec sp1 'bla', 'blablabla', @@identity id wordt automatisch gegenereerd
  • nu wordt @fkid gevuld met het id van het laatste ge-inserte record (@@identity returnt het laatst ge-insertte id binnen deze connectie)
  • ik wil deze stored procedure exact op deze manier aanroepen, maar dan mbv asp
  • dit doe ik mbv de volgende code (ingekortte versie):

    Set param1 = cmd.CreateParameter("@naam", adVarChar, adParamInput)
    cmd.Parameters.Append param1
    param1.Value = "bla"
    Set param2 = cmd.CreateParameter("@description", adVarChar, adParamInput)
    cmd.Parameters.Append param2
    param1.Value = "blablablabla"
    Set param3 = cmd.CreateParameter("@naam", adInteger, adParamReturnValue)
    cmd.Parameters.Append param3
    param1.Value = "@@identity"
Je zou verwachten dat dit prima gaat en de stored procedure met de parameters 'bla', 'blablablabla', @@identity aanroept, dit zou moeten kunnen maar op 1 of andere manier doe ik iets fout

Er zijn een aantal vlaggetjes die je bij de createparameter functie moet definieren (ie of het een return-waarde is van een andere sp/of het een output parameter is etc..etc..)

De sp aanpassen is helaas geen optie...

Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)
Return Value


Returns a Parameter object.

Parameters
Name
Optional. A String value that contains the name of the Parameter object.
Type
Optional. A DataTypeEnum value that specifies the data type of the Parameter object.
Direction
Optional. A ParameterDirectionEnum value that specifies the type of Parameter object.
Size
Optional. A Long value that specifies the maximum length for the parameter value in characters or bytes.
Value
Optional. A Variant that specifies the value for the Parameter object.

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Op donderdag 07 februari 2002 16:26 schreef KoekenBoes het volgende:
sp_executesql is een interne tsql functie
dat weet ik
Op donderdag 07 februari 2002 16:26 schreef KoekenBoes het volgende:
Ik zal het nogmaals een keer proberen uit te leggen:

[..]
Oke, het feit dat je @@identity aan kan roepen via de QA heeft natuurlijk helemaal niks te maken met de aanroep via ASP/ADO.
Dus er zit niets anders op dan binnen dezelfde connectie een select uit te voeren waarbij je de waarde van @@identity opvraagt en deze waarde als je param meegeven.

In het kort:
set rs = cn.execute("select @@identity")
param.value = rs(0).value

Today's subliminal thought is:

Pagina: 1