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 tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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