View Full Version : DataSet,自增字段存盘时提示值已存在


飞天
03-29-2007, 01:28 PM
在WebServer上,数据集中有一DataTable,其中字段JlId是自增的,往DataTable添加了21条记录,update时抛出异常:列“JLID”被约束为是唯一的。值“6”已存在。
跟踪了一下,添加时JlId自动生成值,从0到20。第一次提示的是1已存在,第二次是2,...。
使用的是SQLServer2000,该字段在数据库里也是自增的。而且TableAdapter的InsertCommand的SQL语句中没有该字段。
这是怎么回事?是需要显示处理什么吗?接连点了20来次,终于Update成功。说明不是数据库方面的问题,应该与TableAdapter有关。如何处理?
--
没有绝对的正确,也没有绝对的错误。

t-qifenj@prcvap.microsoft.com
03-30-2007, 10:25 AM
:

JLIDԼΪΨһ,ҪΪֻ.
Բοµ:

DataColumn.ReadOnly Property
http://msdn2.microsoft.com/en-us/library/system.data.datacolumn.readonly.aspx

ллۣԴ˻ʣɼ
κ⣬ҲԷһ̽֡


߼ֹ֧ʦ
΢ȫ֧
---------------------------------------------------------------------------------------
ǵķʱ䣺һ9:00-18:00ڼճ⣩ǽգ48СʱṩʼӦһо⡣΢鼼֧Ϣʣhttp://support.microsoft.com/gp/newsgroupsupport/zh-cn.
ʱĶʹáظ(Reply to Group)⽫ûл
---------------------------------------------------------------------------------------
ԡ״ṩûκεͬʱҲûκȨ

飞天
03-30-2007, 04:00 PM
你好:
该字段的相关属性设置为:
AutoIncrement = true
AutoIncrementSeed = 0
AutoIncrementStep = 1
DataType = System.Decimal
ReadOnly = true
Unique = true
而且增加记录时JlId确实也自增了,并且没有重复。应该不是该字段的属性问题。
--
没有绝对的正确,也没有绝对的错误。


“t-qifenj@prcvap.microsoft.com”编写:

> 您好 飞天:
>
> 您的情况是由于JLID被约束为是唯一,您需要将它的属性设为只读.
> 您可以参考以下的例子:
>
> DataColumn.ReadOnly Property
> http://msdn2.microsoft.com/en-us/library/system.data.datacolumn.readonly.aspx
>
> 谢谢参与讨论,如果您对此还有疑问,您可继续发贴。
> 如果您还有任何新问题,您也可以发新贴和我们一起探讨。
>
> 纪奇峰
> 在线技术支持工程师
> 微软全球技术支持中心
> ---------------------------------------------------------------------------------------
> 我们的服务时间:周一至周五9:00-18:00(节假日除外)。我们将在两个工作日(48小时)内提供初始回应,并和您一起研究并解决问题。更多微软新闻组技术支持信息,请访问:http://support.microsoft.com/gp/newsgroupsupport/zh-cn.
> 回帖时,请在您的新闻组阅读器中使用“回复组(Reply to Group)”,这将帮助其他用户从您的提问中获益
> ---------------------------------------------------------------------------------------
> 本贴子以”现状”提供且没有任何担保,同时也没有授予任何权利。
>

Sheng Jiang[MVP]
03-31-2007, 08:57 PM
1. Set autoincement seed and step both to -1. This way, you will know the
ident key is dataset generated and not from sql server.
2. Use a rowversion/timestamp column in your database table. Retrieve that
value with your dataadapter's select command.
3. Change rowversion property in datatable to ReadOnly = FALSE. (In the xsd)
4. Do inserts with store procedures, retrieving SCOPE_IDENTITY and new
rowversion value. ADO.net will automatically replace your negative ident
value with the new one retrieved from the database.
--
Regards
Sheng Jiang
Microsoft MVP in Visual C++
"" <@discussions.microsoft.com> wrote in message
news:A7C98A6B-D0FD-4DC5-A96C-170151631BDC@microsoft.com...
> WebServerϣݼһDataTableֶJlIdģDataTable21¼updateʱ׳쳣СJLIDԼΪΨһġֵ6Ѵڡ
> һ£ʱJlIdԶֵ020һʾ1Ѵڣڶ2...
> ʹõSQLServer2000ֶݿҲġTableAdapterInsertCommandSQLûиֶΡ
> ô£Ҫʾʲô𣿽20ΣUpdateɹ˵ݿⷽ⣬ӦTableAdapterйءδ
> --
> ûоԵȷҲûоԵĴ

