Avatar billede rif1900 Nybegynder
12. marts 2009 - 12:46 Der er 3 kommentarer og
1 løsning

Stored procedure der returnerer et ID - C#

Hej Eksperter

Jeg har en SP der ser sådan her ud:

ALTER PROCEDURE crm_CreateCompany
@company_name nvarchar(50)
,@company_phone nvarchar(50)
,@address nvarchar(100)
,@zip_code int
,@city nvarchar(50)
,@country nvarchar(50)
,@comment nvarchar(1000)
AS
SET NOCOUNT ON
INSERT INTO [crm_company]
          ([company_name]
          ,[company_phone]
          ,[address]
          ,[zip_code]
          ,[city]
          ,[country]
          ,[comment])
    VALUES
          (@company_name
          ,@company_phone
          ,@address
          ,@zip_code
          ,@city
          ,@country
          ,@comment)

    select SCOPE_IDENTITY()
    RETURN

Hvordan i helgoland kan jeg få fat i det den returnerer der fra C#?

ExecuteNonQuery gør det ikke og ExecuteScalar fejler.

Skal jeg bruge en return parameter i min SP i stedet og hvordan gør jeg det så?

Mvh
RIF1900
Avatar billede aaberg Nybegynder
12. marts 2009 - 13:47 #1
Du kan bruge ExecuteScalar. Grunden til at du oplever den fejler, er højest sandsynligt fordi "select SCOPE_IDENTITY()" returnerer en decimal (og du prøver sikkert at caste til en int).

Prøv:

int theNewId = Convert.ToInt32(theCommand.ExecuteScalar());
Avatar billede rif1900 Nybegynder
12. marts 2009 - 14:07 #2
Hejsa

Har løst det i mellemtiden men nu har jeg da to løsninger

min løsning blev:
RETURN SCOPE_IDENTITY()

og så
SQLCmd.Parameters.Add("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

og så ExecuteNonQuery
Avatar billede aaberg Nybegynder
12. marts 2009 - 14:50 #3
Godt du fandt ud af det. Som jeg ser det, er der ikke en af løsningerne som er bedre end den anden, så der er ingen grund til at skifte til min løsning, hvis du har fået det andet til at virke :-).

God programmeringslyst :-)
Avatar billede rif1900 Nybegynder
12. marts 2009 - 19:06 #4
Næh det vigtigste i løsningen er vel netop at bruge SCOPE identity i stedet for @@IDENTITY som kører globalt scope.

Min løsning før var tåbelig og jeg havde derfor besluttet mig at få det løst så jeg ikke løber ind i concurrency problemer senere hen :)

God programmeringslyst til dig også
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester