[ASP] Hoe ID veld van nieuw record te vinden?

Pagina: 1
Acties:
  • 112 views sinds 30-01-2008
  • Reageer

  • Rarz
  • Registratie: Januari 2001
  • Laatst online: 25-08 12:39
Een pagina moet een nieuw record toevoegen aan een SQL database (MS Sql Server). Het veld NID is een integer, 4 chars lang, mag niet nul zijn, Identity is aangevinkt, Identity Seed en -Increment zijn beide 1.

Het volgende stukje ASP werkte wel met Access maar niet met SQL (blijkbaar). Enig idee? :)

' Add a new record to the Nieuws table and prepare it.
sub createrecord()
Rs.AddNew
Rs("NDatum") = date()
Rs("NHomepage") = "12"
Rs("NTaal") = "1"
Rs("NInhoud") = " "
Rs("NAnkertekst") = " "
Rs.Update
Rs("NTitel") = "Nieuw Bericht (#" & Rs("NID") & ")"
Rs.Update
current_id = Rs("NID")
end sub

When in question, when in doubt, run in circles, scream and shout.


  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Zelf gebruik ik nooit autonumbers maar doe het volgende misschien dat je hier iets aan hebt:

CREATE PROCEDURE [insertklant]
(
@voornaam [nvarchar](50),
@achternaam [nvarchar](50),
@straat [nvarchar](50),
@nummer [nvarchar](8),
@plaats [nvarchar](50),
@postcode [nvarchar](15),
@email [nvarchar](50),
@telefoon [nvarchar](50),
@land [tinyint],
@loginname [nvarchar](15),
@password [nvarchar](10),
@RefID [int]
)
AS
SET NOCOUNT ON
DECLARE @ID Int
SELECT @ID = CAST((max(ID)) + 1 AS int) FROM Klanten
IF @ID is Null
Set @ID = 1
INSERT INTO Klanten
( [id],
[voornaam],
[achternaam],
[straat],
[nummer],
[plaats],
[postcode],
[email],
[telefoon],
[land],
[loginname],
[password],
[RefID]
)

VALUES
( @id,
@voornaam,
@achternaam,
@straat,
@nummer,
@plaats,
@postcode,
@email,
@telefoon,
@land,
@loginname,
@password,
@RefID
)
SET NOCOUNT OFF
select @ID as ID

  • stean
  • Registratie: November 2000
  • Laatst online: 15-09 11:32
waarom doe je niet een
'count' of een 'max'
op alle records?

stean

  • Morpheus_at_work
  • Registratie: December 2000
  • Laatst online: 16-09 20:18
ga even naar www.sqlteam.com en zoek daar op
@@INDENT dan vind je daar alles over je vraag

Canon R6 MARK III, 35mm 1.4 VCM, 50mm 1.4 VCM , 85mm 1.4 VCM , 17-35mm 1.8, 28-70 1.8 , 24-105 1.8 70-200 f2.8


  • Rarz
  • Registratie: Januari 2001
  • Laatst online: 25-08 12:39
Bedankt voor de hulp tot nu toe -- maar ik ben er nog niet uit. Dit is wat ik nu heb:

Set Rs = Server.CreateObject("ADODB.Recordset")
Rs.Open "SELECT * FROM Nieuws", provider, 1, 3

strSQL = "INSERT INTO Nieuws (NTitel, NDatum) VALUES ('" & "Nieuw Bericht" & "','" & date() & "')"
strSQL =+ "SELECT @@IDENTITY"

Set Rs = DataConn.Execute(strSQL)
response.write(Rs("NID"))

Welke de volgende error geeft:

ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.

