2016-12-11 2 views
2

Я получаю исключениеSqlParameter Исключение: SqlParameter уже содержится другой SqlParameterCollection

SqlParameter уже содержится другой SqlParameterCollection

Я переместил свои SqlParameter вызовы из цикла Еогеасп как я думал, это была проблема, но я все еще получаю то же исключение.

private void SendToSQLServer_FactionStandings(Faction faction) 
{ 
    string sqlCnnString = "Server=tcp:horde.database.windows.net,1433;Initial Catalog=horde_db;Persist Security Info=False;User [email protected];Password=PASSWORD;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"; 

    SqlParameter sqlParaFaction_Faction_ID = new SqlParameter("@Faction_ID", SqlDbType.Int); 
    SqlParameter sqlParaFaction_ToFactionID = new SqlParameter("@ToFaction_ID", SqlDbType.Int); 
    SqlParameter sqlParaFaction_Standing = new SqlParameter("@Standing", SqlDbType.SmallInt); 

    using (SqlConnection sqlCnn = new SqlConnection(sqlCnnString)) 
    { 
     sqlCnn.Open(); 

     using (SqlTransaction sqlTrans = sqlCnn.BeginTransaction()) 
     { 
      using (SqlCommand sqlCmd = new SqlCommand()) 
      { 
       sqlCmd.Parameters.Clear(); 

       foreach (FactionStanding factionStanding in faction.FactionStandings) 
       { 
        // 
        // - Insert Faction Standing Table Data 
        // 

        sqlParaFaction_Faction_ID.Value = factionStanding.Faction_ID; 
        sqlCmd.Parameters.Add(sqlParaFaction_Faction_ID); // <---- Getting exception here 

        sqlParaFaction_ToFactionID.Value = factionStanding.ToFaction_ID; 
        sqlCmd.Parameters.Add(sqlParaFaction_ToFactionID); 

        sqlParaFaction_Standing.Value = factionStanding.DefaultStanding; 
        sqlCmd.Parameters.Add(sqlParaFaction_Standing); 

        string sqlCmdFactionStandings = "INSERT INTO FactionStandings (Faction_ID, ToFaction_ID, Standing) VALUES (@Faction_ID, @ToFaction_ID, @Standing)"; 

        sqlCmd.Connection = sqlCnn; 
        sqlCmd.CommandText = sqlCmdFactionStandings; 
        sqlCmd.Transaction = sqlTrans; 

        sqlCmd.ExecuteNonQuery(); 
       } 

       sqlTrans.Commit(); 
       sqlCmd.Parameters.Clear(); 
      } 
     } 
    } 
} 
+0

я добавил две строки, чтобы очистить параметры после того, как они были использованы в надежде, что они не были расположены в использовании заявления. Та же проблема. Обновлен код и номер строки. –

+0

Пожалуйста, проверьте статьи справки [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), [Как задать хороший вопрос] (http://stackoverflow.com/ help/how-to-ask) и [Контрольный список вопросов переполнения стека] (http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist). –

ответ

3

Вы добавляете один и тот же SqlParameter несколько раз к тому же SqlCommand. Проблема в том, что Parameters.Clear() удаляет параметры из команды, но параметры все еще считают, что команда «владеет» ими. Невозможно удалить эту собственность. Это неинтуитивными и это распространенная ошибка :)

2 способа исправить это:

  1. Создание новых объектов SqlParameter для каждой итерации цикла
  2. Или использовать один SqlCommand (как то, что у вас есть) и тянуть sqlCmd.Parameters.Add вне цикла. например

    SqlParameter sqlParaFaction_Faction_ID = new SqlParameter("@Faction_ID", SqlDbType.Int); 
        SqlParameter sqlParaFaction_ToFactionID = new SqlParameter("@ToFaction_ID", SqlDbType.Int); 
        SqlParameter sqlParaFaction_Standing = new SqlParameter("@Standing", SqlDbType.SmallInt); 
    
        using (SqlConnection sqlCnn = new SqlConnection(sqlCnnString)) 
        { 
         sqlCnn.Open(); 
         using (SqlTransaction sqlTrans = sqlCnn.BeginTransaction()) 
         { 
          using (SqlCommand sqlCmd = new SqlCommand()) 
          { 
           sqlCmd.Connection = sqlCnn; 
           string sqlCmdFactionStandings = "INSERT INTO FactionStandings (Faction_ID, ToFaction_ID, Standing) VALUES (@Faction_ID, @ToFaction_ID, @Standing)"; 
           sqlCmd.CommandText = sqlCmdFactionStandings; 
           sqlCmd.Transaction = sqlTrans; 
           sqlCmd.Parameters.Add(sqlParaFaction_Faction_ID); 
           sqlCmd.Parameters.Add(sqlParaFaction_ToFactionID); 
           sqlCmd.Parameters.Add(sqlParaFaction_Standing); 
    
           foreach (FactionStanding factionStanding in faction.FactionStandings) 
           { 
            // 
            // - Insert Faction Standing Table Data 
            // 
            sqlParaFaction_Faction_ID.Value = factionStanding.Faction_ID; 
            sqlParaFaction_ToFactionID.Value = factionStanding.ToFaction_ID; 
            sqlParaFaction_Standing.Value = factionStanding.DefaultStanding; 
    
            sqlCmd.ExecuteNonQuery(); 
           } 
    
           sqlTrans.Commit(); 
          } 
         } 
        } 
    } 
    
+1

Спасибо! Я не могу поверить, что я этого не замечал. Я больше не буду повторять эту ошибку! –