最后使用类型化DataSet和DataGridView插入记录ID问题

时间:2009-01-01 17:24:35

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

我正在使用以下用于简单的数据库应用程序:

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

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

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

我很感激任何帮助...

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我通常使用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个班轮所做的事情(使用企业库fyi)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

返回最后插入的标识:

SELECT @@ IDENTITY 要么 选择@@ IDENTITY作为'TEMPNAME'

答案 4 :(得分:0)

将Identity Seed和Identity Increment设置为1,一切正常。

答案 5 :(得分:0)

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