Visual C# 2005 または Visual C# .NET を使用して DataSet オブジェクトからデータベースを更新する方法

Microsoft Visual Basic .NET については、次の資料を参照してください。301248
Microsoft Visual C++ .NET については、次の資料を参照してください。815660

この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。

  • System.Data
  • System.Data.SqlClient

概要

この資料では、(データベースから読み込まれる) データを保持するデータセットを取得し、そのデータを変更後、データベースに戻して元のソースを更新する方法について、手順を追って説明します。



Microsoft .NET Framework におけるデータ アクセスの主要な部分を担う DataSet オブジェクトは、テーブル、ビュー、およびリレーションシップを保持できるメモリ内オブジェクトです。

必要条件

推奨する必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack の概要は、次のとおりです。

  • Microsoft Windows Server 2003、Microsoft Windows 2000 Professional、Microsoft Windows 2000 Server、Microsoft Windows 2000 Advanced Server、または Microsoft Windows NT 4.0 Server
  • PUBS サンプル データベースがインストールされている Microsoft SQL Server 7.0、Microsoft SQL Server 2000、または Microsoft Data Engine (MSDE)
  • Microsoft Visual Studio 2005 または Microsoft Visual Studio .NET
この資料は、次のトピックについて詳しい知識のあるユーザーを対象としています。

  • データベースの用語

  • SQL (Structured Query Language)

DataSet オブジェクトからデータベースを更新する方法

ここでは、DataSet オブジェクトを使用して、データベースのデータを更新する方法を説明しています。SqlCommand オブジェクトを使用して、直接、データベースにデータを挿入、更新および削除できることも重要です。



この資料の理解を深めるために、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックして参照してください。

314145 Visual C# .NET を使用してデータベースから DataSet オブジェクトにデータを設定する方法

トピックの一部は 314145 で取り上げられています。この資料では、データベースからデータセットにデータを取得する方法と、データセットをデータベースから切り離して分離する方法が示されています。



データがデータセットに読み込まれた後は、そのデータを変更できます。データセットでは変更が追跡されます。DataSet オブジェクトはデータベースから取得されたデータのメモリ内キャッシュと考えることができ、テーブル、リレーションシップおよび制約のコレクションから構成されます。



