Jag har en funktion som tar ut maxid i min tabell. Det beror ju på vad du vill göra. Just nu plockar du ut Max ID från en kolumn och om en annan person sätter in en ny rad, så ändras ju MaxID och du får RÄTT värde. Om du vill ha reda på det högsta id-värdet för att kunna bestämma vilket id nästa post ska få, så kan du göra allt i en transaktion för att garantera att det inte blir några samtidighetsproblem. Tjena Så här bör det se ut, i en stored procedure (SQL server)Låsa rader i sql
Problemet är om två personer gör detta samtidigt kommer de att få samma ID och allt
kommer att bli fel. Hur ska jag göra för att kunna låsa ID
<code>
string strSQL = "SELECT max("+ col +") AS MAXID from " + table;
IDataReader reader = optoSql.ExecuteReader(strSQL);
while (reader.Read())
{
if(reader.IsDBNull(0))
lngID = 0;
else
lngID =Convert.ToInt16(reader["MAXID"]) + 1;
}
reader.Close();
optoSql.Disconnect();
return lngID;
</code>Sv: Låsa rader i sql
Om du däremot vill vet vilket ID som just din ny insatta post har, så skall du INTE gör så utan använda dig av @@IDENTITY eller SCOPE_IDENTITY() beroende på vilken databas du har.
SELECT @@IDENTITY eller SELECT SCOPE_IDENTITY() ger lite olika värden beroende på hur de används, om du använde MS SQL Server, så hittar du mer info i Books Online som följer med...
- MSv: Låsa rader i sql
/PelleSv: Låsa rader i sql
Använd ExecuteScalar istället - mindre meck med reader.read (while onödig, if räcker som du kör nu)
Och skicka med ett fält som är indexerat - har läst nånstans att det går fortare...
Får jag föreslå en funktion (procedur) som gör insert utan data och returnerar id:t på den nya posten ?
Eller som Pelle säger - ringa in koden med en Transaction.
/JohanSv: Låsa rader i sql
pseudokåd
<code>
BEGIN TRANSACTION
SELECT @MyID = MAX(ID) FROM ...
INSERT INTO Tabellen .....
COMMIT TRANSACTION
</code>
Som redan sagts, är det ännu bättre om id är en @@identity column då slipper du select max.
Ola