如何在VB中获得SQL Server里最近用到的强制关键字

Ron_Weasley 2008-03-01 11:26:37
是这样,在VB中我试着利用
sql = "insert into PRODUCT_IN values(@@Identity ,'" & _
txtProductInfo(2).Text & "','" & DTPickerDate.Value & "')"
ExeSQL (sql)

错误描述:简单的说,是把 @@Identity 作为NULL了;
想把这条语句直接交给DBMS去处理,@@Identity在引号内,不知道这样为什么不可以被处理,或是有其他解决办法,还望不吝赐教,谢谢!
...全文
83 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ron_Weasley 2008-03-03
  • 打赏
  • 举报
回复
楼上两位讲解得很清楚,受益匪浅.
也谢谢大家的参与!
-晴天 2008-03-02
  • 打赏
  • 举报
回复
在表结构中把要插入@@Identity 的列设置为标识列,在 insert 语句中不插入该列的值。为防止插入列错误,可将 insert 语句写完整:insert into (a,b,c) values('va','vb','vc'),如果在表结构中把标识列放在最后一列,也可以在你的语句中直接略去标识列值。
如果要更改标识列的当前种子,可把种子值传过存储过程来更改。
Ron_Weasley 2008-03-02
  • 打赏
  • 举报
回复
你好!我这样试过了:
sql = "declare @pID as int select @pID=@@Identity insert into PRODUCT_IN values(@pID ...
还是有错误:
3条语句间是空格(按SQL Server),错误还是指示@pID为NULL;
我想知道VB大概是怎样把SQL语句交给DBMS去处理的,我直接把整个3句都包含在""内了,不知道这样可以处理么
cxmcxm 2008-03-02
  • 打赏
  • 举报
回复

先用
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的值
fcuandy 2008-03-02
  • 打赏
  • 举报
回复
道理比较简单.

我们来模拟一下你的操作:

首先,你打开查询分析器,这时输入要连到哪个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, 它不限受会话限制,还受作用域限制.

个人看法.仅供参考.
Ron_Weasley 2008-03-02
  • 打赏
  • 举报
回复
可能是我没说清楚,是这样,我的问题不是在插入时自动获得强制键上,而是:我在<表一>上刚才自动生成了强制键,想在<表二>里面用到刚才生成的那个键值,比如作为外键等,用@@Identity,可是没成功.
-晴天 2008-03-02
  • 打赏
  • 举报
回复
设表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")
则利用新种子。
dawugui 2008-03-01
  • 打赏
  • 举报
回复
将@@IDENTITY 赋给一个变量,然后使用.

declare @int as int
select @int = @@IDENTITY

insert into tb values(@int)


dawugui 2008-03-01
  • 打赏
  • 举报
回复
示例
下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