データセットを更新して、更新したものをデータベースに戻すには、次の手順を実行します。

  1. Visual Studio 2005 または Visual Studio .NET を起動します。

  2. Visual C# で新しいコンソール アプリケーションを作成します。デフォルトで静的クラスと空の Main() プロシージャが作成されます。

  3. プロジェクトに System および System.Data 名前空間への参照が含まれていることを確認します。System、System.Data、および System.Data.SqlClient 名前空間に using ステートメントを使用して、後続のコードでこれらの名前空間を使用して宣言を修飾する必要がないようにします。これらのステートメントは他の宣言を行う前に使用する必要があります。

    using System;
    using System.Data;
    using System.Data.SqlClient;
  4. 314145 Visual C# .NET を使用してデータベースから DataSet オブジェクトにデータを設定する方法



    次のコードの接続文字列は、ローカル コンピュータ (またはコードを実行しているコンピュータ) に存在する SQL Server を指しています。動作を要約すると、接続が作成されると、データ アダプタが作成され、そのデータ アダプタを使用して、データセットにデータを設定します。


    : このコードを実行する前に、User ID =<username> および Password =<strong password> を正しい値に変更する必要があります。User ID に、データベースでこの操作を実行するための適切なアクセス許可があることを確認してください。

    string sConnectionString;

    // Modify the following string to correctly connect to your SQL Server.
    sConnectionString = "Password=<strong password>;User ID=<username>;"
    + "Initial Catalog=pubs;"
    + "Data Source=(local)";

    SqlConnection objConn
    = new SqlConnection(sConnectionString);
    objConn.Open();

    // Create an instance of a DataAdapter.
    SqlDataAdapter daAuthors
    = new SqlDataAdapter("Select * From Authors", objConn);

    // Create an instance of a DataSet, and retrieve data from the Authors table.
    DataSet dsPubs = new DataSet("Pubs");
    daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");
    daAuthors.Fill(dsPubs,"Authors");
  5. これでデータが読み込まれ、データは変更可能になります。行 (またはレコード) を追加するには多くの方法があります。このコードのサンプルでは以下の 3 つの手順を使用します。

    • DataTable から新しい DataRow オブジェクトを取得します。

    • 必要に応じて、DataRow フィールド値を設定します。

    • DataTable.Rows コレクションの Add メソッドに新しいオブジェクトを渡します。

    手順 4. のコードの後に、次のコードを貼り付けます。

    //****************
    // BEGIN ADD CODE
    // Create a new instance of a DataTable.
    DataTable tblAuthors;
    tblAuthors = dsPubs.Tables["Authors"];

    DataRow drCurrent;
    // Obtain a new DataRow object from the DataTable.
    drCurrent = tblAuthors.NewRow();

    // Set the DataRow field values as necessary.
    drCurrent["au_id"] = "993-21-3427";
    drCurrent["au_fname"] = "George";
    drCurrent["au_lname"] = "Johnson";
    drCurrent["phone"] = "800 226-0752";
    drCurrent["address"] = "1956 Arlington Pl.";
    drCurrent["city"] = "Winnipeg";
    drCurrent["state"] = "MB";
    drCurrent["contract"] = 1;

    // Pass that new object into the Add method of the DataTable.
    tblAuthors.Rows.Add(drCurrent);
    Console.WriteLine("Add was successful, Click any key to continue!!");
    Console.ReadLine();

    // END ADD CODE
  6. 既存の行を編集するには、適切な DataRow オブジェクトを取得して、1 つ以上の列に新しい値を指定します。最初に、適切な行を検索する必要があります。データ (手順 4. の FillSchema の呼び出し) だけでなく、テーブルのスキーマも同時に読み込まれているため、実行する処理はさらに簡単になります。スキーマを適切に使用すると、テーブルはどの列が主キーであるかを識別し、それによって Rows コレクションの Find メソッドが有効になります。



    Find メソッドはその主キー (この場合、au_id) にある特定の値を持つ DataRow オブジェクトを返します。その DataRow が存在する場合は、列を変更できます。BeginEdit と EndEdit で変更を囲むことによって、データセットが実行する必要のある作業が単純化され、EndEdit を呼び出すときに、その作業の有効性のチェックを一度に行うことができます。なお、BeginEdit と EndEdit によって変更を囲むことは必須ではありません。追加コードの後に次のコードを貼り付けます。

    //*****************
    // BEGIN EDIT CODE

    drCurrent = tblAuthors.Rows.Find("213-46-8915");
    drCurrent.BeginEdit();
    drCurrent["phone"] = "342" + drCurrent["phone"].ToString().Substring(3);
    drCurrent.EndEdit();
    Console.WriteLine("Record edited successfully, Click any key to continue!!");
    Console.ReadLine();

    // END EDIT CODE
  7. 行ったすべての変更を使用して元のデータベースを更新するには、DataAdapter オブジェクトの Update メソッドにデータセットを渡します。



    ただし、Update を呼び出す前に、DataAdapter オブジェクトの InsertCommand、UpdateCommand および DeleteCommand プロパティを設定する必要があります。SQL を手入力で記述して、対応する SqlCommand オブジェクトでこれら 3 つのプロパティを設定できますが、Visual Studio .NET を使用して、これら 3 つのコマンドを自動的に生成することもできます。



    必要に応じて必要なコマンドを生成するには、SqlCommandBuilder オブジェクトのインスタンスを作成して、コンストラクタで DataAdapter を使用します。次のコードのサンプルで示されているこのメソッドを使用する場合、テーブルが使用できる主キー情報を持っている必要があります。主キー情報にアクセスするには、FillSchema を呼び出して、DataAdapter の MissingSchemaAction プロパティを AddWithKey に設定するか、またはコードで主キーを手入力で設定します。編集コードの後に次のコードを貼り付けます。

    //*****************
    // BEGIN SEND CHANGES TO SQL SERVER

    SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(daAuthors);
    daAuthors.Update(dsPubs, "Authors");
    Console.WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
    Console.ReadLine();

    // END SEND CHANGES TO SQL SERVER
  8. 行を完全に削除するには、DataRow オブジェクトの Delete メソッドを使用します。Rows コレクションには Remove と RemoveAt の 2 つのメソッドが含まれていることに注意してください。この 2 つのメソッドを使用すると行を削除できるように思えますが、実際には単にコレクションから行を削除します。削除結果を元のデータベースに反映するのは、Delete メソッドのみです。変更を SQL Server に送信するコードの後に次のコードを貼り付けます。

    //*****************
    //BEGIN DELETE CODE

    drCurrent = tblAuthors.Rows.Find("993-21-3427");
    drCurrent.Delete();
    Console.WriteLine("Record deleted successfully, Click any key to continue!!");
    Console.ReadLine();

    //END DELETE CODE
  9. SQL Server に変更を送信して、以前に追加したレコードを削除します。削除コードの後に次のコードを貼り付けます。

    //*****************
    // CLEAN UP SQL SERVER
    daAuthors.Update(dsPubs, "Authors");
    Console.WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
    Console.ReadLine();
  10. プロジェクトを保存します。

  11. [デバッグ] メニューの [開始] (または [デバッグ開始]) をクリックして、プロジェクトを実行します。メッセージ ボックスがいくつか表示されて、コードの進行状況が示されます。また、コードの進行に合わせたデータの現在の状態も確認できます。

完全なコード リスト

using System;
using System.Data;
using System.Data.SqlClient;

namespace PopulateDataSet
{

/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{
string sConnectionString;

// Modify the following string to correctly connect to your SQL Server.
sConnectionString = "Password=;User ID=sa;"
+ "Initial Catalog=pubs;"
+ "Data Source=(local)";

SqlConnection objConn
= new SqlConnection(sConnectionString);
objConn.Open();

// Create an instance of a DataAdapter.
SqlDataAdapter daAuthors
= new SqlDataAdapter("Select * From Authors", objConn);

// Create an instance of a DataSet, and retrieve
// data from the Authors table.
DataSet dsPubs = new DataSet("Pubs");
daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");
daAuthors.Fill(dsPubs,"Authors");
//****************
// BEGIN ADD CODE
// Create a new instance of a DataTable.
DataTable tblAuthors;
tblAuthors = dsPubs.Tables["Authors"];

DataRow drCurrent;
// Obtain a new DataRow object from the DataTable.
drCurrent = tblAuthors.NewRow();

// Set the DataRow field values as necessary.
drCurrent["au_id"] = "993-21-3427";
drCurrent["au_fname"] = "George";
drCurrent["au_lname"] = "Johnson";
drCurrent["phone"] = "800 226-0752";
drCurrent["address"] = "1956 Arlington Pl.";
drCurrent["city"] = "Winnipeg";
drCurrent["state"] = "MB";
drCurrent["contract"] = 1;

// Pass that new object into the Add method of the DataTable.
tblAuthors.Rows.Add(drCurrent);
Console.WriteLine("Add was successful, Click any key to continue!!");
Console.ReadLine();

// END ADD CODE
//*****************
// BEGIN EDIT CODE

drCurrent = tblAuthors.Rows.Find("213-46-8915");
drCurrent.BeginEdit();
drCurrent["phone"] = "342" + drCurrent["phone"].ToString().Substring(3);
drCurrent.EndEdit();
Console.WriteLine("Record edited successfully, Click any key to continue!!");
Console.ReadLine();

// END EDIT CODE
//*****************
// BEGIN SEND CHANGES TO SQL SERVER

SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(daAuthors);
daAuthors.Update(dsPubs, "Authors");
Console.WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
Console.ReadLine();

// END SEND CHANGES TO SQL SERVER
//*****************
//BEGIN DELETE CODE

drCurrent = tblAuthors.Rows.Find("993-21-3427");
drCurrent.Delete();
Console.WriteLine("SRecord deleted successfully, Click any key to continue!!");
Console.ReadLine();

//END DELETE CODE
//*****************
// CLEAN UP SQL SERVER
daAuthors.Update(dsPubs, "Authors");
Console.WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
Console.ReadLine();

}
}
}

関連情報

ADO.NET、DataSet オブジェクト、および SQL の使用に関する詳細については、以下のマイクロソフト Web サイトを参照してください。

「Diving into Data Access」 (MSDN Voices のコラム)

http://www.microsoft.com/japan/msdn/columns/data/data04122001.aspx
プロパティ

文書番号:307587 - 最終更新日: 2008/04/29 - リビジョン: 1

フィードバック