sql server 的一个问题(30分)

  • 主题发起人 主题发起人 bird
  • 开始时间 开始时间
B

bird

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在做一个向数据库录入程序,要求是在录完一条记录后要马上知道
该记录的编号(编号是自增的),我现在的做法是post后
query.close;
query.open; 一下,可这样实在是太慢了,请教各位大侠如何解决
 
使用什么数据库!
可以使用存储过程产生行号!速度快一些!
 
自己算行号,不要到数据库中取行号.
 
如果是多人同时操作,如何自己算!
 
采用Muli-Tier结构。
 
数据库不是自已有自已的子句吗?(如果是SQL 语言)
 
beforepost事件中计算记录数然后加一或afterPost记录数可以吗?
 
是多人录入,只能靠服务器提供的编号!
“采用Muli-Tier结构。”是什么意思?
怎么做?
 
大富翁即数据库服务器,应用服务器,瘦客户机三层结构,
行号由应用服务器来产生,客户机只管取行号。
 
用Oracle的话用system的sequence,当然要先create个sequence.
我用Sybase,建张序号表,post前确认下。

 
老天保佑你在用MS SQL Server

其中有一个 IDENTITY property (check the t-sql help)

双击Enterprise Manager里的table name, press "Advanced Features",
就可以选择一个int字段为identity, 其数值会自己增加.
做一个sotred procedure更新纪录, 返回值就是该纪录号

不过在具体实现的时候可能有小tricks, 自己试试吧!
估计sybase也可以, 毕竟MS SQL Server全抄sybase的.
 
这么easy的问题,怎么答的都不挨边?

我来告诉你:

Query.sql.add(' select noCount on ') ; //欺骗Delphi,使它认为当前
的是一个结果集
Query.sql.add(' insert into your_table ');
//加入你的需要插入的数据

Query.sql.add(' select @@IDENTITY '); //访问系统变量得到刚才自动
插入的数值!!

Query.sql.add(' select noCount off ');
Query1.Open

id := Query1.Fields[0].AsInteger; //将数值存入变量
Query1.close;

肯定没问题!
又挣30分了吧?!




 

更正更正!!
抱歉, 刚才着急去开会,没检查应该为Set nocount on ( 或 off)

Query.sql.add(' select noCount on ') ; //欺骗Delphi,使它认为当前
^^^^^^^ 的是一个结果集
应该为 Set nocount on
 
query1.post;
query1.refresh;


ok?
 
何付斌, your answer is error.
在Enterprise Manager里加identity字段是可行的,不用额外编程。
 
嘻嘻,我想说的 hanson 都说了,看来找不到分啦
补充一下, hanson 的做法应该放在事物里执行才保险
否则在多人环境里,得到的@@identify 有可能错误
最好的办法是利用存储过程
存储过程开始:

declare rtn_value int

update A_Table set A_Field=A_Value where A_Field=A_Un_Existd_Value
//更新a_table中的a_field ,但是符合条件 a_field 的数值要不存在
//这是强行设置事务锁级别到更新锁
select ......... and other operation
insert into your table
select rtn_value=@@identify
return rtn_value
go
 
多人接受答案了。
 
后退
顶部