飞天
04-01-2007, 01:54 PM
你好!

你给的这些操作步骤与TableAdapter自动生成的InsertCommand有什么不同的呢?除了数据库中字段类型你用的是TimeStamp外,好像并没有其他的不一样。而我用的是numeric,自增。
问题的关键应该是在TableAdapter吧!不知道TableAdapter是怎样来判断值是否重复的
--
没有绝对的正确,也没有绝对的错误。


“Sheng Jiang[MVP]”编写:

> 1. Set autoincement seed and step both to -1. This way, you will know the
> ident key is dataset generated and not from sql server.
> 2. Use a rowversion/timestamp column in your database table. Retrieve that
> value with your dataadapter's select command.
> 3. Change rowversion property in datatable to ReadOnly = FALSE. (In the xsd)
> 4. Do inserts with store procedures, retrieving SCOPE_IDENTITY and new
> rowversion value. ADO.net will automatically replace your negative ident
> value with the new one retrieved from the database.
> --
> Regards
> Sheng Jiang
> Microsoft MVP in Visual C++
> "飞天" <@discussions.microsoft.com> wrote in message
> news:A7C98A6B-D0FD-4DC5-A96C-170151631BDC@microsoft.com...
> > 在WebServer上,数据集中有一DataTable,其中字段JlId是自增的,往DataTable添加了21条记录,update时抛出异常:列“JLID”被约束为是唯一的。值“6”已存在。
> > 跟踪了一下,添加时JlId自动生成值,从0到20。第一次提示的是1已存在,第二次是2,...。
> > 使用的是SQLServer2000,该字段在数据库里也是自增的。而且TableAdapter的InsertCommand的SQL语句中没有该字段。
> > 这是怎么回事?是需要显示处理什么吗?接连点了20来次,终于Update成功。说明不是数据库方面的问题,应该与TableAdapter有关。如何处理?
> > --
> > 没有绝对的正确,也没有绝对的错误。
>
>
>

t-qifenj@prcvap.microsoft.com
04-02-2007, 10:29 AM
:

ǺͬSheng Jiang[MVP]Ĺ۵㡣

򵥵˵,ݶdatatable УJLIDֵΪ-1Լ¼ºSCOPE_IDENTITY ݿõ޸ĵļ¼ıţٽ޸ĵļ¼JLIDֵĻݿеֵ


ллۣԴ˻ʣɼ
κ⣬ҲԷһ̽֡


߼ֹ֧ʦ
΢ȫ֧
---------------------------------------------------------------------------------------
ǵķʱ䣺һ9:00-18:00ڼճ⣩ǽգ48СʱṩʼӦһо⡣΢鼼֧Ϣʣhttp://support.microsoft.com/gp/newsgroupsupport/zh-cn.
ʱĶʹáظ(Reply to Group)⽫ûл
---------------------------------------------------------------------------------------
ԡ״ṩûκεͬʱҲûκȨ

飞天
04-02-2007, 01:22 PM
你好!
可能是我没读明白,不知道Sheng Jiang[MVP]是否是以下意思:
1、把字段的起始值和增量都改为-1,这样做的目的是让我明白Ident Key是由DataSet生成而不是SQLServer。
2、将字段类型设为timestamp,并且在TableAdapter的selectcommand中提取出来。
3、在DataTable中,设置字段属性ReadOnly = false。
4、使用存储过程插入数据时,将执行SCOPE_IDENTITY ,并产生新值;Ado.net将自动使用从数据库中提取新值来替换负的Ident。
这段话是否理解有错误?请帮我纠正一下。
--
没有绝对的正确,也没有绝对的错误。


