データベース内SQL Server SqlDataAdapter オブジェクトを使用してデータベースを更新Visual C++

この記事では、オブジェクトを使用して、データベース SqlDataAdapter 内のデータベースSQL Server更新するMicrosoft Visual C++。

元の製品バージョン:   Visual C++
元の KB 番号:   308510

概要

オブジェクト SqlDataAdapter は、オブジェクトとデータベースデータベース ADO.NET DataSet ブリッジSQL Serverします。 これは、次の操作に使用できる仲介オブジェクトです。

  • データベースから ADO.NET DataSet されたデータをデータにSQL Serverします。
  • を使用してデータに加えた変更 (挿入、更新、削除) を反映するようにデータベースを更新します DataSet 。この記事では、Visual C++ .NET コード サンプルを提供し、データベース内のテーブルのデータが設定されたオブジェクトに対して実行されるデータ変更を使用して、SQL Server データベースを更新するためにオブジェクトを使用する方法を示します。 SqlDataAdapter DataSet

この記事では、クラス ライブラリ.NET Frameworkを参照します System::Data::SqlClient

SqlDataAdapter オブジェクトとプロパティ

オブジェクトの 、、およびプロパティは、オブジェクトで実行されるデータ変更を使用してデータベース InsertCommand UpdateCommand DeleteCommand SqlDataAdapter を更新するために使用 DataSet されます。 これらの各プロパティは、ターゲット データベースに変更を投稿するために使用される、それぞれの 、および TSQL コマンドを指定 SqlCommand INSERT UPDATE DELETE DataSet するオブジェクトです。 これらの SqlCommand プロパティに割り当てられたオブジェクトは、コードで手動で作成するか、オブジェクトを使用して自動的に生成 SqlCommandBuilder できます。

この記事の最初のコード サンプルでは、オブジェクトを使用してオブジェクトのプロパティを自動的に生成 SqlCommandBuilder UpdateCommand する方法を示 SqlDataAdapter します。 2 番目のサンプルでは、コマンドの自動生成を使用できないシナリオを使用するため、オブジェクトを手動で作成してオブジェクトのプロパティとして使用するプロセスを SqlCommand UpdateCommandSqlDataAdapter します。

サンプル テーブルの作成SQL Serverする

この記事に記載されている SQL Server .NET コード サンプルで使用するサンプル Visual C++を作成するには、次の手順を実行します。

  1. クエリ SQL Serverを開き、サンプル テーブルを作成するデータベースに接続します。 この記事のコード サンプルでは、この記事に付属する Northwind データベースをSQL Server。

  2. 次の T-SQL ステートメントを実行して CustTest という名前のサンプル テーブルを作成し、そのテーブルにレコードを挿入します。

    Create Table CustTest
    (
        CustID int primary key,
        CustName varchar(20)
    )
    Insert into CustTest values(1,'John')
    

コード サンプル 1: 自動的に生成されるコマンド

a に値を設定するために使用されるデータを取得するステートメントが 1 つのデータベース テーブルに基づく場合は、オブジェクトを利用して、 のプロパティを自動的に生成 SELECT DataSet CommandBuilder DeleteCommand InsertCommand UpdateCommand できます DataAdapter 。 これにより、実行、および操作に必要なコード INSERT UDPATE が簡略化され、削減 DELETE されます。

最小要件として、コマンドの自動生成が機能する SelectCommand プロパティを設定する必要があります。 によって取得されるテーブル スキーマは、自動的に生成される 、、およびステートメントの SelectCommand INSERT UPDATE 構文を DELETE 決定します。

また SelectCommand 、少なくとも 1 つの主キーまたは一意の列を返す必要があります。 存在しない場合は例外 InvalidOperation が生成され、コマンドは生成されません。

