webForumDet fria alternativet

@@identy problem i asp.net + Access

15 svar · 917 visningar · startad av voigtann1

voigtann1Medlem sedan juni 20019 519 inlägg
#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...

@ndersMedlem sedan juni 200032 969 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å.

voigtann1Medlem sedan juni 20019 519 inlägg
#3

hur löser man det då?

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

voigtann1Medlem 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.

@ndersMedlem sedan juni 200032 969 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...

PDahlenMedlem 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.

@ndersMedlem sedan juni 200032 969 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...

voigtann1Medlem 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()

@ndersMedlem sedan juni 200032 969 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.

voigtann1Medlem 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

@ndersMedlem sedan juni 200032 969 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!

voigtann1Medlem 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

PDahlenMedlem 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.

@ndersMedlem sedan juni 200032 969 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. :)

voigtann1Medlem 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

LarsGMedlem 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.

129 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)