Avatar billede cult Nybegynder
06. januar 2007 - 23:38 Der er 14 kommentarer og
1 løsning

scope_identity() i ASP ?

Hej alle...

Jeg har et problem med at få SCOPE_IDENTITY() til at virke korrekt i ASP.

Jeg laver et Insert, som bliver indsat uden problemer hvor jeg lige efter denne:

SQL = "SELECT SCOPE_IDENTITY() AS last_id"
Set rsMID = Conn.Execute(SQL)

Problemet er at IDet ikke bliver gemt, når jeg forsøger at udskrive last_id er den tom.

Nogle forslag?

Tak ;)
Avatar billede arne_v Ekspert
06. januar 2007 - 23:42 #1
samme connection object ?
Avatar billede cult Nybegynder
06. januar 2007 - 23:45 #2
Ja, det er samme. Jeg bruger kun en. :)
Avatar billede arne_v Ekspert
06. januar 2007 - 23:46 #3
må vi se lidt mere kode ?
Avatar billede cult Nybegynder
06. januar 2007 - 23:48 #4
SQL = "INSERT INTO bbs_messages "
SQL = SQL & "(msg_from, msg_fromID, msg_to, msg_toID, msg_date, msg_subject, msg_text) VALUES ("
SQL = SQL & "'" & Session("User") & "', "
SQL = SQL & "'" & Session("UID") & "', "
SQL = SQL & "'" & rsRecipient("User") & "', "
SQL = SQL & "'" & Request.Form("toID") & "', "
SQL = SQL & "'" & strDate & "', "
SQL = SQL & "'" & Rep(Request.Form("subject")) & "', "
SQL = SQL & "'" & Rep(Request.Form("msg")) & "')"

Response.Write (SQL & "<br><br>")
Conn.Execute(SQL)

SQL = "SELECT SCOPE_IDENTITY() AS last_id"
Set rsMID = Conn.Execute(SQL)

Response.Write (rsMID("last_id") & "<br><br>")
Avatar billede arne_v Ekspert
07. januar 2007 - 03:18 #5
er der et IDENTITY felt i den tabel ?
Avatar billede hnteknik Novice
07. januar 2007 - 11:49 #6
Er det ikke fordi, du har lost scope ?

Se f.eks. dette eks.


This example creates two tables, TZ and TY, and an INSERT trigger on TZ. When a row is inserted to table TZ, the trigger (Ztrig) fires and inserts a row in TY.

USE tempdb
GO
CREATE TABLE TZ (
  Z_id  int IDENTITY(1,1)PRIMARY KEY,
  Z_name varchar(20) NOT NULL)

INSERT TZ
  VALUES ('Lisa')
INSERT TZ
  VALUES ('Mike')
INSERT TZ
  VALUES ('Carla')

SELECT * FROM TZ

--Result set: This is how table TZ looks
Z_id  Z_name
-------------
1      Lisa
2      Mike
3      Carla

CREATE TABLE TY (
  Y_id  int IDENTITY(100,5)PRIMARY KEY,
  Y_name varchar(20) NULL)

INSERT TY (Y_name)
  VALUES ('boathouse')
INSERT TY (Y_name)
  VALUES ('rocks')
INSERT TY (Y_name)
  VALUES ('elevator')

SELECT * FROM TY
--Result set: This is how TY looks:
Y_id  Y_name
---------------
100  boathouse
105  rocks
110  elevator

/*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
  BEGIN
  INSERT TY VALUES ('')
  END

/*FIRE the trigger and find out what identity values you get
with the @@IDENTITY and SCOPE_IDENTITY functions*/
INSERT TZ VALUES ('Rosalie')

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT  @@IDENTITY AS [@@IDENTITY]
GO

--Here is the result set.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/

@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/
Avatar billede cult Nybegynder
07. januar 2007 - 19:31 #7
arne_v, yes "mid" er sat som Identity Column og Primærnøgle.

hnteknik, beklager, men den forstod jeg ikke meget af... :)
Kan jeg lokke dig til at forklare det lidt nærmere, måske med min kode som eksempel?