オブジェクトを使用してオブジェクトVisual C++、および SqlCommand オブジェクト プロパティを自動的に生成する方法を示すサンプル Visual C++ .NET コンソール アプリケーションを作成するには、次の SqlCommandBuilder InsertCommand DeleteCommand UpdateCommand SqlDataAdapter 手順を実行します。

  1. .NET Visual Studioを開始し、新しいマネージ C++ アプリケーションを作成します。 updateSQL に 名前を付け

  2. updateSQL.cpp に次のコードをコピーして貼り付けます (既定の内容を置き換えます)。

    #include "stdafx.h"
    
    #using < mscorlib.dll>
    #using < System.dll>
    #using < System.Data.dll>
    #using < System.Xml.dll>
    
    using namespace System;
    using namespace System::Data;
    using namespace System::Data::SqlClient;
    
    #ifdef _UNICODE
        int wmain(void)
    #else
        int main(void)
    #endif
    {
        SqlConnection *cn = new SqlConnection();
        DataSet *CustomersDataSet = new DataSet();
        SqlDataAdapter *da;
        SqlCommandBuilder *cmdBuilder;
    
        //Set the connection string of the SqlConnection object to connect
        //to the SQL Server database in which you created the sample
        //table in Section 1.0
        cn->ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
        cn->Open();
    
        //Initialize the SqlDataAdapter object by specifying a Select command
        //that retrieves data from the sample table
        da = new SqlDataAdapter("select * from CustTest order by CustId", cn);
    
        //Initialize the SqlCommandBuilder object to automatically generate and initialize
        //the UpdateCommand, InsertCommand and DeleteCommand properties of the SqlDataAdapter
        cmdBuilder = new SqlCommandBuilder(da);
    
        //Populate the DataSet by executing the Fill method of the SqlDataAdapter
        da->Fill(CustomersDataSet, "Customers");
    
        //Display the Update, Insert and Delete commands that were automatically generated
        //by the SqlCommandBuilder object
        Console::WriteLine("Update command Generated by the Command Builder : ");
        Console::WriteLine("==================================================");
        Console::WriteLine(cmdBuilder->GetUpdateCommand()->CommandText);
        Console::WriteLine(" ");
        Console::WriteLine("Insert command Generated by the Command Builder : ");
        Console::WriteLine("==================================================");
        Console::WriteLine(cmdBuilder->GetInsertCommand()->CommandText);
        Console::WriteLine(" ");
        Console::WriteLine("Delete command Generated by the Command Builder : ");
        Console::WriteLine("==================================================");
        Console::WriteLine(cmdBuilder->GetDeleteCommand()->CommandText);
        Console::WriteLine(" ");
    
        //Write out the value in the CustName field before updating the data using the DataSet
        DataRow *rowCust = CustomersDataSet->Tables->Item["Customers"]->Rows->Item[0];
        Console::WriteLine("Customer Name before Update : {0} ", rowCust->Item["CustName"]);
    
        //Modify the value of the CustName field
        String *newStrVal = new String("Jack");
        rowCust->set_Item("CustName", newStrVal);
    
        //Modify the value of the CustName field again
        String *newStrVal2 = new String("Jack2");
        rowCust->set_Item("CustName", newStrVal2);
    
        //Post the data modification to the database
        da->Update(CustomersDataSet, "Customers");
    
        Console::WriteLine("Customer Name after Update : {0} ", rowCust->Item["CustName"]);
    
        //Close the database connection
        cn->Close();
    
        //Pause
        Console::ReadLine();
        return 0;
    }
    
  3. 手順 2 でコピーして貼り付けしたコードで、次のように、接続文字列コードの行を変更して、SQL Serverコンピューターに適切に接続します。

    cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
    

    このコードを実行した後、インストールに接続し、SQL Serverサインインできます。

  4. アプリケーションを保存して実行します。 コンソール ウィンドウが開き、次の出力が表示されます。

    Update command generated by the Command Builder:
    ==================================================
    UPDATE CustTest SET CustID = @p1 , CustName = @p2 WHERE ( (CustID = @p3)
    AND ((CustName IS NULL AND @p4 IS NULL)
    OR (CustName = @p5)))
    Insert command generated by the Command Builder :
    ==================================================
    INSERT INTO CustTest( CustID , CustName ) VALUES ( @p1 , @p2 )
    Delete command generated by the Command Builder :
    ==================================================
    DELETE FROM CustTest WHERE ( (CustID = @p1)
    AND ((CustName IS NULL AND @p2 IS NULL)
    OR (CustName = @p3)))
    Customer Name before Update : John
    Customer Name after Update : Jack2
    
  5. 任意のキーを押してコンソール ウィンドウを閉じ、アプリケーションを停止します。

