【问题标题】:Last inserted record ID problems using typed DataSet and DataGridView使用类型化 DataSet 和 DataGridView 的最后插入记录 ID 问题
【发布时间】:2009-01-01 17:24:34
【问题描述】:

我将以下内容用于一个简单的数据库应用程序:

  • SQL Server Compact Edition .sdf 文件作为数据库,具有 int 主键 ID。
  • 类型化 DataSet 和 BindingSource 作为数据访问层
  • DataGridView 用于显示数据。

我的问题是,最后插入的记录/行 ID 有问题。当我使用导航器组件的追加按钮向 datagridview 添加一行时,新记录/行的 ID 为-1。即使使用 TableAdapter.Update() 将数据保存到数据库后,它仍然是 -1。我知道我可以使用带有 @@identity 或 scope_identity() 的单独查询来获取最后一个 ID,但您只是 必须 使用另一个查询来手动更新您的数据听起来并不正确。我在这里错过了什么吗?在保存到数据库并获取您刚刚插入的记录的 ID 后,是否有自动更新数据的方法?

另外,我在数据集设计器->表适配器配置->高级窗口中看到了一个“刷新数据表”选项,但由于某种原因它被禁用了。但是不知道有没有关系。。

如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: sql-server-ce strongly-typed-dataset tableadapter lastinsertid


    【解决方案1】:

    感谢您的两个答案。我找到了问题的根源,不幸的是没有我喜欢的解决方案。问题出在 SQL Server Compact Edition 中。由于它不支持存储过程或多活动结果集 (MARS),因此您不能在一个查询中运行多个 SQL。因此“刷新数据表”选项被禁用,如果它没有被禁用,它将用实际值更新 ID 值。我要将我的主键 ID 值从 int 更改为 Guid 并处理 DataGridView 的 RowInit 事件并手动为新行提供 Guid ID。

    【讨论】:

      【解决方案2】:

      我通常用我的 DTO 做的事情类似于下面的 vb

      Public Sub InsertSupplier(ByVal SupplierObject As Supplier) Implements ISupplierRepository.InsertSupplier
      SupplierObject.SupplierID = MyBase.ExecuteNonQueryWithReturnValue("usp_Northwind_InsertSupplier", SupplierObject.CompanyName)
      End Sub
      

      用我的类似于下面的存储过程

      USE [Northwind]
      GO
      /****** Object:  StoredProcedure [dbo].[usp_Northwind_InsertSupplier]    Script Date: 1/1/2009 10:59:01 AM ******/
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      CREATE PROCEDURE [dbo].[usp_Northwind_InsertSupplier]
      @CompanyName nvarchar(40)
      AS
      INSERT INTO dbo.Suppliers
      VALUES (@CompanyName)
      
      RETURN @@Identity
      

      只是为了澄清我在基类中的 1 班轮做了什么(使用企业库仅供参考)

      Public Function ExecuteNonQueryWithReturnValue(ByVal storedProcedureName As String, ByVal ParamArray parameterValues() As Object) As Object Implements Interfaces.IRepository(Of T).ExecuteNonQueryWithReturnValue
          Dim Output As Object
          Dim db As Database = DatabaseFactory.CreateDatabase()
          Dim dbCommand As Common.DbCommand = db.GetStoredProcCommand(storedProcedureName, parameterValues)
          db.ExecuteNonQuery(dbCommand)
          Output = CType(db.GetParameterValue(dbCommand, "@RETURN_VALUE"), Object)
        Return Output
      End Function
      

      【讨论】:

        【解决方案3】:

        您还可以尝试在存储过程中将标识列声明为 OUTPUT 参数。

        CREATE PROCEDURE YourSP
        (@ID int OUTPUT, ...
        

        【讨论】:

          【解决方案4】:

          我在 Microsoft SQL Server Compact Edition 的文档中找到了这个:

          返回最后插入的身份:

          选择@@IDENTITY 或者 选择 @@IDENTITY 作为“TEMPNAME”

          【讨论】:

            【解决方案5】:

            将 IdentitySeed 和 IdentityIncrement 设置为 1,一切正常。

            【讨论】:

              【解决方案6】:

              我认为在更新数据库后,您必须在 gridview 上调用 databind(),只要您依赖数据库为新插入的记录自动生成密钥。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-06-14
                • 2018-11-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-01
                • 2015-06-24
                相关资源
                最近更新 更多