Terwijl ik dacht dat met de laatste SELECT de nieuwste rij geselecteerd zou zijn. Er zijn veel artikelen over @@identity, maar desondanks lukt het niet. >_< Het enige wat ik nodig heb is de NID waarde van de zojuist toegevoegde row. Het werkte prima op de Access file waarop de paginas waren ontworpen. |:(

When in question, when in doubt, run in circles, scream and shout.


Verwijderd

Op donderdag 15 februari 2001 10:30 schreef rarzie het volgende:
Bedankt voor de hulp tot nu toe -- maar ik ben er nog niet uit. Dit is wat ik nu heb:

Set Rs = Server.CreateObject("ADODB.Recordset")
Rs.Open "SELECT * FROM Nieuws", provider, 1, 3

strSQL = "INSERT INTO Nieuws (NTitel, NDatum) VALUES ('" & "Nieuw Bericht" & "','" & date() & "')"
strSQL =+ "SELECT @@IDENTITY"

Set Rs = DataConn.Execute(strSQL)
response.write(Rs("NID"))

Welke de volgende error geeft:

ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.

Terwijl ik dacht dat met de laatste SELECT de nieuwste rij geselecteerd zou zijn. Er zijn veel artikelen over @@identity, maar desondanks lukt het niet. >_< Het enige wat ik nodig heb is de NID waarde van de zojuist toegevoegde row. Het werkte prima op de Access file waarop de paginas waren ontworpen. |:(
Hij zegt dat NID geen bestaande kolom is...

  • Rarz
  • Registratie: Januari 2001
  • Laatst online: 25-08 12:39

When in question, when in doubt, run in circles, scream and shout.


Verwijderd

Als je net een insert hebt gedaan, dan wil dat nog niet zeggen dat ie daarna ook op dat record staat.

Dus je zult eerst een nieuwe query erop los moeten laten waarmee je de max opvraagt van de NID kolom.

Verwijderd

Anders helpt dit misschien wel...

http://www.sqlteam.com/item.asp?ItemID=422

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 16:30

Janoz

Moderator Devschuur®

!litemod

Op woensdag 14 februari 2001 15:40 schreef stean het volgende:
waarom doe je niet een
'count' of een 'max'
op alle records?

stean
Leuk bedacht, maar meeste databases worden door meerdere mensen tegelijk gebruikt.

Stel je hebt deze code
vraag om max id (db commando)
verwerk resultaat
tel bij max 1 op
schrijf nieuw record met nieuw id weg (db commando)

Vervolgens wordt deze code bijna gelijktijdig door persoon A en persoon B uitgevoerd. Dan kan de database de volgende verzoeken binnen krijgen:

A wat is max ID? (db geeft 15)
B wat is max ID? (db geeft 15)
A hier is een record met ID=16
B hier is een record met ID=16 (db - heb ik al)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Dat is dus de reden waarom er autonummering bestaat!

  • Rarz
  • Registratie: Januari 2001
  • Laatst online: 25-08 12:39
Bedankt BluB! Dat was een link waar ik wat aan heb. :) SQLTeam.com is erg bruikbaar! :)

When in question, when in doubt, run in circles, scream and shout.


Verwijderd

Graag gedaan.

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Autonummering sux

  • bloody
  • Registratie: Juni 1999
  • Laatst online: 22:20

bloody

0.000 KB!!

Op donderdag 15 februari 2001 10:43 schreef BluB het volgende:

[..]

Hij zegt dat NID geen bestaande kolom is...
duhh.

verander onderstaande:
code:
1
2
3
4
strSQL =+ "SELECT @@IDENTITY"

Set Rs = DataConn.Execute(strSQL)
response.write(Rs("NID"))

in
code:
1
2
3
4
strSQL =+ "SELECT @@IDENTITY as nummer"

Set Rs = DataConn.Execute(strSQL)
response.write(Rs("nummer"))

nope


Verwijderd

Wat een gelul...

Het is al opgelost geloof ik, dus waar maken jullie je nou druk om?

  • Rarz
  • Registratie: Januari 2001
  • Laatst online: 25-08 12:39
Voor degene die geinteresseerd is (Ik ben ook altijd opzoek naar interessante stukjes code, alhier de werkende code:

strSQL = "SET NOCOUNT ON "
strSQL = strSQL + " INSERT Nieuws (NTitel, NDatum, NAnkertekst, NInhoud, NHomepage, NTaal)"
strSQL = strSQL + " VALUES (' ','" & date() & "',' ',' ','12','1') "
strSQL = strSQL + " SELECT IdentityInsert=@@identity"
strSQL = strSQL + " SET NOCOUNT OFF"

Set Rs = DataConn.Execute(strSQL)
current_id = rs("IdentityInsert")

Bedankt voor jullie hulp. Een nuttige dag -- weer iets geleerd. :)

