2

C# には、いくつかのクエリを実行してトランザクション内のデータベースに挿入するメソッドがあります。

私がやりたいのは、いくつかの「電話番号」を挿入するループです

// Creates the transaction
dbTransaction = dbConnection.DbConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);

// Creates the sql command
dbCommand = factory.CreateCommand();
dbCommand.Connection = dbConnection.DbConnection;
dbCommand.Transaction = dbTransaction;    

... 論理的なもの

// Inserts the phone
foreach (PlacePhoneDTO placePhoneDTO in placePhoneList)
{
    dbCommand.CommandText = sqlStatementPhone.ToString();
    // Adds the parameters
    AddParameter<int>("@PlaceID", placeID, ref dbCommand);
    AddParameter<string>("@PhoneNumber", placePhoneDTO.phoneNumber, ref dbCommand);
    dbCommand.ExecuteNonQuery();
}

dbTransaction.Commit();

ループの 2 回目の実行は失敗します

どうもありがとう

4

1 に答える 1

2

彼のコメントで提案されているslugsterのようなコマンドパラメータをクリアする必要があります。コマンドテキストは常に同じであるため、ループの外に移動することもできます

dbCommand.CommandText = sqlStatementPhone.ToString();

foreach (PlacePhoneDTO placePhoneDTO in placePhoneList)
{
    dbCommand.Parameters.Clear();

    // Adds the parameters
    AddParameter<int>("@PlaceID", placeID, ref dbCommand);
    AddParameter<string>("@PhoneNumber", placePhoneDTO.phoneNumber, ref dbCommand);

    dbCommand.ExecuteNonQuery();
}

または、次のようにループ内でコマンドを再作成します。

foreach (PlacePhoneDTO placePhoneDTO in placePhoneList)
{
    dbCommand = factory.CreateCommand();
    dbCommand.Connection = dbConnection.DbConnection;
    dbCommand.Transaction = dbTransaction;  
    dbCommand.CommandText = sqlStatementPhone.ToString();

    // Adds the parameters
    AddParameter<int>("@PlaceID", placeID, ref dbCommand);
    AddParameter<string>("@PhoneNumber", placePhoneDTO.phoneNumber, ref dbCommand);
    dbCommand.ExecuteNonQuery();
}
于 2012-12-18T14:03:25.220 に答える