3

私は単純なデータベースアプリケーションに以下を使用しています:

  • SQL Server Compact Edition .sdf ファイルをデータベースとして、int の主キー ID を使用。
  • データ アクセス レイヤーとして型指定された DataSet および BindingSource
  • データを表示するための DataGridView。

私の問題は、最後に挿入されたレコード/行 ID に問題があることです。ナビゲーター コンポーネントの追加ボタンを使用して datagridview に行を追加すると、新しいレコード/行の ID は -1 になります。TableAdapter.Update() を使用してデータをデータベースに保存した後でも -1 のままです。@@identity または scope_identity() を使用して別のクエリを使用して最後の ID を取得できることはわかっていますが、別のクエリを使用して手動でデータを更新する必要があるとは思えません。ここで何か不足していますか?データベースに保存し、挿入したレコードの ID を取得した後にデータを自動的に更新する方法はありますか?

また、データセット デザイナー -> テーブル アダプター構成 -> 詳細ウィンドウで "データテーブルを更新する" オプションを見ましたが、何らかの理由で無効になっています。でも関係あるのか分からない..

これについて何か助けていただければ幸いです..

4

6 に答える 6

1

両方の答えをありがとう。問題の原因を見つけましたが、残念ながら私の好みに対する解決策はありません。問題はSQLServerCompactEditionにあります。ストアドプロシージャまたはMultipleActiveResult Set(MARS)をサポートしていないため、1つのクエリで複数のSQLを実行することはできません。したがって、「データテーブルの更新」オプションは無効になります。無効にしない場合は、ID値が実際の値で更新されます。主キーIDの値をintからGuidに変更し、DataGridViewのRowInitイベントを処理して、GuidIDを新しい行に手動で指定します。

于 2009-01-02T12:02:01.343 に答える
0

ID 列をストアド プロシージャの OUTPUT パラメーターとして宣言することもできます。

CREATE PROCEDURE YourSP
(@ID int OUTPUT, ...
于 2009-01-01T19:40:00.353 に答える
0

Microsoft SQL Server Compact Edition のドキュメントでこれを見つけました。

最後に挿入された ID を返します:

SELECT @@IDENTITY または SELECT @@IDENTITY AS 'TEMPNAME'

于 2009-03-25T08:46:15.583 に答える
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
于 2009-01-01T18:00:02.630 に答える
0

新しく挿入されたレコードのキーを自動生成するためにデータベースに依存している限り、データベースを更新した後、グリッドビューで databind() を呼び出す必要があると思います。

于 2011-07-18T17:49:17.177 に答える
0

IdentitySeed と IdentityIncrement を 1 に設定すると、すべてが機能します。

于 2009-06-12T21:23:56.607 に答える