SqlParameter 异常:SqlParameter 已包含在另一个 SqlParameterCollection 中
SqlParameter Exception: The SqlParameter is already contained by another SqlParameterCollection
我遇到异常
The SqlParameter is already contained by another 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 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();
}
}
}
}
您将同一个 SqlParameter 多次添加到同一个 SqlCommand。问题是 Parameters.Clear()
从命令中删除了参数,但参数仍然认为命令 'owns' 它们。无法删除此所有权。这是不直观的,也是一个常见的错误:)
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();
}
}
}
}
我遇到异常
The SqlParameter is already contained by another 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 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();
}
}
}
}
您将同一个 SqlParameter 多次添加到同一个 SqlCommand。问题是 Parameters.Clear()
从命令中删除了参数,但参数仍然认为命令 'owns' 它们。无法删除此所有权。这是不直观的,也是一个常见的错误:)
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(); } } } }