webForumDet fria alternativet
Logga in / Bli medlem

@@identy problem i asp.net + Access

Databaser & SQL

15 svar · 919 visningar · startad av voigtann1

Medlem sedan juni 20019 519 inlägg
Trådstart#1
    Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & databaseName & ";Persist Security Info=False")
    Dim cmd As New OleDbCommand("", con)
    Dim adapter As New OleDbDataAdapter(cmd)
        cmd.CommandText = "INSERT INTO tblUser (Uname,uLevel) values ('asd',@@identity)"

        con.Open()
        cmd.ExecuteNonQuery()
        con.Close()

@@identity är 0 när jag provar köra detta... tänker jag fel när det gäller @@identity? jag vill just nu bara se om ulevel kan vara lika med uID som finns i min tabell...

Medlem sedan juni 200032 967 inlägg
#2

@@IDENTITY har inget värde förrän du har kört din INSERT. Du kan alltså inte sätta räknarvärdet i två kolumner samtidigt om det är det du försöker dig på.

Medlem sedan juni 20019 519 inlägg
#3

hur löser man det då?

med en update direkt efter då innan vi ta .close?

Medlem sedan juni 20019 519 inlägg
#4
        cmd.CommandText = "INSERT INTO tblUser (Uname,uLevel) values ('asd',@@identity);"
        con.Open()
        cmd.ExecuteNonQuery()
        Dim sql As String = "UPDATE tblUser SET uLevel = uID where uID = @@IDENTITY"
        cmd.CommandText = sql
        cmd.ExecuteNonQuery()
        con.Close()

gick inte direkt som jag vill... försökt söka på google efter @@identity men hittar ingen hjälp med problemet.

Medlem sedan juni 200032 967 inlägg
#5

Du måste berätta för oss vad som inte fungerade, inte bara att det "inte gick". Men du kan ju börja med att ta bort @@identity ur insert-frågan...

Medlem sedan apr. 2004778 inlägg
#6

@@IDENTITY tar fram det senast inlagda ID:t från den tabellen du gör en INSERT.
Vad är det du försöker göra egentligen? I din första INSERT kan du inte ha med @@IDENTITY.
Vad jag förstår är att du med din UPDATE vill sätta uLevel lika med det unika ID som din User får.
Om Uname är unikt för en spelare så kan du göra så här (ingen ultimat lösning men...):

1. INSERT INTO tblUser (Uname) values ('asd' )
2. SELECT uID FROM tblUser where Uname = 'asd'
3. UPDATE tblUser SET uLevel = "det uID du fick från SELECT"

Sen är jag nyfiken på varför du vill sätta uLevel = uID. Vad är syftet? Vi kanske kan hjälpa dig med en bättre lösning som får bort problemet istället för att jobba runt det.

Medlem sedan juni 200032 967 inlägg
#7

Jag är inte säker på att jag håller med PDahlen om steg 2. Jag tycker att det bör gå alldeles utmärkt att göra som voigtann försöker i sin UPDATE...

Medlem sedan juni 20019 519 inlägg
#8

jag ska använda det till mitt forum (om ni kollar några trådar ner så ser ni sql frågan och tabell) men just nu vill jag bara testa med en enkel SQL fråga :D
felet jag får:

Exception Details: System.Data.OleDb.OleDbException: Syntaxfel (operator saknas) i frågeuttrycket 'uID = @@IDENTITY'.

på raden:

första koden går igenom dock är @@identity 0 på den :e men har satt den som 0 just nu :D


Line 78:         Dim sql As String = "UPDATE tblUser SET uLevel = uID where uID = @@IDENTITY"
Line 79:         cmd.CommandText = sql
[B]Line 80:         cmd.ExecuteNonQuery()[/B]

Line 80: cmd.ExecuteNonQuery()

Medlem sedan juni 200032 967 inlägg
#9

Då kanske man (i Access) måste göra en SELECT-fråga emellan för att hämta ut räknarvärdet, och sedan sätta in det i UPDATE-frågan.

Medlem sedan juni 20019 519 inlägg
#10

jo... tror det går att ha select satsen i update? för jag är inte 100% säker på hur man får ut värdet annras i asp.net :D

Medlem sedan juni 200032 967 inlägg
#11

Hm, ska du verkligen skriva ett forum i ASP.NET, om du inte vet hur du får ut data ur databasen? :)

- - - -

jo... tror det går att ha select satsen i update?

Prova!

Medlem sedan juni 20019 519 inlägg
#12

gick inte.. men kollade runt lite:

        Dim reader As OleDbDataReader
        Dim tal As Integer
        cmd.CommandText = "INSERT INTO tblUser (Uname,uLevel) values ('asd',0);"
        ' Try
        con.Open()
        cmd.ExecuteNonQuery()
        Dim sql As String = "SELECT @@IDENTITY as IDe FROM tblUser"
        cmd.CommandText = sql
        reader = cmd.ExecuteReader
        If reader.Read Then
            tal = reader.GetInt32(0)
            reader.Close()
            cmd.CommandText = "UPDATE tblUser SET ulevel = " & tal & " where uID = " & tal
            cmd.ExecuteNonQuery()
            con.Close()
        End If

i ASP.NET forumet skulle tråden kanske avslutas i men grundfrågan är sql :D men det fungera nu iallafall... inte direkt jätte snygg kod men :e

Medlem sedan apr. 2004778 inlägg
#13

@nders skrev:

Jag är inte säker på att jag håller med PDahlen om steg 2. Jag tycker att det bör gå alldeles utmärkt att göra som voigtann försöker i sin UPDATE...

Om man ska se detta ur en skalbar synvinkel så finns det ett problem med att använda @@IDENTITY i två steg om man inte kör en Stored Procedure (SQL Server) eller en Query (Access).
Om det är hög trafik så finns en risk (om än minimal) att två INSERTs görs nästan samtidigt vilket gör att man får ut fel @@IDENTITY.

Som sagt, risken är minimal, men den finns.

Medlem sedan juni 200032 967 inlägg
#14

Jag anser inte att det är någon risk, eftersom @@IDENTITY innehåller räknarvärdet som skapades för den senaste insert som exekverades av denna connection. Så det spelar ingen roll om andra gör inserts samtidigt, du får ändå inte deras räknarvärde.

SELECT @@IDENTITY är inte samma sak som SELECT MAX(räknarfält) FROM tabell.

Det finns såklart andra saker som kan göra så man får fel värde från @@identity, exempelvis om man har en trigger på den tabell man gör insert i, som i sin tur gör insert i en annan tabell med räknare, men om man vet vad man håller på med är @@IDENTITY rätt säker. :)

Medlem sedan juni 20019 519 inlägg
#15

jag litar på @nders :e han svarade så på en annan tråd för 4-5 månader sen till mig så jag litar på honom :e

Medlem sedan dec. 200012 464 inlägg
#16

Sätt kolumnen till null för att indikera att det är första inlägget istället.

262 ms totalt · 4 externa anrop · v20260731065814-full.81e7e81c
115 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)