用dbExpress新增保存時,AutoID出錯? ( 积分: 50 )

  • 主题发起人 主题发起人 cnkf
  • 开始时间 开始时间
C

cnkf

Unregistered / Unconfirmed
GUEST, unregistred user!
數據庫是SQL Server 2000,表如下:
CREATE TABLE [dbo].[MyTest201] ([AutoID] [int] IDENTITY (1, 1) NOT NULL ,
[ProductName] [varchar] (50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ) ON [PRIMARY]
使用dbExpress中的,SQLConnection + SQLQuery + DataSetProvider + ClientDataSet 組合或者用 SimpleDataSet 在修改、刪除然後保存是正常的。
現在是新增一條或多條時,數據庫有AutoID是自動增1的所以不用輸入數據,然後保存就出現錯誤AutoID是空的;輸入數字又不能保存,請問如何解決這個AutoID?
 
數據庫是SQL Server 2000,表如下:
CREATE TABLE [dbo].[MyTest201] ([AutoID] [int] IDENTITY (1, 1) NOT NULL ,
[ProductName] [varchar] (50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ) ON [PRIMARY]
使用dbExpress中的,SQLConnection + SQLQuery + DataSetProvider + ClientDataSet 組合或者用 SimpleDataSet 在修改、刪除然後保存是正常的。
現在是新增一條或多條時,數據庫有AutoID是自動增1的所以不用輸入數據,然後保存就出現錯誤AutoID是空的;輸入數字又不能保存,請問如何解決這個AutoID?
 
我觉得和连接数据库的控件没有多大关系,自增一的字段是不用值的,你检查一下你的字段确实是自增一吗,如果是是吧sql server出问题了
 
[red]【清风】你好!
數據庫沒有問題,是自動增一的。用ADO連接這個表可以正常處理所有事務。請幫我查一查,謝謝!!![/red]
 
因為dbExpress把數據下載到客戶端內存后就與服務端斷開連接了,所以會出現你這種總是,你可能需要改用其它方法,
你的意思可能是要建跟ACCESS里的自增長字段一樣的字段,但SQL2000沒有自增長類型,要用默認值的方式來做(即你建表中的IDENTITY (1, 1))
提供一個思路:
建字段時,這個字段不要設為NO NULL(即允許它為空),這樣更新上去后,SQL2000會處理這個字段
 
AYing你好!
即你建表中的IDENTITY (1, 1),字段不要設為NO NULL(即允許它為空)?你這兩個條件只會有一個成立吧?
其次SQL2000是有自增長類型。
請你繼續,謝謝!!!
 
没有认真看问题,呵呵。今天试了一把:
建表时,AutoID不设为是自增长类型,也不设No null,但可以用默认值的方法实现自动加1
--或者---
在程序中先新增一虚记录然后保存记录,手工取这一条记录的AutoID值,然后再用编辑这条记录的方法实现
--或者---
在TDataSetProvider.beforeUpdateRecord手工编写更新代码
 
建表时,AutoID不设为是自增长类型,也不设No null,但可以用默认值的方法实现自动加1
問:不知如何實現,難道要在DELPHI或SQL2000裡重寫代碼嗎?如在DELPHI也是不能實現的,因為也會出現同樣的問題AutoID

在程序中先新增一虚记录然后保存记录,手工取这一条记录的AutoID值,然后再用编辑这条记录的方法实现
問:也會出現同樣的問題AutoID

在TDataSetProvider.beforeUpdateRecord手工编写更新代码
問:在這裡實現更難,比如當新增N條、刪除X條、修改N+X條時,這個事務你會怎麼寫代碼呢?

請你繼續謝謝!!!
 
(按你的建表方式)如果AutoID这个字段不出现在用户界面的话,在SELECT语句中就不要包含此字段,更新时就正常了(已测试)
--或者--
如果AutoID不设为是自增长类型,也不设No null,可以在TDataSet.OnNewRecord事件中编写自增1的函数,此函数返回值赋给AuotID即可(已测试)
 
To AYing:你好!
  你回答的第1個是可以的,但與我的本題離了(因為沒有徹底解決AutoID)。但當我需要AutoID值的時候可就要另開Open了,這樣也不是解決的問題的辦法對嗎?
  你回答的第2個問題賦值跟AutoID,然後按Post是可以的正常的(更新緩沖),如果按ClientDataSet1.ApplyUpdates(0);提交到數據庫可就出錯了。提示是:
Project Project1.exe raised exception class EDatabaseError with message SQL State:42000,SQL Error Code:544 Cannot insert explicit value for identity column in table 'MyTest201' when IDENTITY_INSERT is set to OFF'.Process stopped.Use Step or Run To continue.
是因為數據庫已經具有自增的功能,不能賦值。其次就算可以的話也不正確,因為當多個用戶同時使用新增的時候,這個AutoID會有重復的值出現(這是因為你賦值)。
  你好!請你繼續謝謝!!!
 
实在不行的话,那只好弃用数据感知组件(不过,代码量比较大)
我觉得这个跟dbExpress处理数据的方式有关,因为用ADO测试的话不会出现你这种问题,dbexpress我也是正在学习,了解不深。
 
To AYing:你好!
  我以前是用ADO的,處理數據也非常方便,出現問題也非常少。可最近才開始用Dbexpress,兩者比較後發現Dbexpress速度特快,我才喜歡這個高效的dbexpress。
  請你繼續謝謝!!!

  請各位高手出招謝謝!!!
 
你跟踪一下,在添加时肯定添加重复的ID
 
其实自增的字段不用管就可以了。个人看法,仅供参考
 
使用dbExpress中的,SQLConnection + SQLQuery + DataSetProvider + ClientDataSet 組合或者用 SimpleDataSet 在修改、刪除然後保存是正常的。
現在是新增一條或多條時,數據庫有AutoID是自動增1的所以不用輸入數據,然後保存就出現錯誤AutoID是空的;輸入數字又不能保存,請問如何解決這個AutoID?
 
select @@identity 这样可以获得最新ID,

用SET IDENTITY_INSERT OFF可以去除你说的那个限制,用完以后设置ON
允许将显式值插入表的标识列中。

语法
SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }


倒是可以插入数字ID,但是都是SQL 语句,不知道能不能满足你的要求

另外参考

http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1845041
 
To chenybin:
  select @@identity 取的值為什麼是空的?
  SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }也不能解決問題。你提供的連接也是不能解決問題的根源。
  這個問題我們可以參考BDE、ADO,是不要對這個自增特別關照,其實BDE、ADO對於自增不要任何處理就可以完成工作。那為什麼Dbexpress就不行呢?難道一定要走大彎路來解決嗎?
  請大家繼續謝謝!!!
 
大家好!以我的看法,對於本題出發點:
1、不是程序的錯。
2、也不是數據庫的錯。

我想一定是Dbexpress的相關問題,請大家繼續謝謝!!!
 
那个是从SQL SERVER的帮助里面找出来的

等高手
 
問題還沒有解決,請大家繼續謝謝!!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
I
回复
0
查看
800
import
I
后退
顶部