中国开发网: 论坛: 程序员情感CBD: 贴子 89124
pcplayer: 你的说法和MSDN一样,用存储过程。但我现在的问题是没法把数据插进去。可能我需要改DataSet,在DataSet里不包括这个字段看看。
如果来自数据源的表包含自动递增列,则可以使用由数据源生成的值填充 DataSet 中的列,方法是通过以存储过程输出参数的形式返回自动递增值并将其映射到表中的一列,或者使用 DataAdapter 的 RowUpdated 事件。有关示例,请参见检索“标识”或“自动编号”值。

但是,DataSet 中的值可能会与数据源中的值不同步并导致意外的行为。例如,请考虑一个包含自动递增主键列 CustomerID 的表。如果在该 DataSet 中添加两个新客户,它们将收到自动递增的 CustomerId 值 1 和 2。在向 DataAdapter 的 Update 方法传递第二个客户行时,新添加的行会收到数据源中的自动递增 CustomerID 值 1,该值与 DataSet 中的值 2 不匹配。当 DataAdapter 使用返回值填充 DataSet 中的行时,由于第一个客户行的 CustomerID 已经是 1,因此将发生约束冲突。

为了避免这种行为,建议在使用数据源中的自动递增列和 DataSet 中的自动递增列时,在 DataSet 中创建 AutoIncrementStep 为 -1 且 AutoIncrementSeed 为 0 的列,并确保数据源生成从 1 开始并以正步长值递增的自动递增标识值。这样,DataSet 将为自动递增值生成负数,这些负数不会与数据源所生成的正自动递增值发生冲突。另一种方法是使用 Guid 类型的列而不是自动递增列。生成 Guid 值的算法在 DataSet 中生成的 Guid 从不会与数据源生成的 Guid 相同。有关定义 DataTable 中的列的更多信息,请参见定义 DataTable 的架构。

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录