我在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循环中的arraylists。这并没有解决问题。我愿意接受任何建议。
答案 0 :(得分:1)
您正尝试将SqlParameter
添加到SqlParameterCollection
两次。这可能会也可能不会在线程之间发生。
如果这是一个多线程问题,那么所有变量都应该在本地作用域,因为如果不是,你应该在他们的访问上实现同步,可能是lock
。
如果这不是并发问题,则应通过在SqlParameter
变量上执行查找所有引用来轻松识别该问题。
无论哪种方式,如果您发布一些代码,我们都可以为您提供更多帮助。
答案 1 :(得分:1)
不要在2个线程之间共享相同的sql对象。按SQL使用池集合