jag har en sida i mitt forum där användare kan skapa en ny tråd. Kör "SELECT @@IDENTITY" på samma connection så får du tillbaka senaste skapa "räknare" på aktuell connection. kan du vara lite mer precis med vad du menar med "kör SELECT @@IDENTITY"?? Det spelar inte så stor roll vilket. Antingen gör du en SP som först gör en "INSERT INTO threads (a,b,c) VALUES (1,2,3)" och sedan "SELECT @@IDENTITY" eller så gör du två separata anrop, det viktiga är att du använder samma connection. jag gjorde det så här: Är inte riktigt säker på att jag är med på vad du menar. Men att hämta ut @@IDENTITY måste ju var det enklaste tycker jag.en forum-fråga
samtidigt som tråden skapas så skapas även det första inläget i tråden.
trådar sparas i DB-tabellen "threads" och inläggen i tabellen "posts"
eftersom jag skapar både tråden och det första inlägget samtidigt får jag problem med primär nyckeln (threadId) från "threads" när jag vill spara den i tebellen "posts".
jag vet inte vad den blir eftersom det är en räknare som uppdateras varje gång en ny tråd skapas.
nån som vet hur man får fram primär nyckeln till den sista posten i en DB-tabell?
eller nåt annat förslag på hur man kan kringå det här problemet...Sv: en forum-fråga
/JohanSv:en forum-fråga
menar du som en lagrad proc. el som en vanlig sql-fråga i asp?Sv: en forum-fråga
/JohanSv:en forum-fråga
SP:
ALTER PROCEDURE dbo.StoredProcedure1
AS
SELECT IDENT_CURRENT('aspnet_Threads')
I min klass har jag följande Sub:
Sub addThread(ByVal ForumId As Integer, ByVal Headline As String, ByVal Message As String, ByVal User As String)
Dim dat As DateTime = DateTime.Now
Dim Threadid As Integer
Dim MyConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("WebbhotellConnectionString").ConnectionString)
Dim QSAddThread As String = "INSERT INTO aspnet_Threads (ForumId, Headline, Uname, Date) VALUES (@forumId, @rubrik, @anvandare, @dat)"
Dim SqlCmdAddThread As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(QSAddThread, MyConnection)
Dim QSAddPost As String = "INSERT INTO aspnet_Posts (ThreadId, ForumId, Message, UName, Date) VALUES (@threadid, @forumId, @text, @anvandare, @dat)"
Dim SqlCmdAddPost As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(QSAddPost, MyConnection)
'stored procedure
Dim cmd As SqlCommand = New SqlCommand("StoredProcedure1", MyConnection)
cmd.CommandType = CommandType.StoredProcedure
SqlCmdAddThread.Parameters.Add("@forumId", System.Data.SqlDbType.Int).Value = ForumId
SqlCmdAddThread.Parameters.Add("@rubrik", System.Data.SqlDbType.VarChar).Value = Headline
SqlCmdAddThread.Parameters.Add("@anvandare", System.Data.SqlDbType.VarChar).Value = User
SqlCmdAddThread.Parameters.Add("@dat", System.Data.SqlDbType.DateTime).Value = dat
SqlCmdAddPost.Parameters.Add("@forumId", System.Data.SqlDbType.Int).Value = ForumId
SqlCmdAddPost.Parameters.Add("@threadid", System.Data.SqlDbType.Int).Value = Threadid
SqlCmdAddPost.Parameters.Add("@text", System.Data.SqlDbType.Text).Value = Message
SqlCmdAddPost.Parameters.Add("@anvandare", System.Data.SqlDbType.VarChar).Value = User
SqlCmdAddPost.Parameters.Add("@dat", System.Data.SqlDbType.DateTime).Value = dat
MyConnection.Open()
Try
SqlCmdAddThread.ExecuteNonQuery()
Threadid = cmd.ExecuteScalar()
SqlCmdAddPost.ExecuteNonQuery()
Finally
MyConnection.Close()
End Try
End Sub
Mitt problem är att threadId i DB-tabellen "aspnet_Posts" blir noll. Nån som vet varför??
När jag debugar koden rad för rad får jag rätt värde på threadid men sen när allting ska in i tabellen så blir det fel...Sv: en forum-fråga
SP:
<code>
BEGIN TRY
BEGIN TRAN
DECLARE @errMess varchar(100)
DECLARE @id int
SET @id = 0
SET @errMess = 'ETT FELMEDDELANDE OM DET INTE GICK ATT LÄGGA TILL POSTEN I THREADS'
INSERT INTO aspnet_Threads (ForumId, Headline, Uname, Date)
VALUES (@forumId, @rubrik, @anvandare, @dat)
SET @id = @@IDENTITY
IF(@id== 0) -- Om @@IDENTITY är 0 så är det ju något fel, då kastas ett fel som hanteras i CATCH
RAISERROR('', 16, 1)
SET @errMess = 'ETT FELMEDDELANDE OM DET INTE GICK ATT LÄGGA TILL POSTEN I POSTS'
INSERT INTO aspnet_Posts (ThreadId, ForumId, Message, UName, Date)
VALUES (@ThreadId, @id, @text, @anvandare, @dat)
IF(@@ROWCOUNT = 1)
COMMIT TRAN
ELSE
RAISERROR('', 16, 1)
END TRY
BEGIN CATCH
ROLLBACK TRAN
RAISERROR(@errMess, 16, 1)
RETURN
END CATCH
</code>
Är kanske nåt fel i koden, jag skrev den direkt i forumet. jag la till en transaktion eftersom det är två insättningar och om den första misslyckas så ska du väl inte utföra den andra? Jag har inte heller skrivit upp parametrarna i SP. Misslyckas den första insättnngen så kastar SQL ett eget fel och då får du ut det felmeddelande du har skrivit där. Hoppas det hjälper