【问题标题】:Can't solve "Sqlparameter is already contained by another SqlparameterCollection"无法解决“Sqlparameter 已被另一个 SqlparameterCollection 包含”
【发布时间】:2011-09-11 11:43:24
【问题描述】:

我在 Windows 服务中使用 2 个线程(来自同一类)。我总是收到同样的错误信息:

"The SqlParameter is already contained by another SqlParameterCollection.
   at System.Data.SqlClient.SqlParameterCollection.Validate(Int32 index, Object value)
   at System.Data.SqlClient.SqlParameterCollection.Add(Object value)
   at System.Data.SqlClient.SqlParameterCollection.Add(SqlParameter value)
   at DataBaseLayer.SqlDataBaseLayer.FillDataSetFromProcedure(String strStoredProc, ArrayList parameterCollection)
   at TestThread.StartThreads()"

我试图通过创建新的 SqlParameters 实例和一个 Arraylist 来解决这个问题。我还尝试在代码中的 for 循环中清除数组列表。这并不能解决问题。我愿意接受任何建议。

【问题讨论】:

  • 你能展示你的解决方案的代码吗?
  • 为什么对多个命令使用相同的 SqlParameter 对象?抱歉,如果您不是,但您收到的错误消息强烈表明您是。
  • 尝试清除命令参数列表,然后添加新参数。 cmd.Parameters.Clear();

标签: c# multithreading database-connection sqlparameter


【解决方案1】:

您尝试将SqlParameter 添加到SqlParameterCollection 两次。这可能会也可能不会跨线程发生。

如果这是一个多线程问题,那么您的所有变量都应该在本地范围内,因为如果不是,您应该在他们的访问权限上实现同步,可能使用lock

如果这不是并发问题,则可以通过对 SqlParameter 变量执行 Find All References 轻松识别问题。

如果您发布一些代码,我们可以为您提供更多帮助。

【讨论】:

    【解决方案2】:

    不要在 2 个线程之间共享相同的 sql 对象。通过 SQL 使用池集合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 2011-12-11
      • 1970-01-01
      • 2019-04-10
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多