关于SQL 7.0的含IDENTITY的表记录插入问题。(50分)

  • 主题发起人 主题发起人 yanghaijun
  • 开始时间 开始时间
Y

yanghaijun

Unregistered / Unconfirmed
GUEST, unregistred user!
我在SQL服务器的一个表中有一IDENTITY的主键,可是我在DELPHI程序中却
无法使用正常的DBGRID(或NAVIGATOR)为其增加记录,总是发生错误,我可以
通过SQL让其增加记录,但这么一来与DBGRID结合得好像不紧密。我用什么方法
才能达到不使用SQL的INSERT语句而直接使用DELPHI的数据敏感控件使含有
IDENTITY键的表增加记录呢?
 
DataSet(Table, Query, StrocProc等)中建立字段对象,字段属性中把Required
属性设为false,另外把字段属性的AutoInc(属性名可能不太对)选上.

 
给表加一个UPDATESQL控件,简单好用
 
刚才在SQL Server7试了一下,就按你说的,建立一个有IDENTITY的主键
的表,放了一个DBGRID和NAVIGATOR,增加记录时完全正常。关键是不要
对IDENTITY主键的字段输入数据!如果在IDENTITY字段输入数据,马上出错。
只要在DBGRID上处理以下,不显示IDENTITY主键的字段就可以了。
 
我强烈推荐大家提问前看已答问题。
1、TTable与自增字段结合不好,主要是BDE的问题;
2、在做C/S时,多用TQuery/TStoredProcedure少用TTable;
3、做C/S少用TDBGrid;
4、可建另一表维护自增字段,而非使用IDENTIFY
5、一定要用TTABLE,可加UPDATESQL
以下来自坏人1,非王坏人:
2。 使用存储过程来做(最好不要用触发器,就是那个发生器*)使用存储过程的好处是因为一般涉及到主键的自增域大多和主副表有关使用存储过程可以同时完成这个任务
declare @id int
insert dbo.tbl1 (id,......) values(id........)
select @id=max(id) from dbo.tbl1
update dbo.tbl2 set .........
/* 这样完成多表更新 */
3. 不使用自增字段,而是,使用另外一个表来做本来需要自增字段的表的记数器。这样做的好处是对于大数据表,效率会有很大提高。 实现方法是: 定义一个 dbo.idcount 里面只有一条记录,存放主表记录计数
declare @idcount int
update dbo.idcount set field1=xxx where field1=一个不存在的值
/* 这样做是强制更新SQL SERVER的 锁定级别 为更新锁 */
/* 因为下面的SELECT 动作是共享锁定级别,可能会引起DEAD LOCK */
select @idcount=field1 from dbo.idcount

insert into dbo.table1 (id........) values(@idcount..........)
/* 插入主表 */
insert or update 副表............
 
如果使用SQL Explorer就可以知道产生这种现象的原因了:
IDENTIFY字段在Insert时,不能该他指定值
所以如果在Delphi中如果使用了任何方法给该字段赋值,就会使服务器端出错
试一下TAutoIncField:

TAutoIncField represents an autoincrement field in a dataset.

在DataSet中添加所有的字段,为所有的字段创建字段对象,
将IDENTIFY字段删除,再新增加字段(new fields),
Name输IDENTIFY字段名,Type:AutoInc
FieldType:Data

 
CJ,坏人1也是俺哦, 呵呵
 
>做C/S少用TDBGrid;
>可建另一表维护自增字段,而非使用IDENTIFY
为什么少用TDBGrid?如果用Query返回的数据集,不用TDBGrid,用什么(第三方控件除外)?
为什么不用IDENTITY,我一直用到现在,虽然有时处理稍困难,但基本上都解决了.
用IDENTITY有什么不好吗?
请大师们解惑


 
用UpdateSql是最直接的办法,而且也是最有效的办法。
 
各位高手大侠的发言都有道理,但第一个回答此问题的RedForks基本答到了点子上,
尽管我找了半天也没找到什么AutoInc属性,但你可将该字段的FieldKind置为
fkInternalCalc以达到我所说的目的,正常情况下数据字段的FieldKind属性为
fkData。分数不多,Redforks 30分,其余各位大侠各打50大板。
 
同意cj意见,我在做c/s时也遇到过,identity字段并没有付值,却提示需要给
identity字段付值,ttable构件是败笔
 
后退
顶部