请教高手:
rs("date")=savetime
rs.updateid=rs("id")如何取得刚发布的信息中的ID号?使用的是ASP+SQL

解决方案 »

  1.   

    用存储过程插入数据create proc insertdata
    @date datetime,
    ...
    @id int output
    as
    insert tablename(...) values (...)select @id=SCOPE_IDENTITY ()go
      

  2.   

    以前是ACCESS数据库使用以下就可以,可是升级到SQL以后就无法调用到ID                  rs("date")=savetime
    rs.update
    if request("makehtml")="yes" then
    temp = rs.book
    rs.book = temp
    newid=rs.Fields("ID")
    end if
      

  3.   

    不好意思,没看懂。从上面看,你是在UPDATE,既然是UPDATE,那么肯定是已定位于某条记录了,那么也就是说已经可以取得该条记录的ID了,那你还要什么新ID呢?
    另外,
    temp = rs.book
    rs.book = temp
    这两句也不明白,赋值一个书签又取得这个书签,有什么意义?
      

  4.   

    我看过一些朋友的相同问题,可是都无法将ID 调用出来.
    就是要实现
    当将一条新数据加入数据库以后在取出这条数据的ID 来执行下一步程序工作.
    以下是程序:
    sql="select * from infoprice where (id is null)"
    rs.open sql,conn,1,3
    rs.addnew
    rs("tid")=request("tid")
    rs("se")=request("se")
    rs("title")=request("title")
    rs("form_user")=request("form_user")
    rs("form_url")=request("form_url")
                    rs("fpath")=cstr(year(now())&"-"& month(now()))
                    rs("fname")=fname
      if request("html")="yes" then
    ' rs("info")=request("body")
    rs("info")=winwaa
      else
    rs("info")=winwaa
      end if  id=rs("id")
                    rs("date")=savetime
    rs.update
                    if request("makehtml")="yes" then
    response.redirect "info_makeinfo.asp?type=page&id="&id&"&tid="&request("tid")
      

  5.   

    如果不考虑多用户迸发,INSERT之后可以试试下面这个:
    SELECT ID=SCOPE_IDENTITY()
    或者
    SELECT ID=@@IDENTITY
      

  6.   

    如果考虑多用户迸发,最好是另设一张表,放置各种单据类型的当前最大ID号,然后通过一个存储过程来取得这个ID号,那么对于你来说,ID号就是可控的了。
    下面是我做过的程序中的一段代码,仅为参考:表--
    CREATE TABLE [dbo].[ReceiptMaxNo] (
    [lngReceiptMaxNoID] [int] IDENTITY (1, 1) NOT NULL ,
    [lngReceiptTypeID] [int] NOT NULL ,
    [strReceiptNO] [nvarchar] (6) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [lngReceiptNO] [int] NOT NULL 
    ) ON [PRIMARY]存储过程--
    --获取新编号的存储过程
    CREATE PROC e_GetNextCode
    @lngReceiptMaxNoID INT=0,
    @lngReceiptTypeID INT,
    @strReceiptNO NVARCHAR(6)=N'',
    @lngReceiptNO INT=0,
    @IsMarkDate INT=0,
    @strNextCode NVARCHAR(30)=N'' OUTPUT,
    @lngErrCode INT=0 OUTPUTASDECLARE @SQL NVARCHAR(4000)SET @strNextCode=CONVERT(NVARCHAR(10),GETDATE(),112)+N'-'BEGIN TRAN
    UPDATE ReceiptMaxNo 
    SET lngReceiptNO=lngReceiptNO+1 
    WHERE lngReceiptTypeID=@lngReceiptTypeID
    SET @SQL=N'SELECT @strNextCode= (strReceiptNO+ @strNextCode+CAST((100000+lngReceiptNO) AS NVARCHAR(30))) 
    FROM ReceiptMaxNo 
    WHERE lngReceiptTypeID=@lngReceiptTypeID' EXEC SP_EXECUTESQL @SQL,
    N'@strNextCode NVARCHAR(30) OUTPUT,@lngReceiptTypeID INT',
    @strNextCode OUTPUT,@lngReceiptTypeID

    IF CAST(RIGHT(@strNextCode,5) AS INT)<100000 SET @strNextCode= STUFF(@strNextCode,CHARINDEX('-',@strNextCode)+1,1,'0') IF @@ERROR >0 
    BEGIN
    ROLLBACK TRAN
    SET @lngErrCode=820
    RETURN
    END
    ELSE
    BEGIN
    SET @lngErrCode=0
    COMMIT TRAN
    END
    GO
      

  7.   

    非常感谢fyming,我在调试一下,很希望能交你这样的高手朋友,我的QQ是59922383
      

  8.   

    to fyming:
    如果考虑多用户迸发,最好是另设一张表,放置各种单据类型的当前最大ID号咨询一下:如果多用户以极高频率并发,会不会造成你这个表被锁?插入前或插入后,肯定要到你这个表取最大ID并更新的吧。
    我没有测试过,不过听说在这种情况下,用系统自增的会好点。特此求证。
      

  9.   

    用insert触发器吧.create trigger trg_ins on [table1]
    after insert
    begin
        select @@identity
    end在客户端执行Insert SQL时,采用可以得到记录集的执行方式,取得的记录集就是新插入的id.
      

  10.   

    To:ww3347(新来的) 以下纯属技术讨论,欢迎其他兄弟加入:)“如果多用户以极高频率并发”,在这种情况下,更不能用“系统自增”了,你想啊,刚插入一条记录,然后去取IDENTITY,但在你取之前的空隙,很有可能其他用户又插入了一条,那你取得的IDENTITY其实并不是你想要的。“如果多用户以极高频率并发”,频率会高到什么程序?我们在编程的时候可能会根据实际情况进行处理。比如一个50个用户的局域网络,也可以这样做,在表中除了设置种子标识列之外,再另设USERS(操作员)和dateEditTime(编辑时间),插入记录之后,用一条SETECT ID FROM T WHERE USERS=* AND dateEditTime=*”来得到ID,原理是:同一操作员在同一时间总没可能同时做两笔以上的记录吧。但问题又来了,如果在不同的电脑上用同一操作员的用户名登录并且操作,如何处理?dateEditTime要精确到什么程度?小时、分还是秒?
    没有哪个程序语言可以完美地解决所有的问题,高级语言如此,更不说数据库语言了。如果系统自增的能够解决问题,那当然最好,谁也不想自找麻烦,兜一个大圈。
      

  11.   

    fyming() ,谢谢您了:
    我今天才看到你的回复,我也是使用这种方式解决的.