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 QNAP
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