コード サンプル 2: UpdateCommand プロパティを手動で作成して初期化する

コード サンプル 1 によって生成される出力は、ステートメントのコマンドを自動的に生成するためのロジックが、オプティミスティック同時実行に基 UPDATE づいて行われます。 つまり、レコードは編集用にロックされ、他のユーザーやプロセスによっていつでも変更できます。 レコードは、ステートメントから返された後、ステートメントが発行される前に変更された可能性があるため、自動的に生成されたステートメントには句が含まれているため、行が更新されるのは、元のすべての値が含まれているため、削除されていない場合のみです。 SELECT UPDATE UPDATE WHERE これは、新しいデータが上書きされないことを確認するために行われます。 自動的に生成された更新プログラムが、削除された行または元の値が含まれている行を更新しようとすると、コマンドはレコードに影響を与え DataSet 、a が DBConcurrencyException スローされます。

元の値に関係なく完了する場合は、コマンドの自動生成に依存するのではなく、for を明示的に UPDATE UpdateCommand DataAdapter 設定する必要があります。

コード サンプル 1 で使用されるオブジェクトのプロパティを手動で作成して初期化 UpdateCommand SqlDataAdapter するには、次の手順を実行します。

  1. コード サンプル 1 で作成された C++ アプリケーションの UpdateSQL.cpp ファイル内の関数に、次のコード (既存のコードを上書きする) をコピーして Main() 貼り付けます。

    SqlConnection *cn = new SqlConnection();
    DataSet *CustomersDataSet = new DataSet();
    SqlDataAdapter *da;
    SqlCommand *DAUpdateCmd;
    cn->ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
    cn->Open();
    da = new SqlDataAdapter("select * from CustTest order by CustId", cn);
    
    //Initialize the SqlCommand object that will be used as the DataAdapter's UpdateCommand
    //Notice that the WHERE clause uses only the CustId field to locate the record to be updated
    DAUpdateCmd = new SqlCommand("Update CustTest set CustName = @pCustName where CustId = @pCustId"
    , da->SelectCommand->Connection);
    
    //Create and append the parameters for the Update command
    DAUpdateCmd->Parameters->Add(new SqlParameter("@pCustName", SqlDbType::VarChar));
    DAUpdateCmd->Parameters->Item["@pCustName"]->SourceVersion = DataRowVersion::Current;
    DAUpdateCmd->Parameters->Item["@pCustName"]->SourceColumn = "CustName";
    
    DAUpdateCmd->Parameters->Add(new SqlParameter("@pCustId", SqlDbType::Int));
    DAUpdateCmd->Parameters->Item["@pCustId"]->SourceVersion = DataRowVersion::Original;
    DAUpdateCmd->Parameters->Item["@pCustId"]->SourceColumn = "CustId";
    
    //Assign the SqlCommand to the UpdateCommand property of the SqlDataAdapter
    da->UpdateCommand = DAUpdateCmd;
    da->Fill(CustomersDataSet, "Customers");
    
    DataRow *rowCust = CustomersDataSet->Tables->Item["Customers"]->Rows->Item[0];
    Console::WriteLine("Customer Name before Update : {0} ", rowCust->Item["CustName"]);
    
    //Modify the value of the CustName field
    String *newStrVal = new String("Jack");
    rowCust->set_Item("CustName", newStrVal);
    
    //Modify the value of the CustName field again
    String *newStrVal2 = new String("Jack2");
    rowCust->set_Item("CustName", newStrVal2);
    
    da->Update(CustomersDataSet, "Customers");
    Console::WriteLine("Customer Name after Update : {0} ", rowCust->Item["CustName"]);
    cn->Close();
    Console::ReadLine();
    return 0;
    
  2. 前のコード サンプルの接続文字列コードの行を次のように変更します。

    cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
    
  3. この記事のコード サンプル 1セクションでコードを既に実行している場合は、SQL Server で CustTest テーブルを開き、最初のレコードの CustName 値を John に戻します。

  4. アプリケーションを保存して実行します。 コンソール ウィンドウが開き、次の出力が表示されます。

    Customer Name before Update : John
    Customer Name after Update : Jack2