“t-qifenj@prcvap.microsoft.com”编写:

> 您好:
>
> 我们很同意Sheng Jiang[MVP]的观点。
>
> 简单地说,将数据读到datatable 中,将自增列JLID的值和增量改为-1,对记录做完更新后,SCOPE_IDENTITY 从数据库得到被修改的纪录的编号,再将被修改的纪录的JLID值改回数据库中的值。
>
>
> 谢谢参与讨论,如果您对此还有疑问,您可继续发贴。
> 如果您还有任何新问题,您也可以发新贴和我们一起探讨。
>
> 纪奇峰
> 在线技术支持工程师
> 微软全球技术支持中心
> ---------------------------------------------------------------------------------------
> 我们的服务时间:周一至周五9:00-18:00(节假日除外)。我们将在两个工作日(48小时)内提供初始回应,并和您一起研究并解决问题。更多微软新闻组技术支持信息,请访问:http://support.microsoft.com/gp/newsgroupsupport/zh-cn.
> 回帖时,请在您的新闻组阅读器中使用“回复组(Reply to Group)”,这将帮助其他用户从您的提问中获益
> ---------------------------------------------------------------------------------------
> 本贴子以”现状”提供且没有任何担保,同时也没有授予任何权利。

t-qifenj@prcvap.microsoft.com
04-03-2007, 01:37 AM
:

ȷ.ϵIJһ³.

ллۣԴ˻ʣɼ
κ⣬ҲԷһ̽֡


߼ֹ֧ʦ
΢ȫ֧
---------------------------------------------------------------------------------------
ǵķʱ䣺һ9:00-18:00ڼճ⣩ǽգ48СʱṩʼӦһо⡣΢鼼֧Ϣʣhttp://support.microsoft.com/gp/newsgroupsupport/zh-cn.
ʱĶʹáظ(Reply to Group)⽫ûл
---------------------------------------------------------------------------------------
ԡ״ṩûκεͬʱҲûκȨ

飞天
04-05-2007, 04:20 PM
当然有其他方法保存。
但是我就需要用TableAdapter.Update来保存数据,有没有办法?
--
没有绝对的正确,也没有绝对的错误。


“t-qifenj@prcvap.microsoft.com”编写:

> 您好:
>
> 您的理解是正确的.您不妨按照以上的步骤做一下尝试.
>
> 谢谢参与讨论,如果您对此还有疑问,您可继续发贴。
> 如果您还有任何新问题,您也可以发新贴和我们一起探讨。
>
> 纪奇峰
> 在线技术支持工程师
> 微软全球技术支持中心
> ---------------------------------------------------------------------------------------
> 我们的服务时间:周一至周五9:00-18:00(节假日除外)。我们将在两个工作日(48小时)内提供初始回应,并和您一起研究并解决问题。更多微软新闻组技术支持信息,请访问:http://support.microsoft.com/gp/newsgroupsupport/zh-cn.
> 回帖时,请在您的新闻组阅读器中使用“回复组(Reply to Group)”,这将帮助其他用户从您的提问中获益
> ---------------------------------------------------------------------------------------
> 本贴子以”现状”提供且没有任何担保,同时也没有授予任何权利。
>

t-qifenj@prcvap.microsoft.com
04-06-2007, 05:34 AM
:


1DataSetаJLIDֶεʼֵΪ-1
2DataTableУJLIDֶReadOnly = false
3ʹTableAdapterInsertCommandDataTableҪ21¼JLIDֶʱģUpdate׳쳣
4ʹô洢ݿʱִSCOPE_IDENTITY ֵAdo.netԶʹôݿȡֵ滻Ident



