テーブルの各行は、一意の値を有することを確実にするために、データテーブルの列が自動インクリメントの主キーに設定することができます。ただし、アプリケーションが複数のクライアントを持つことができ、各クライアントは、単一のDataTableのインスタンスを使用することができます。この場合、最終的な重複する値は、個々のデータテーブルインスタンス間で起こり得ます。すべてのクライアントが単一のデータソースを使用しているので、あなたはこの競合を解決するように、データ・ソース定義の自動インクリメント値を作ることができます。これを達成するためには、「ID」フィールドまたはMicrosoft Access「オートID」フィールドに、Microsoft SQL Serverを使用します。
データ・ソースがデータセット「ID」または「オートID」欄に新しい行を埋めるに追加された場合、データソースのデータセットとの間に直接的な接続が存在しないので、唯一の状況は、発生します。したがって、データセットは、任意の値が自動的にデータソースによって生成された認識されません。しかしながら、(Microsoft SQL Serverなど)、ストアドプロシージャデータソースの出力パラメータを使用して作成することができる値(例えば、新しいID値)のために、自動的に出力パラメータとの値マップデータアダプターデータセットバックを使用して生成することができます対応する列。
これは、出力パラメータでストアドプロシージャのソースデータをサポートしないかもしれません。この場合、イベントは自動的に生成され、更新されたデータセットの行または列に挿入RowUpdated値を取得するために使用されてもよいです。このセクションでは、RowUpdated挿入が起こったかどうかを決定するためにイベントにコードを追加する方法のMicrosoft Access 2000以降でJet 4.0のOLE DBプロバイダを使用したときに表示されるサンプルを、含み、次いで自動生成の値を取得します現在の更新の行に保管してください。
次のストアドプロシージャとコード例を示して自動的にMicrosoft SQL ServerテーブルからID値をインクリメントする方法バックデータセットテーブルに追加された行に対応する列にマップ。このストアドプロシージャは、新しい行のNorthwindカテゴリテーブル識別データベースを挿入し、出力パラメータの形式でSCOPE_IDENTITY()から返された値を返すことができます。
PROCEDURE InsertCategory作成
@CategoryName NCHAR(15)、
@Identity OUT値int
AS
INSERTカテゴリ(カテゴリ名)VALUES(@CategoryName)INTO
SET @Identity SCOPE_IDENTITY =()
次にInsertCategory DataAdapter.InsertCommandをソースとして指定されたプロシージャを格納することができます。識別出力パラメータを受信するために、パラメータを作成します。このパラメータは、方向ParameterDirection.Outputを持っており、DataSetの区分と、SourceColumnローカルCategoriesテーブルの列として指定されました。識別値が、この出力パラメータを返すために追加として処理InsertCommandは行の後に、自動的に、現在の行の次に配置区分列を増加させるであろう。
コードの値を返す出力パラメータの形で元のデータセット区分欄に自動的にインクリメントされた値を割り当てる方法を次の例が示します。
[Visual Basicの]
薄暗いnwindConnとしてSqlConnectionオブジェクト=新しいSqlConnectionオブジェクト( "データソース= localhostの;統合セキュリティ= SSPI; = Northwindの初期カタログ")
薄暗いcatDAとしてSqlDataAdapterオブジェクト=新しいSqlDataAdapterオブジェクト( "SELECT区分コード、カテゴリ区分名"、nwindConn)
catDA.InsertCommand =新しいSqlCommandオブジェクト( "InsertCategory"、nwindConn)
catDA.InsertCommand.CommandType = CommandType.StoredProcedure
catDA.InsertCommand.Parameters.Add( "区分名@"、SqlDbType.NChar、15、 "カテゴリ名")
薄暗いMYPARMとしてSqlParameter = catDA.InsertCommand.Parameters.Add(、SqlDbType.Int、0 "アイデンティティ@"、 "区分")
myParm.Direction = ParameterDirection.Output
nwindConn.Open()
薄暗いcatDSとしてのDataSet =新しいデータセット
catDA.Fill(catDS、 "カテゴリー")
薄暗いnewRowとしてのDataRow = catDS.Tables( "カテゴリー")。NewRow()
newRow( "区分名")= "新しいカテゴリ"
catDS.Tables( "カテゴリー")。Rows.Add(newRow)
catDA.Update(catDS、 "カテゴリー")
nwindConn.Close()
[C#]
SqlConnectionのnwindConn =新しいSqlConnectionオブジェクト( "localhostのデータソース=;統合セキュリティ= SSPI;初期カタログ= Northwindの");
SqlDataAdapterオブジェクトcatDA =新しいSqlDataAdapterオブジェクト( "SELECT区分コード、カテゴリ区分名"、nwindConn)。
catDA.InsertCommand =新しいSqlCommandオブジェクト( "InsertCategory"、nwindConn)。
catDA.InsertCommand.CommandType = CommandType.StoredProcedure;
catDA.InsertCommand.Parameters.Add(、SqlDbType.NChar、15 "区分名@"、 "区分名");
SqlParameter MYPARM = catDA.InsertCommand.Parameters.Add( "アイデンティティ@"、SqlDbType.Int、0、 "区分");
myParm.Direction = ParameterDirection.Output。
nwindConn.Open();
DataSetのcatDS =新しいデータセット();
catDA.Fill(catDS、 "カテゴリー");
DataRow newRow = catDS.Tables [ "カテゴリ"] NewRow()。
newRow [ "区分名"] = "新しいカテゴリ";
catDS.Tables [ "カテゴリー"] Rows.Add(newRow)。
catDA.Update(catDS、 "カテゴリー");
nwindConn.Close();
Microsoft Accessのストアドプロシージャまたはバッチコマンド処理をサポートしていないが、出力パラメータは、図1の実施形態におけるソースリストにマッピングすることができません。ただし、Microsoft Access 2000の以降をサポート@@ IDENTITYプロパティは、「挿入」(INSERT)で「自動番号」フィールドの値を取得します。使用RowUpdatedイベント、最新の@@ IDENTITY値を取得し、「挿入」(INSERT)が発生したか否かを判断することができ、値がローカルのDataSetのテーブルにID列に配置されます。
次のサンプルコードを示してどのように新たな価値カテゴリーテーブルのMicrosoft Access 2000のNorthwindデータベースを挿入します。記録カテゴリテーブルに挿入されたときのサンプル値は、RowUpdatedイベントJetデータベースエンジンを移入するために使用され、生成されたアクセス「自動番号」。これが唯一のJet 4.0 OLE DBプロバイダおよびMicrosoft Access 2000以降に適用されることに注意してください。
[Visual Basicの]
輸入システム
輸入System.Data
System.Data.OleDbの輸入
輸入Microsoft.VisualBasic
パブリッククラスサンプル
共有nwindConnとしてOleDbConnectionオブジェクト=新しいOleDbConnectionオブジェクト( "プロバイダ= Microsoft.Jet.OLEDB.4.0;" &_
"データソース= C:/プログラムファイル/ Microsoft Officeの/オフィス/サンプル/ Northwind.mdbを;")
公共の共有サブメイン()
「DataSetを記入し、更新するためのDataAdapterを使用してください。
薄暗いcatDAとしてOleDbDataAdapterおよ=新OleDbDataAdapterおよ( "SELECT区分コード、区分名カテゴリーORDER BY区分FROM"、nwindConn)
catDA.InsertCommand =新規のOleDbCommand( "INSERT INTOカテゴリ(カテゴリ名)の値(?)"、nwindConn)
catDA.InsertCommand.CommandType = CommandType.Text
catDA.InsertCommand.Parameters.Add( "区分名@"、OleDbType.Char、15、 "カテゴリ名")
nwindConn.Open()
"DataSetを入力します。
薄暗いcatDSとしてのDataSet =新しいデータセット
catDA.Fill(catDS、 "カテゴリー")
「新しい行を追加します。
薄暗いnewRowとしてのDataRow = catDS.Tables( "カテゴリー")。NewRow()
newRow( "区分名")= "新しいカテゴリ"
catDS.Tables( "カテゴリー")。Rows.Add(newRow)
「オートナンバー型値を記入するイベントを含めます。
AddHandlerはcatDA.RowUpdated、新OleDbRowUpdatedEventHandler(のAddressOf OnRowUpdated)
「DataSetを更新します。
catDA.Update(catDS、 "カテゴリー")
nwindConn.Close()
End Subの
プライベート共有サブOnRowUpdated(オブジェクトとして送信者、OleDbRowUpdatedEventArgsとして引数)
"AccessデータベースからID値を取得する変数やコマンドを含めます。
薄暗いNEWIDとして整数= 0
薄暗いidCMDとしてのOleDbCommand =新規のOleDbCommand( "@@ IDENTITYを選択"、nwindConn)
args.StatementType = StatementType.Insert場合は
「ID値を取得し、区分欄に格納します。
NEWID = CInt関数(idCMD.ExecuteScalar())
args.Row( "区分")はNEWID =
END IF
End Subの
エンドクラスの
[C#]
システムを使用して、
System.Dataを使用しました。
System.Data.OleDbを使用しました。
パブリッククラスサンプル
{
静的OleDbConnectionオブジェクトnwindConn =新しいOleDbConnectionオブジェクト( "プロバイダ= Microsoft.Jet.OLEDB.4.0;" +
@ "データソース= C:/プログラムファイル/ Microsoft Officeの/オフィス/サンプル/ Northwind.mdbを;");
公共の静的な無効メイン()
{
DataSetを記入し、更新する//使用データアダプター。
OleDbDataAdapterおよcatDA =新OleDbDataAdapterおよ( "SELECTカテゴリーORDER BY区分FROM区分、区分名"、nwindConn)。
catDA.InsertCommand =新しいのOleDbCommand( "INSERT INTOカテゴリ(カテゴリ名)値()?"、nwindConn)。
catDA.InsertCommand.CommandType = CommandType.Text。
catDA.InsertCommand.Parameters.Add(、OleDbType.Char、15 "区分名@"、 "区分名");
nwindConn.Open();
// DataSetを入力します。
DataSetのcatDS =新しいデータセット();
catDA.Fill(catDS、 "カテゴリー");
//新しい行を追加します。
DataRow newRow = catDS.Tables [ "カテゴリ"] NewRow()。
newRow [ "区分名"] = "新しいカテゴリ";
catDS.Tables [ "カテゴリー"] Rows.Add(newRow)。
//オートナンバー型の値を記入するイベントを含めます。
catDA.RowUpdated + =新しいOleDbRowUpdatedEventHandler(OnRowUpdated)。
//は、DataSetを更新します。
catDA.Update(catDS、 "カテゴリー");
nwindConn.Close();
}
保護された静的な無効OnRowUpdated(オブジェクト送信者、OleDbRowUpdatedEventArgsの引数)
{
// AccessデータベースからID値を取得する変数やコマンドを含めます。
int型NEWID = 0;
OleDbCommandをidCMD =新しいのOleDbCommand( "@@ IDENTITYを選択"、nwindConn)。
(args.StatementType == StatementType.Insert)があれば
{
// ID値を取得し、区分欄に格納します。
NEWID =(INT)idCMD.ExecuteScalar();
args.Row [ "区分"] = NEWID。
}
}
}