When in question, when in doubt, run in circles, scream and shout.


  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Misschien een dom vraagje, maar vind je het niet handiger om een stored procedure van te maken?

  • FragDaddy
  • Registratie: Mei 2000
  • Laatst online: 07:57
[qoute]
Rs.Update
current_id = Rs("NID")
[/qoute]

kan het zijn dat SQL-server die update niet METEEN doet als 'ie hem binnenkrijgt ? het zou namelijk kunnen dat SQL-server nog geen commit gedaan heeft, en het record dus in zijn 'to-do' lijstje staat..

verder zou ik het zo ook ff niet weten.. maar ik zou het persoonlijk daar in zoeken :)

suc6.

Have a wheelie good weekend!


  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Ik heb me er eigenlijk ook nooit heel erg in verdiept maar dit schrijft MS in sqlserver books:

Starting Transactions
You can start transactions in Microsoft® SQL Server™ as explicit, autocommit, or implicit transactions.


Explicit transactions
Explicitly start a transaction by issuing a BEGIN TRANSACTION statement.

Autocommit transactions
This is the default mode for SQL Server. Each individual Transact-SQL statement is committed when it completes. You do not have to specify any statements to control transactions.

Implicit transactions
Set implicit transaction mode on through either an API function or the Transact-SQL SET IMPLICIT_TRANSACTIONS ON statement. The next statement automatically starts a new transaction. When that transaction is completed, the next Transact-SQL statement starts a new transaction.

Verwijderd

Ik zit met hetzelfde probleem. Ik wil ook graag het laatste Autonumber ID als variabele opvragen maar ik krijg het niet voor mekaar.

Ik heb alle stukjes codes geprobeerd die in dit forum staan vermeld, ook heb ik met google diverse pagina's gevonden met info over dit onderwerp maar nog wil het me niet lukken. Het zal jullie vast al zijn opgevallen maar ik ben een complete Newbie betreft ASP maar zou het toch wel graag werkende willen krijgen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.open "gegevens"

strSQL = "SET NOCOUNT ON "
strSQL = strSQL + " INSERT INTO TBLnaam (naam, achternaam)"
strSQL = strSQL + " VALUES ('pieter','post') "
strSQL = strSQL + " SELECT newid=@@identity"
strSQL = strSQL + " SET NOCOUNT OFF"

Set Rs = objConn.execute(strSQL)

Response.write Rs("newid")

Dan krijg ik de volgende foutmelding:

Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

Iemand enig idee??

  • KoeKk
  • Registratie: September 2000
  • Laatst online: 14-09 19:20
Als je nu een Select doet op het ID en je ORDERt hem ASC en dan move je naar het laatste record?
code:
1
2
3
SELECT ID 
FORM tabel
ORDER BY ID ASC

en dan in je Record Set ff dit doen:
code:
1
rs.MoveLast

Dat zou toch het gewenste resultaat moeten hebben?

  • KoeKk
  • Registratie: September 2000
  • Laatst online: 14-09 19:20
Op donderdag 22 november 2001 18:21 schreef KuiF33nD het volgende:
Ik zit met hetzelfde probleem. Ik wil ook graag het laatste Autonumber ID als variabele opvragen maar ik krijg het niet voor mekaar.

Ik heb alle stukjes codes geprobeerd die in dit forum staan vermeld, ook heb ik met google diverse pagina's gevonden met info over dit onderwerp maar nog wil het me niet lukken. Het zal jullie vast al zijn opgevallen maar ik ben een complete Newbie betreft ASP maar zou het toch wel graag werkende willen krijgen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.open "gegevens"

