注
データセットと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、2000 年代初頭のレガシ .NET Framework テクノロジです。 このテクノロジは、ユーザーがデータを変更し、変更をデータベースに保持できるアプリケーションに特に役立ちます。 データセットは非常に成功したテクノロジであることが証明されていますが、新しい .NET アプリケーションでは Entity Framework Core 使用することをお勧めします。 Entity Framework は、オブジェクト モデルとして表形式データを操作するより自然な方法を提供し、より簡単なプログラミング インターフェイスを備えています。
この記事では、.NET Framework データセットのテーブル内のデータをクエリおよび編集する方法について説明します。 データ テーブルのデータは、データベースのテーブルを編集するのと同じように編集できます。 テーブル内のレコードを挿入、更新、および削除できます。 データ バインド フォームでは、ユーザーが編集できるフィールドを指定できます。
このような場合、データ バインディング インフラストラクチャは、変更をデータベースに送り返すことができるように、すべての変更追跡を処理します。 プログラムでデータを編集し、変更をデータベースに戻す場合は、変更の追跡を行うオブジェクトとメソッドを使用する必要があります。
実際のデータを変更するだけでなく、 DataTable に対してクエリを実行して、特定のデータ行を返すこともできます。 たとえば、個々の行、行の元のバージョンまたは提案されたバージョン、変更された行、またはエラーを含む行をクエリできます。
[前提条件]
Visual Studio を使用して .NET Framework データセットのデータのクエリと編集を行うには、次のものが必要です。
- Visual Studio にインストールされている .NET デスクトップ開発およびデータ ストレージと処理ワークロード。 詳細については、「 Visual Studio の変更」を参照してください。
- C# または Visual Basic (VB) .NET Framework プロジェクトが作成されている。
- SQL Server Express LocalDB データベースから作成されたデータセット。
データセット内の行の編集
DataTable内の既存の行を編集するには、編集するDataRowを見つけて、更新された値を目的の列に割り当てる必要があります。
編集するローのインデックスがわからない場合は、 FindBy
メソッドを使用してプライマリキーで検索します。
NorthwindDataSet.CustomersRow customersRow =
northwindDataSet1.Customers.FindByCustomerID("ALFKI");
customersRow.CompanyName = "Updated Company Name";
customersRow.City = "Seattle";
行インデックスがわかったら、それを使用して行にアクセスして編集できます。
northwindDataSet1.Customers[4].CompanyName = "Updated Company Name";
northwindDataSet1.Customers[4].City = "Seattle";
データセットへの新しい行の挿入
データ バインド コントロールを使用するアプリケーションでは、通常、BindingNavigator コントロールの [新規追加] ボタンを使用して新しいレコードを追加します。
また、NewRowで DataTable
メソッドを呼び出して、データセットに新しいレコードを追加することもできます。 次に、行を DataRow コレクションに追加します (Rows)。
NorthwindDataSet.CustomersRow newCustomersRow =
northwindDataSet1.Customers.NewCustomersRow();
newCustomersRow.CustomerID = "ALFKI";
newCustomersRow.CompanyName = "Alfreds Futterkiste";
northwindDataSet1.Customers.Rows.Add(newCustomersRow);
データ テーブルからのレコードの削除
DataRowを削除するには、Remove の DataRowCollection メソッドを呼び出すか、Delete オブジェクトの DataRow メソッドを呼び出します。
Remove メソッドは、コレクションから行を削除します。 アプリケーションが更新をデータ ソースに送り返す必要がない場合は、 Remove を使用してデータ行コレクションに直接アクセスしてレコードを削除できます。
逆に、 Delete メソッドは実際には DataRowを削除しませんが、削除のマークを付けます。 実際の削除は、メソッドを呼び出すときに行われます AcceptChanges 。 実際に削除する前に、削除対象としてマークされている行をプログラムで確認することができます。
データセットがデータ ソースに更新を送信するために必要な情報を保持するには、 Delete メソッドを使用してデータ テーブルから DataRow を削除します。 アプリケーションで TableAdapter
または DataAdapterを使用している場合、 Update
メソッドは RowState
が Deleted
のローを削除します。
次の例は、 Delete メソッドを呼び出して、 Customers
テーブルの最初の行を削除済みとしてマークする方法を示しています。
注
DataRowCollectionの count プロパティを取得した場合、結果のカウントには、削除対象としてマークされたレコードが含まれます。 削除対象としてマークされていないレコードの正確な数を取得するには、コレクションをループして、各レコードの RowState プロパティを確認します。 削除対象としてマークされたレコードには、RowState のDeletedが付けられます。 または、行の状態に基づいてフィルター処理するデータセットのデータ ビューを作成し、そこから count プロパティを取得することもできます。
変更された行があるかどうかを判断する
データセット内のレコードに変更を加えると、その変更に関する情報はコミットするまで保存されます。 データセットまたはデータ テーブルの AcceptChanges
メソッドを呼び出すとき、または Update
またはデータ アダプターの TableAdapter
メソッドを呼び出すときに、変更をコミットします。
変更は、各データ行で次の 2 つの方法で追跡されます。
各データ行には、その RowStateに関連する情報 ( Added、 Modified、 Deleted、 Unchangedなど) が含まれています。
変更された各データ行には、複数のバージョンが含まれています。 DataRowVersionには、変更前の元のバージョンと変更後の現在のバージョンが含まれます。 変更が保留中で、 RowChanging イベントに応答できる間は、3 番目の提案されたバージョンも使用できます。
変更された行を確認するには、データセットの HasChanges メソッドを呼び出します。 このメソッドは、データセットに変更が加えられた場合 true
を返します。 変更が存在することを確認したら、GetChanges
またはDataSetの DataTable メソッドを呼び出して、変更された行のセットを返すことができます。
次の例は、 HasChanges メソッドからの戻り値を確認して、 NorthwindDataset1
に変更された行があるかどうかを検出する方法を示しています。
if (northwindDataSet1.HasChanges())
{
// Changed rows were detected, add appropriate code.
}
else
{
// No changed rows were detected, add appropriate code.
}
変更の種類を特定する
データセットで行われた変更の種類を確認するには、 DataRowState 列挙体の値を HasChanges メソッドに渡します。
次の例は、 NorthwindDataset1
データセットをチェックして、新しい行が追加されたかどうかを確認する方法を示しています。
if (northwindDataSet1.HasChanges(DataRowState.Added))
{
// New rows have been added to the dataset, add appropriate code.
}
else
{
// No new rows have been added to the dataset, add appropriate code.
}
エラーのある行を見つける
個々の列とデータ行を操作すると、エラーが発生する可能性があります。
HasErrors
プロパティを確認して、DataSet、DataTable、またはDataRowにエラーが存在するかどうかを判断できます。
データセットの HasErrors
プロパティが true
の場合は、テーブルのコレクションを反復処理し、次に行を反復処理して、エラーのある行を見つけます。
private void FindErrors()
{
if (dataSet1.HasErrors)
{
foreach (DataTable table in dataSet1.Tables)
{
if (table.HasErrors)
{
foreach (DataRow row in table.Rows)
{
if (row.HasErrors)
{
// Process error here.
}
}
}
}
}
}