Проблеми с ID на последния вмъкнат запис при използване на въведени DataSet и DataGridView

Използвам следното за просто приложение за база данни:

  • SQL Server Compact Edition .sdf файл като база данни с int идентификатори на първичен ключ.
  • Въвели DataSet и BindingSource като слой за достъп до данни
  • DataGridView за показване на данни.

Проблемът ми е, че имам проблем с последния вмъкнат ID на запис/ред. Когато добавя ред към datagridview, използвайки бутона за добавяне на компонент на навигатор, идентификаторът на новия запис/ред е -1. Все още е -1 дори след запазване на данни в база данни с помощта на TableAdapter.Update(). Знам, че мога да получа последния идентификатор, като използвам отделна заявка с @@identity или scope_identity(), но не звучи правилно, че просто трябва да използвате друга заявка, за да актуализирате данните си, при това ръчно. Пропускам ли нещо тук? Има ли автоматичен начин за актуализиране на вашите данни след запазване в база данни и получаване на идентификатора на записа, който току-що сте вмъкнали?

Освен това видях опция „обновяване на таблицата с данни“ в дизайнера на набор от данни->конфигурация на адаптера на таблица->разширен прозорец, но тя е деактивирана по някаква причина. Но не знам дали е свързано..

Ще се радвам на всяка помощ с това..


person Community    schedule 01.01.2009    source източник


Отговори (6)


Благодаря и за двата отговора. Намерих източника на проблема, но за съжаление няма решение, което да ми хареса. Проблемът е в SQL Server Compact Edition. Тъй като не поддържа съхранени процедури или набор от множество активни резултати (MARS), не можете да изпълнявате повече от един SQL в една заявка. Следователно опцията „опресняване на таблицата с данни“ е деактивирана, което би актуализирало стойността на ID с действителна стойност, ако не е деактивирана. Ще променя стойността на ID на основния си ключ от int на Guid и ще обработвам събитието RowInit на DataGridView и ще дам ръчно Guid ID на новите редове.

person Community    schedule 02.01.2009

Това, което обикновено правя с моя 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 liner в базовия клас (използвайки корпоративната библиотека 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
person Toran Billups    schedule 01.01.2009

Можете също да опитате да декларирате вашата колона за самоличност като параметър OUTPUT във вашата съхранена процедура.

CREATE PROCEDURE YourSP
(@ID int OUTPUT, ...
person Leon Tayson    schedule 01.01.2009

Намерих това в документацията към Microsoft SQL Server Compact Edition:

връщане на последната въведена самоличност:

ИЗБЕРЕТЕ @@IDENTITY или ИЗБЕРЕТЕ @@IDENTITY КАТО „TEMPNAME“

person Community    schedule 25.03.2009

задайте IdentitySeed и IdentityIncrement на 1 и всичко работи.

person Community    schedule 12.06.2009

Мисля, че ще трябва да извикате databind() на вашия gridview, след като актуализирате базата данни, стига да зависи от базата данни за автоматично генериране на ключ за нововмъкнатия запис.

person Chains    schedule 18.07.2011