単一のデータベース トランザクションでメッセージを実行する

すべてのデータ変更が成功するか、どれも成功しないかとなるよう、システム内の複数のテーブル行の変更を調整することは、ビジネス アプリケーションの一般的な要件です。 データベースの用語では、どれか一つの操作が失敗したときにすべてのデータの変更をロール バックする機能を持つ単一のトランザクションで、複数の操作を実行することとして知られています。

ExecuteTransactionRequest メッセージ要求を使用して、1 つのデータベース トランザクションで、2 つ以上の要求を実行できます。 このメッセージを使用するには、Requests コレクションに、トランザクションで実行される組織の要求を 2 つ以上設定します。 Responses コレクションで、実行したメッセージ要求ごとに 1 つ、応答のコレクションを戻す場合は、ReturnResponsestrue に設定します。 Requests コレクションのメッセージ要求は、コレクションに表示されている順序で実行されます。この場合、インデックス 0 の要素が最初に実行されます。 この同じ順序は、Responses コレクションで維持されます。

要求のいずれかが失敗し、トランザクションがロールバックされた場合、トランザクション中に完了したデータの変更は取り消されます。 また、ExecuteTransactionFault が返されて、エラーを発生した要求メッセージの要求コレクションのインデックスを特定します。

ExecuteMultipleRequest には、1 つまたは複数の ExecuteTransactionRequest インスタンスが格納されていることがあります。 ExecuteTransactionRequest インスタンスに、ExecuteTransactionRequest または ExecuteMultipleRequest を含むことはできません。 ExecuteMultipleRequest に関する詳細は、.NET 用 SDK を使用して複数の要求を実行する を参照してください。

このサンプルでは 1 つの Web メソッド呼び出しを使用して、コレクション内すべてのメッセージ要求を 1 度のデータベース トランザクションの一部として実行します。 実行時の動作を変更する設定も示しています。

// Create an ExecuteTransactionRequest object.
var requestToCreateRecords = new ExecuteTransactionRequest()
{
// Create an empty organization request collection.
Requests = new OrganizationRequestCollection(),
ReturnResponses = true
};

// Create several (local, in memory) entities in a collection. 
var input = new EntityCollection()
{
EntityName = Account.EntityLogicalName,
Entities = {
            new Account { Name = "ExecuteTransaction Example Account 1" },
            new Account { Name = "ExecuteTransaction Example Account 2" },
            new Account { Name = "ExecuteTransaction Example Account 3" },
            new Account { Name = "ExecuteTransaction Example Account 4" },
            new Account { Name = "ExecuteTransaction Example Account 5" }
        }
};

// Add a CreateRequest for each entity to the request collection.
foreach (var entity in input.Entities)
{
CreateRequest createRequest = new CreateRequest { Target = entity };
requestToCreateRecords.Requests.Add(createRequest);
}

// Execute all the requests in the request collection using a single web method call.
try
{
var responseForCreateRecords =
    (ExecuteTransactionResponse)svc.Execute(requestToCreateRecords);

int i = 0;
// Display the results returned in the responses.
foreach (var responseItem in responseForCreateRecords.Responses)
{
    if (responseItem != null)
    Console.WriteLine("Created " + ((Account)requestToCreateRecords.Requests[i].Parameters["Target"]).Name
        + " with account id as " + responseItem.Results["id"].ToString());
    i++;
}
}
catch (FaultException<OrganizationServiceFault> ex)
{
Console.WriteLine("Create request failed for the account{0} and the reason being: {1}",
    ((ExecuteTransactionFault)(ex.Detail)).FaultedRequestIndex + 1, ex.Detail.Message);
throw;
}

参照

.NET 用 SDK でメッセージを使用する
.NET 用 SDK を使用して複数の要求を実行する

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。