strSQL = "SET NOCOUNT ON "
strSQL = strSQL + " INSERT INTO TBLnaam (naam, achternaam)"
strSQL = strSQL + " VALUES ('pieter','post') "
strSQL = strSQL + " SELECT newid=@@identity"
strSQL = strSQL + " SET NOCOUNT OFF"

Set Rs = objConn.execute(strSQL)

Response.write Rs("newid")

Dan krijg ik de volgende foutmelding:

Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

Iemand enig idee??
ZO te zien gebruik je Access, daar gaat dit stukje code helaas niet in werken...

Uit de foutmelding kan je aflijden dat hij het SET NOCOUNT ON niet kent, waarom gebruik je dit eigenlijk? Als je gewoon een INSERT stament doet zou het ook moeten werken...

  • Scare360
  • Registratie: Juli 2001
  • Laatst online: 11-09 09:22
Op donderdag 15 februari 2001 11:26 schreef Janoz het volgende:

[..]

Leuk bedacht, maar meeste databases worden door meerdere mensen tegelijk gebruikt.

Stel je hebt deze code
vraag om max id (db commando)
verwerk resultaat
tel bij max 1 op
schrijf nieuw record met nieuw id weg (db commando)

Vervolgens wordt deze code bijna gelijktijdig door persoon A en persoon B uitgevoerd. Dan kan de database de volgende verzoeken binnen krijgen:

A wat is max ID? (db geeft 15)
B wat is max ID? (db geeft 15)
A hier is een record met ID=16
B hier is een record met ID=16 (db - heb ik al)
== correct alleen hier kun je heel eenvoudig lock en unlock voor gebruiken! alles wat een "kritieke sectie" zou kunnen zijn zet je tussen de locks en dan heb je dat parralellisme probleem opgelost.

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Uit de foutmelding kan je aflijden dat hij het SET NOCOUNT ON niet kent, waarom gebruik je dit eigenlijk? Als je gewoon een INSERT stament doet zou het ook moeten werken...
SET NOCOUNT ON gebruik je om de "x row(s) affected" meldingen uit te zetten in MSSQLServer. Deze komen namelijk ook terug als recordset en daardoor kan je niet (rechtstreeks) de @@identity opvragen uit de recordset.

Maar aangezien het hier idd om access lijkt te gaan heb je er niet veel aan.

Today's subliminal thought is:


  • oZy
  • Registratie: Juli 2001
  • Laatst online: 16-09 17:28

oZy

sorry voor het omhoog kicken van deze draad, maar ik zit met hetzelfde probleem met een ms access dbase :?

iemand nog zijn of haar hoofd hierover gebroken?

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 16-09 17:28

oZy

eindelijk zelf wat gevonden.. zie hier:

je doet in plaats van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath("dbase/db_bla.mdb"))

strSQL = "INSERT INTO TabelBla"
strSQL = strSQL & "(bla, bla2) VALUES ("
strSQL = strSQL & "'" & Request.Form("bla") & "', "
strSQL = strSQL & "'" & Request.Form("bla2") & "');"

conn.Execute strSQL, lngRecsAffected, adCmdText Or adExecuteNoRecords
Set strSQL = Nothing
conn.close

dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath("dbase/db_bla.mdb"))

rs.Open TabelBla, conn, adOpenKeySet, adLockOptimistic, adCmdTable
rs.AddNew

rs("bla") = Request.Form("bla")
rs("bla2") = Request.Form("bla2")

rs.Update
NieuwID = rs("NaamVanUniqueIdVeld")
rs.close
conn.close

niet de meest resources vriendelijke manier, maar het werkt wel.. meer info (en een workaround betreft die resources) @ 4 Guys from Rolla

Verwijderd

Op dinsdag 27 november 2001 15:50 schreef oZy het volgende:
eindelijk zelf wat gevonden.. zie hier:

je doet in plaats van:...
... meer info (en een workaround betreft die resources) @ 4 Guys from Rolla
Ik ben er ondertussen ook uit. Ik heb precies dezelfde manier gebruikt als oZy.

Ik weet niet of het de beste oplossing is maar het werkt bij mij goed.
Pagina: 1