都说 DATASET 相当于 离线数据库 ,为何 ACCESS 中的 自动编号列 填充到 DATASET 里, 新增记录 中却是 空 呢?因为我马上就要使用这个值,为空的话肯定是不行的。虽然有三个属性(AutoIncrement,AutoIncrementSeed,AutoIncrementStep)可以设置 Columns 为自动递增,设置起始值,步长值可以用。但是,我们在更新数据库的时候,自动编号列不是应该保持为空吗?还是新增记录的时候应该抛弃 离线 的做法?如果是多用户操作,我想离线新增确实是不安全的,但是对于单用户操作来说,应该不会有问题吧?

解决方案 »

  1.   

    不需要insert
    OleDbConnection   conn   =   new   OleDbConnection( "连接字符串 "); 
    OleDbCommand   comm   =   new   OleDbCommand( "SELECT   @@IDENTITY ",conn); 
      

  2.   


    利用“SELECT @@IDENTITY”命令可以得到数据库中新建记录时的自动编号
      

  3.   


    两位老大,这好像不是ACCESS里有的东西吧~~~
      

  4.   

    DataAdapter 的 Fill 方法仅使用数据源中的表列和表行来填充 DataSet;虽然约束通常由数据源来设置,但在默认情况下,Fill 方法不会将此架构信息添加到 DataSet 中。若要使用数据源中的现有主键约束信息填充 DataSet,则可以调用 DataAdapter 的 FillSchema 方法,或者在调用 Fill 之前将 DataAdapter 的 MissingSchemaAction 属性设置为 AddWithKey。这将确保 DataSet 中的主键约束反映数据源中的主键约束。外键约束信息不包含在内,将需要显式创建,如将约束添加到表所示。如果在使用数据填充 DataSet 之前向其中添加架构信息,将确保将主键约束与 DataSet 的 DataTable 对象包含在一起。这样,当再次调用 Fill 来填充 DataSet 时,将使用主键列信息来匹配数据源中的新行和每个 DataTable 中的当前行,并且使用数据源中的数据改写表中的当前数据。如果没有架构信息,来自数据源的新行将追加到 DataSet,从而导致重复的行。注意 如果数据源中的某列被标识为自动递增列,则 MissingSchemaAction 为 AddWithKey 的 FillSchema 方法或 Fill 方法将创建一个 AutoIncrement 属性设置为 true 的 DataColumn。不过,您将需要手动设置 AutoIncrementStep 和 AutoIncrementSeed 值。有关自动递增列的更多信息,请参阅创建 AutoIncrement 列。 
    当使用 FillSchema 或将 MissingSchemaAction 设置为 AddWithKey 时,将需要在数据源中进行额外的处理来确定主键列信息。这一额外的处理可能会降低性能。如果主键信息在设计时已知,为了实现最佳性能,建议显式指定一个或多个主键列。有关为表显式设置主键信息的信息,请参阅为表定义主键。以下代码示例显示如何使用 FillSchema 向 DataSet 添加架构信息。[Visual Basic]
    Dim custDS As DataSet = New DataSet()custDA.FillSchema(custDS, SchemaType.Source, "Customers")
    custDA.Fill(custDS, "Customers")[C#]
    DataSet custDS = new DataSet();custDA.FillSchema(custDS, SchemaType.Source, "Customers");
    custDA.Fill(custDS, "Customers");以下代码示例显示如何使用 Fill 方法的 MissingSchemaAction.AddWithKey 属性向 DataSet 添加架构信息。[Visual Basic]
    Dim custDS As DataSet = New DataSet()custDA.MissingSchemaAction = MissingSchemaAction.AddWithKey
    custDA.Fill(custDS, "Customers")[C#]
    DataSet custDS = new DataSet();custDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    custDA.Fill(custDS, "Customers");
      

  5.   

    另外再补充一点我的理解:
    DATASET保存的数据库副本,在未更新到数据库上的时候,保存了这些东西
    1、数据库架构信息
    2、副本1:原本通过SELECT从数据库读来的数据,未经修改
    3、副本2:副本1的基础上,修改之后的数据,有新增的,修改的,删除的。并且每一条记录都有一个属性来说明这条记录有没有被修改,是不是新增的,有没有被删除。在更新数据库的时候,DataAdapter会用UPDATE,DELETE,INSERT这三个命令把标记号的记录一条一条地更新到数据库里。比如说,有三条打了 新增 标记的记录,则更新的时候就会用 INSERT 命令把这三条记录全部记录到数据库中。另外,由于有 自增列 这种情况,我猜测这些操作标记一定还有一个先后顺序的记录,因为在数据库中插入记录时 自增列 是跟顺序有关的。
      

  6.   

    @@IDENTITY 有人说过在ACCESS中一样可以使用, 效果和SQL一致.
      

  7.   

    但是 @@IDENTITY 要插入之后才能得到啊,我可不可以在插入之前就预先得到这个值呢~