I skal nok få flere points.
Avatar billede hnteknik Novice
07. januar 2007 - 20:37 #8
Cult - jeg kan lige prøve at komme med et eks. i ASP - Du skal bruge en procedure.
Kommer lige tilbage med et eks. øjeblik
Avatar billede hnteknik Novice
07. januar 2007 - 20:44 #9
Prøv denne her - du skal vist blot rette det til eget eksempel:

CREATE PROCEDURE dbo.FAQ_InsertBook
    @title VARCHAR(255),
    @pubdate DATETIME,
    @synopsis VARCHAR(4000),
    @salesCount INT
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @newBookID INT
    INSERT BOOKS
    (
        title,
        pubdate,
        synopsis,
        salesCount
    )
    VALUES
    (
        @title,
        @pubdate,
        @synopsis,
        @salesCount
    )
    SELECT @newBookID = SCPOE_IDENTITY()
    SELECT newBookID = @newBookID
END
GO

GRANT EXEC ON dbo.FAQ_InsertBook to sa ( eller hvad du nu kalder din adgang)
GO

<%
FUNCTION FixDate(str)
    datestr = cdate(str)
    mStr = month(datestr): dStr = day(datestr): yStr = year(datestr)
    if (Clng(mStr) < 10 and len(mStr)=1) then mStr = "0" & mStr
    if (Clng(dStr) < 10 and len(dStr)=1) then dStr = "0" & dStr
    FixDate = yStr & mStr & dStr
END FUNCTION

FUNCTION FixString(str)
    FixString = replace(str,"'","''")
END FUNCTION

    title = "test store proc"
    pubdate = "20000101"
    synopsis = "dette skulle gerne returnere 1"
    salesCount = 0 

    title = FixString(title)
    pubdate = FixDate(pubdate)
    synopsis = FixString(synopsis)
    salesCount = cLng(salesCount) 

    sql = "EXEC dbo.FAQ_InsertBook" &_
        " @title='" & title & "'," &_
        " @pubdate='" & pubdate & "'," &_
        " @synopsis='" & synopsis & "'," &_
        " @salesCount=" & salesCount 

    set conn = CreateObject("ADODB.Connection")
    conn.open "<connection string>"
    set rs = conn.execute(sql)
    Response.write("Indsat post var nr.: <b>" & rs(0) & "</b>.")
    rs.close: set rs = nothing
    conn.close: set conn = nothing
%>
Avatar billede arne_v Ekspert
08. januar 2007 - 03:17 #10
det du gør bør kunne lade sig gøre

følgende virker hos mig:

<%
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=SQLOLEDB;Data Source=ARNEPC3;Initial Catalog=Test;Integrated Security=SSPI;"
con.Execute("CREATE TABLE dummy(id INTEGER IDENTITY, tval VARCHAR(50), PRIMARY KEY(id))")
con.Execute("INSERT INTO dummy(tval) VALUES('ABC')")
Set rs = con.Execute("SELECT SCOPE_IDENTITY() AS idid")
Response.Write rs("idid")
con.Execute("DROP TABLE dummy")
Set rs = Nothing
Set con = Nothing
%>
Avatar billede cult Nybegynder
08. januar 2007 - 13:31 #11
arne, den virker også for mig. Den virker også hvis jeg insætter mit INSERT statement ind i den i stedet for din.
Avatar billede cult Nybegynder
08. januar 2007 - 13:33 #12
Nu fik jeg det til at virke!

Jeg åbnede en ny forbindelse til samme DB, med samme connection string, og udførte INSERT og SELECT SCOPE_IDENTITY på den, hvilket virkede perfekt.

Så der må have været et eller andet på min første connection der "forstyrrede" SCOPE_IDENTITY? - Det eneste jeg udfører på samme side er 2 SELECTS, så jeg er lidt forvirret.

Men det vigtigste er jo at det virker, arne smid et svar :)
Avatar billede arne_v Ekspert
08. januar 2007 - 15:15 #13
ok
Avatar billede hnteknik Novice
08. januar 2007 - 15:36 #14
Ok - nu var der vist ikke noget i vejen med mit svar, som iøvrigt sparer dig et roundtrip til serveren og afvikler mere effektivt ;-)
Avatar billede cult Nybegynder
08. januar 2007 - 15:42 #15
Tja, syntes nu ikke der er nogen grund til at bruge 70 liniers kode på noget som man kan klare på 5, bare for at spare en enkelt SELECT :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester