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

文書翻訳 文書翻訳
文書番号: 307587 - 対象製品
この記事は、以前は次の ID で公開されていました: JP307587
すべて展開する | すべて折りたたむ

目次

概要

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

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
ADO.NET for the ADO Programmer
http://msdn2.microsoft.com/en-us/library/ms973217.aspx
.NET Framework Developer Center
http://www.microsoft.com/japan/msdn/netframework/downloads/

プロパティ

文書番号: 307587 - 最終更新日: 2007年2月20日 - リビジョン: 6.2
この資料は以下の製品について記述したものです。
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
キーワード:?
kbhowtomaster kbsqlclient kbsystemdata KB307587
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com