30. april 2009 - 09:40 
												Der er
									9  kommentarer													og 					1  løsning									 
									
		 
		
			
return autoid efter en insert 
			Jeg skulle meget gerne have ms sql til at retunere det sidste lavede auto id, efter jeg har insertet et element i databasen. Har læst lidt til at man skal bruge @@Identity, men at den ikke skulle være så godt at bruge. og kan ikke helt se hvordan den skal bruges, kollonen som idet står i hedder Id.
					
		
	 
                            
Annonceindlæg fra Conscia 
 
 
	
		
								
					
				30. april 2009 - 09:58  
				#1 
						
		 
		
			Det kan i nogle tilfælde være bedre at bruge SCOPE_IDENTITY() i stedet for @@Identity. Du bruger den på følgende måde: insert into myTable(col1,col2) values(@val1, @val2); select SCOPE_IDENTITY()
		
		
	 
	
		
								
					
				30. april 2009 - 10:04  
				#2 
						
		 
		
			I en row kan der så vidt jeg husker kun være et AutoIncremental ID ... og rigtigt nok at @@Identity tager det sidste indsatte AutoID. public intAddEntry(string message)         {         int i = 0;             using (SqlCommand cmd = new SqlCommand(NORMAL_SQL, Conn))             {                 cmd.Parameters.Add("@SID", System.Data.SqlDbType.SmallInt).Value = (SID == null) ? (object)DBNull.Value : SID;                 cmd.Parameters.Add("@Message", System.Data.SqlDbType.Text).Value = message;                 cmd.Parameters.AddWithValue("@Added", Program.Date);                 Conn.Open();                 using (var ts = new TransactionScope())                 {                     i = (int)cmd.ExecuteScalar();                     ts.Complete();                 }             }             Conn.Close(); return i;         }         private const string NORMAL_SQL = "INSERT INTO ImportLog ( SID, Message, Added ) VALUES (@SID, @Message, @Added ); SELECT CAST(Scope_Identity() AS INT)"; Sådan noget ala det ... hapset fra min egen kode. // ouT
		
		
	 
	
		
								
					
				30. april 2009 - 10:05  
				#3 
						
		 
		
			Læs om SCOPE_IDENTITY() funktionen her:
http://msdn.microsoft.com/en-us/library/ms190315.aspx Der står også lidt om, hvorfor det i nogle tilfælde kan være bedre at bruge SCOPE_IDENTITY(). I de fleste tilfælde er det ligegyldigt om du bruger SCOPE_IDENTITY() eller @@Identity, men for en god ordens skyld, kan du bare altid bruge SCOPE_IDENTITY()
		
 
		
	 
	
		
								
					
				30. april 2009 - 10:36  
				#4 
						
		 
		
			Hej jeg skulle meget gerne have den til at retunere id'et når jeg tilføjer dette, string sqlstring = "INSERT INTO [finalDb].[dbo].[Company]([Name],[Address],[Zip],[City],[Person],[Phone],[Email],[Description], [Username], [Website]) Values('";         sqlstring += companyName + "','";         sqlstring += companyAddress + "',";         sqlstring += companyZip + ",'";         sqlstring += companyCity + "','";         sqlstring += contactPerson + "',";         sqlstring += contactPhone + ",'";         sqlstring += contactEmail + "','";         sqlstring += companyDescription + "','";         sqlstring += username + "','";         sqlstring += website + "')";         SqlCommand command = new SqlCommand(sqlstring);         command.CommandType = CommandType.Text;         command.Connection = connection;         connection.Open();         command.ExecuteNonQuery();         connection.Close();
		
		
	 
	
		
								
					
				30. april 2009 - 10:47  
				#5 
						
		 
		
			Har du kigget på min kode og prøvet at merge det samme ? Har du ovevejet at bruge parameters ? ( dette spm vil du altid få, da du i overstående kode giver mulighed for sql injections )
		
		
	 
	
	
	
		
								
					
				30. april 2009 - 11:01  
				#6 
						
		 
		
			Prøv dette (ikke testet): string sqlstring = "INSERT INTO [finalDb].[dbo].[Company]([Name],[Address],[Zip],[City],[Person],[Phone],[Email],[Description], [Username], [Website]) Values('";         sqlstring += companyName + "','";         sqlstring += companyAddress + "',";         sqlstring += companyZip + ",'";         sqlstring += companyCity + "','";         sqlstring += contactPerson + "',";         sqlstring += contactPhone + ",'";         sqlstring += contactEmail + "','";         sqlstring += companyDescription + "','";         sqlstring += username + "','";         sqlstring += website + "')";         sqlstring += " select scope_identity()";         SqlCommand command = new SqlCommand(sqlstring);         command.CommandType = CommandType.Text;         command.Connection = connection;         connection.Open();         int newId = Convet.ToInt32(command.ExecuteScalar());         connection.Close();
		
		
	 
	
		
								
					
				30. april 2009 - 11:02  
				#7 
						
		 
		
			Har kigget på det.. Det jeg mest kom til at tænke på er hvordan du executer, din sqlstring, er det med en ExecuteNonQuery eller bare ExecuteQuery???
		
		
	 
	
		
								
					
				30. april 2009 - 11:16  
				#8 
						
		 
		
			En anden ting er, at det er bedre at bruge parametre, end at parse parametre ind sql-querien. Dette gør at du ikke kan få problemer med specielle tegn. Hvis det er en hjemmeside du laver, vil det også forebygge muligheden for sql-injection angreb. Derudover er det smart at bruge noget try-finally når du kalder Execute, så forbindelsen bliver lukket, hvis querien fejler. Prøv: int newId; SqlCommand command = connection.CreateCommand(); command.CommandType = CommandType.Text; command.CommandText = "INSERT INTO [finalDb].[dbo].[Company]([Name],[Address],[Zip],[City],[Person],[Phone],[Email],[Description], [Username], [Website]) Values(@companyName, @companyAddress, @companyZip, @companyCity, @contactPerson, @contactPhone, @contactEmail, @companyDescription, @username, @website) select scope_identity()"; command.Parameters.AddWithValue(@companyName, companyName); command.Parameters.AddWithValue(@companyAddress, companyAddress); command.Parameters.AddWithValue(@companyZip, companyZip); command.Parameters.AddWithValue(@companyCity, companyCity); command.Parameters.AddWithValue(@contactPerson, contactPerson); command.Parameters.AddWithValue(@contactPhone, contactPhone); command.Parameters.AddWithValue(@contactEmail, contactEmail); command.Parameters.AddWithValue(@companyDescription, companyDescription); command.Parameters.AddWithValue(@username, username); command.Parameters.AddWithValue(@website, website); try {     connection.Open();     newId = Convet.ToInt32(command.ExecuteScalar()); } finally {     connection.Close() }
		
		
	 
	
		
		
			Det virker nu.. Tak for hjælpen
		
		
	 
	
	
		
	
		
		
		
			
			Computerworld tilbyder specialiserede kurser i database-management