ллۣԴ˻ʣɼ
κ⣬ҲԷһ̽֡


߼ֹ֧ʦ
΢ȫ֧
---------------------------------------------------------------------------------------
ǵķʱ䣺һ9:00-18:00ڼճ⣩ǽգ48СʱṩʼӦһо⡣΢鼼֧Ϣʣhttp://support.microsoft.com/gp/newsgroupsupport/zh-cn.
ʱĶʹáظ(Reply to Group)⽫ûл
---------------------------------------------------------------------------------------
ԡ״ṩûκεͬʱҲûκȨ

飞天
04-06-2007, 12:02 PM
我也知道用Insert可以正常插入数据,但是,事务较长的时候,容易丢失数据(数据库中)。如果InsertCommand是直接操作数据库的话,那就不是我所希望的了。我希望能够集中对数据库进行操作,这样才能避免与数据库交互的事务过长。
--
没有绝对的正确,也没有绝对的错误。


“t-qifenj@prcvap.microsoft.com”编写:

> 您好:
>
>
> 1、DataSet中把JLID字段的起始值和增量都改为-1
> 2、在DataTable中,设置JLID字段属性ReadOnly = false。
> 3、使用TableAdapter的InsertCommand往DataTable添加您需要的21条记录,这是JLID字段时负增长的,所以Update不会抛出异常
> 4、使用存储过程向数据库插入数据时,将执行SCOPE_IDENTITY ,并产生新值;Ado.net将自动使用从数据库中提取新值来替换负的Ident。
>
>
>
> 谢谢参与讨论,如果您对此还有疑问,您可继续发贴。
> 如果您还有任何新问题,您也可以发新贴和我们一起探讨。
>
> 纪奇峰
> 在线技术支持工程师
> 微软全球技术支持中心
> ---------------------------------------------------------------------------------------
> 我们的服务时间:周一至周五9:00-18:00(节假日除外)。我们将在两个工作日(48小时)内提供初始回应,并和您一起研究并解决问题。更多微软新闻组技术支持信息,请访问:http://support.microsoft.com/gp/newsgroupsupport/zh-cn.
> 回帖时,请在您的新闻组阅读器中使用“回复组(Reply to Group)”,这将帮助其他用户从您的提问中获益
> ---------------------------------------------------------------------------------------
> 本贴子以”现状”提供且没有任何担保,同时也没有授予任何权利。

t-qifenj@prcvap.microsoft.com
04-09-2007, 08:03 AM
ã

DataAdapterInsertCommandȽҪӵݿļ¼ӵDataAdapterУִUpdateʱµݿ⡣

ڣٻص⡣

ģһDataTableһֶģϣ21¼ݿУִUpdateʱֱκε⣬ϣָ

ݿJlIDֵΪ1ʼΪ1DataTableJlIDֵĬΪ0ʼΪ1пܲ⡣

ǽDataTableJlIDֵΪ1ʼΪ1ݿⱣһ£ΪJlIDֵΪ-1ʼΪ-1

ԭǣDataTable¼ȻUpdateݿʱDataTableûнDataTableиJlIDֶεֵ޸ݿ⣬JlIDֶεֵݿڽӵļ¼ӵݿ֮DataAdapterݿڽ¼DataTable޸DataTableJlIDֵܻԭ򣩡


DataAdapterκʣͨ鿴private void InitAdapter()SQL䡣
ȷԭִUpdate֮ǰöϵ㣬DataTableWatchڣŴͼΡ鿴DataTableߴSQL
Profiler ׽ִеSQL䡣



ллۣԴ˻ʣɼ
κ⣬ҲԷһ̽֡


߼ֹ֧ʦ
΢ȫ֧
---------------------------------------------------------------------------------------
ǵķʱ䣺һ9:00-18:00ڼճ⣩ǽգ48СʱṩʼӦһо⡣΢鼼֧Ϣʣhttp://support.microsoft.com/gp/newsgroupsupport/zh-cn.
ʱĶʹáظ(Reply to Group)⽫ûл
---------------------------------------------------------------------------------------
ԡ״ṩûκεͬʱҲûκȨ

