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
					
		
	 
		
								
					
				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());
		
		
	 
	
		
								
					
				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
		
		
	 
	
		
								
					
				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 :-)
		
		
	 
	
		
								
					
				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å