首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlParameter异常: SqlParameter已经包含在另一个SqlParameterCollection中

SqlParameter异常: SqlParameter已经包含在另一个SqlParameterCollection中
EN

Stack Overflow用户
提问于 2016-12-11 01:14:32
回答 1查看 4.1K关注 0票数 3

我得到一个例外

SqlParameter已经包含在另一个SqlParameterCollection中

我已经将我的SqlParameter调用从foreach循环中移出,因为我认为这是问题所在,但我仍然得到了相同的例外。

代码语言:javascript
复制
private void SendToSQLServer_FactionStandings(Faction faction)
{
    string sqlCnnString = "Server=tcp:horde.database.windows.net,1433;Initial Catalog=horde_db;Persist Security Info=False;User ID=USERNAME@horde;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();
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-11 01:45:39

您要多次向同一个SqlParameter添加相同的SqlCommand。问题是Parameters.Clear()从命令中删除了参数,但是参数仍然认为命令“拥有”它们。没有办法取消这个所有权。这是不直观的,也是一个常见的错误:)

解决这一问题的2种方法:

  1. 为每个循环迭代创建新的SqlParameter对象
  2. 或者使用单个SqlCommand (就像您所拥有的那样)并将sqlCmd.Parameters.Add拉到循环之外。例如: SqlParameter sqlParaFaction_Faction_ID =新SqlParameter("@Faction_ID",SqlDbType.Int);SqlParameter sqlParaFaction_ToFactionID =新SqlParameter("@ToFaction_ID",SqlDbType.Int);SqlParameter sqlParaFaction_Standing = new SqlParameter(“@ sqlCnn”,SqlDbType.SmallInt);new (SqlConnection sqlCnn= new SqlConnection(SqlConnection)){SqlConnection();使用(SqlTransaction sqlTrans = sqlCnn.BeginTransaction()) { new (SqlCommand sqlCmd =新SqlCommand()) { sqlCmd.Connection = sqlCnn;string sqlCmdFactionStandings = "INSERT INTO FactionStandings (Faction_ID,ToFaction_ID,string)值(@Faction_ID,@ToFaction_ID,@sqlCmd)“;sqlCmd.CommandText = sqlCmdFactionStandings;sqlCmd.Transaction =sqlCmdFactionStandings;sqlCmd.Parameters.Add(sqlParaFaction_Faction_ID);sqlCmd.Parameters.Add(sqlParaFaction_ToFactionID);sqlCmd.Parameters.Add(sqlParaFaction_Standing);foreach (FactionStanding factionStanding in faction.FactionStandings) {/-插入派系站立表数据// sqlParaFaction_Faction_ID.Value = factionStanding.Faction_ID;sqlParaFaction_ToFactionID.Value = factionStanding.ToFaction_ID;sqlParaFaction_Standing.Value = factionStanding.DefaultStanding;sqlCmd.ExecuteNonQuery();}sqlTrans.Commit()}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41082040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档