飞天
04-10-2007, 12:28 PM
你好,问题已经解决。就是将起始量和增量都设为1就没有问题了。
有没有办法让TableAdapter自动生成的自增字段的起始量为默认为1?
如何一次把本帖的所有内容全部存储到本地计算机?
--
没有绝对的正确,也没有绝对的错误。


“t-qifenj@prcvap.microsoft.com”编写:

> 您好:
>
> DataAdapter的InsertCommand是先将您要添加到数据库的记录,添加到您打DataAdapter中,在您执行Update的时候更新到数据库。
>
> 现在,我们再回到您最初的问题。
>
> 您的描述是这样的:您有一张DataTable,其中有一个字段是自增的,您希望添加21条记录至您的数据库中,在执行Update的时候出现报错。如果我们有任何的误解,希望您指出。
>
> 由于数据库中JlID的值为从1开始增量为1,DataTableJlID的值默认为从0开始增量为1,所以有可能产生您的问题。
>
> 我们建议您将DataTable的JlID的值设为从1开始增量为1(和您的数据库保持一致)或者设为JlID的值设为从-1开始增量为-1。
>
> 这样做的原因是:当您在您的DataTable中添加完记录,然后调用Update更新至数据库的时候,DataTable并没有将DataTable中该JlID字段的值修改至数据库,JlID字段的值在数据库中自增长。在将您添加的记录添加到数据库中之后DataAdapter会从数据库中在将记录读回至DataTable(这就是如果您不修改DataTableJlID的值可能会产生报错的原因)。
>
>
> 如果您对于DataAdapter还有任何疑问,您可以通过查看您工程中private void InitAdapter()看到具体的SQL语句。
> 如果您想确认问题产生的原因,您可以在执行Update之前设置断点,将您DataTable的名称输入Watch窗口,点击“放大镜图形”查看到您的DataTable。或者打开SQL
> Profiler 捕捉到具体执行的SQL语句。
>
>
>
> 谢谢参与讨论,如果您对此还有疑问,您可继续发贴。
> 如果您还有任何新问题,您也可以发新贴和我们一起探讨。
>
> 纪奇峰
> 在线技术支持工程师
> 微软全球技术支持中心
> ---------------------------------------------------------------------------------------
> 我们的服务时间:周一至周五9:00-18:00(节假日除外)。我们将在两个工作日(48小时)内提供初始回应,并和您一起研究并解决问题。更多微软新闻组技术支持信息,请访问:http://support.microsoft.com/gp/newsgroupsupport/zh-cn.
> 回帖时,请在您的新闻组阅读器中使用“回复组(Reply to Group)”,这将帮助其他用户从您的提问中获益
> ---------------------------------------------------------------------------------------
> 本贴子以”现状”提供且没有任何担保,同时也没有授予任何权利。
>
>
>

t-qifenj@prcvap.microsoft.com
04-11-2007, 06:07 AM
:

ܸѾ.

ʵTableAdapterԶɵֶεʼΪĬΪ1޷ʵֵ.
ʵһΰѱȫ洢ؼ,
Ǵhttp://www.microsoft.com/China/community/ʵĻ,Ҫֹÿһ.

ллۣԴ˻ʣɼ
κ⣬ҲԷһ̽֡


߼ֹ֧ʦ
΢ȫ֧
---------------------------------------------------------------------------------------
ǵķʱ䣺һ9:00-18:00ڼճ⣩ǽգ48СʱṩʼӦһо⡣΢鼼֧Ϣʣhttp://support.microsoft.com/gp/newsgroupsupport/zh-cn.
ʱĶʹáظ(Reply to Group)⽫ûл
---------------------------------------------------------------------------------------
ԡ״ṩûκεͬʱҲûκȨ