是这样,在VB中我试着利用
sql = "insert into PRODUCT_IN values(@@Identity ,'" & _
    txtProductInfo(2).Text & "','" & DTPickerDate.Value & "')"
ExeSQL (sql)错误描述:简单的说,是把 @@Identity 作为NULL了;
想把这条语句直接交给DBMS去处理,@@Identity在引号内,不知道这样为什么不可以被处理,或是有其他解决办法,还望不吝赐教,谢谢!

解决方案 »

  1.   

    示例
    下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。INSERT INTO jobs (job_desc,min_lvl,max_lvl)
    VALUES ('Accountant',12,125)
    SELECT @@IDENTITY AS 'Identity'
      

  2.   

    将@@IDENTITY 赋给一个变量,然后使用.declare @int as int
    select @int = @@IDENTITYinsert into tb values(@int)
      

  3.   

    你好!我这样试过了:
    sql = "declare @pID as int select @pID=@@Identity insert into PRODUCT_IN values(@pID ...
    还是有错误:
    3条语句间是空格(按SQL Server),错误还是指示@pID为NULL;
    我想知道VB大概是怎样把SQL语句交给DBMS去处理的,我直接把整个3句都包含在""内了,不知道这样可以处理么
      

  4.   

    在表结构中把要插入@@Identity 的列设置为标识列,在 insert 语句中不插入该列的值。为防止插入列错误,可将 insert 语句写完整:insert into (a,b,c) values('va','vb','vc'),如果在表结构中把标识列放在最后一列,也可以在你的语句中直接略去标识列值。
    如果要更改标识列的当前种子,可把种子值传过存储过程来更改。
      

  5.   

    设表table1 有列 product,inorout,member,id,其中id为标识列。
    直接添加行:
    myConn.Execute ("insert into table1 values('sahu','wefs',88)")
    如果id不是最后一列,则应:
    myConn.Execute ("insert into table1 (product,inorout,member) values('sahu','wefs',88)")
    设置可更改种子:
    myconn.execute ("SET IDENTITY_INSERT table1 ON")
    更改种子:
    myConn.Execute ("insert into table1 values('sahu','wefs',88,1000)")
    执行下列语句后:
    myconn.execute (""SET IDENTITY_INSERT table1 OFF")
    则利用新种子。
      

  6.   

    可能是我没说清楚,是这样,我的问题不是在插入时自动获得强制键上,而是:我在<表一>上刚才自动生成了强制键,想在<表二>里面用到刚才生成的那个键值,比如作为外键等,用@@Identity,可是没成功.
      

  7.   

    道理比较简单.我们来模拟一下你的操作:首先,你打开查询分析器,这时输入要连到哪个sql服务器,及帐户密码.
    此时建立了一个连接.INSERT tb SELECT 'x'
    SELECT @@IDENTITY
    得到 5 (不一定是5,依具你表中现在的种子值可能有不同)
    再重新执行 SELECT @@IDENTITY
    继续得到 5
    这时,不要关掉查询分析器.
    点文件新建"查询窗口"
    输入
    SELECT @@IDENTITY
    得到 NULL再切回你原来的窗口,
    继续 SELECT @@IDENTITY
    得到 5为什么会这样呢? 其实 @@IDENTITY 在联机丛书里就已经说的很清楚了, 它受会话限制.我们打开查询分析器时,建立了一个连接及进程或者说会话(默认会打开一个查询窗口), 新建窗口建立了连接下的另一个进程.
    所以在第一个窗口中运行的东西, @@IDENTITY 位于同一会话中,可以取到.
    到第二个窗口,因为会话不同,所以就取不到了.在你的VB程序里:CONN.EXECUTE("INSERT .....")  '//这是一个进程或者说会话,这里指数据库进程,不是指vb进程
    MSGBOX CONN.EXECUTE("SELECT @@IDENTITY")(0) '//这是另一个进程,所以取到NULL如果你写作
    CONN.EXECUTE("INSERT .....  ; SELECT @@IDENTITY") 那么二者位于同一会话中,就可以取到了.如果你希望不受会话限制那么用 IDENT_CURRENT('表名'), 这样无论哪个进程中都能取到.
    还有一个 SCOPE_IDENTITY, 它不限受会话限制,还受作用域限制.个人看法.仅供参考.
      

  8.   


    先用
    sql="select @@identity as id"
    执行此语句,得出结果,再用结果值代入你的语句中注意:insert数据库取 identity的值,前后语句的连接必须是同一连接,如不是同一连接,即@@identity不能取得前一语句insert所生成的identity值可把insert into 数据与你的
     "insert into PRODUCT_IN values(@@Identity ,'" & _ 
        txtProductInfo(2).Text & "','" & DTPickerDate.Value & "')" 
    合成一句sql 语句
    再执行,即可取得@@identity的值