2016-12-11 52 views
2

我得到一个异常的SqlParameter例外:SqlParameter的已被另一SqlParameterCollection包含

SqlParameter有已被另一SqlParameterCollection

载我提出我的SqlParameter召唤出foreach循环因为我认为这是问题,但我仍然得到同样的例外。

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

我添加了两行以清除参数,他们在他们没有被安置于由using语句希望使用后。同样的问题。更新的代码和行号。 –

+0

请检查帮助文章[如何创建一个最小,完整和可验证的示例](http://stackoverflow.com/help/mcve),[如何提出一个好问题](http://stackoverflow.com/帮助/如何问)和[堆栈溢出问题清单](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)。 –

回答

3

您将同一个SqlParameter多次添加到同一个SqlCommand。问题是Parameters.Clear()从命令中删除参数,但参数仍然认为命令'拥有'它们。没有办法去除这个所有权。这是直观的,这是一个常见的错误:)

2种方法来解决这个问题:

  1. 每个循环迭代
  2. 创建新的SqlParameter对象或使用单一的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

谢谢!我不相信我忽略了这一点。我不会再犯这个错误! –

相关问题