捕捉到的错误如下:
"另一个 SqlParameterCollection 已包含带有 ParameterName“@rssid”的 SqlParameter。" 
部分关键源代码: public void InsertNewsItems(int rssid,string c channelUri,SqlParameter[] sparameters)
{
            NewItemInfo itemInfo=new NewItemInfo();
itemInfo.rssid=rssid;
itemInfo.sqrs=sparameters;
ArrayList itemsList=GetNewsItemsList(channelUri);
if(itemsList==null)
return;

for(int i=0;i<itemsList.Count;i++)
{
              itemInfo.otherInfo=(string[])itemsList[i];
ThreadPool.QueueUserWorkItem(new WaitCallback(InsertOneItem),itemInfo);
Thread.Sleep(300);

}
}
public void InsertOneItem(object Info)
{
try
{
lock(this)
{
NewItemInfo itemInfo=(NewItemInfo)Info;
SqlParameter[] sqrs=itemInfo.sqrs;
sqrs[0].Value=itemInfo.rssid;
string[] subString=new string[4];
subString=itemInfo.otherInfo;
sqrs[1].Value=subString[0];
sqrs[2].Value=subString[1];
sqrs[3].Value=subString[2];
sqrs[4].Value=subString[3];
sqrs[5].Value=GetWebContent(subString[1]);

dbRss.InsertItems(sqrs);
}
}
catch(Exception ex)
{
 System.Windows.Forms.MessageBox.Show(ex.StackTrace,"InsertOneItem"+ex.Message);
}
}
             public bool InsertItems(SqlParameter[] sprs)
{

try
{
SqlCommand scmd=new SqlCommand("prInsertItems",sqc);
scmd.CommandType=CommandType.StoredProcedure;
sqc.Open();

for(int i=0;i<sprs.Length;i++)
{
scmd.Parameters.Add(sprs[i]);
}

scmd.ExecuteNonQuery();
return true;

}
catch(Exception sex)
{
System.Windows.Forms.MessageBox.Show("InsertItemsError",sex.Message);
return false;
}
finally
{
if(sqc.State==ConnectionState.Open)
sqc.Close();
}
}

解决方案 »

  1.   

    para_temp[0] = new OracleParameter(":labelno",OracleType.VarChar,SystemVariable.Parm_LabelNo);
    你是不是少了这个类似的东西???
      

  2.   

    /*存储过程和函数定义如下*/急
    SqlParameter[] sqrs=new SqlParameter[6];
    sqrs[0]=new SqlParameter("@rssid",SqlDbType.Int);
    sqrs[1]=new SqlParameter("@title",System.Data.SqlDbType.VarChar,500);
    sqrs[2]=new SqlParameter("@link",System.Data.SqlDbType.VarChar,500);
    sqrs[3]=new SqlParameter("@description",System.Data.SqlDbType.NText);
    sqrs[4]=new SqlParameter("@pubdate",System.Data.SqlDbType.VarChar,20);
    sqrs[5]=new SqlParameter("@content",System.Data.SqlDbType.NText);
    ALTER   Procedure prInsertItems
    (
    @rssid int,
    @title varchar(500),
    @link varchar(500),
    @description ntext=null,
    @pubdate varchar(20)=null,
    @content ntext=null
    )
    as
    begin
    insert into items(rssid,title,link,description,pubdate,content)
    values(@rssid,@title,@link,@description,@pubdate,@content)
    end
      

  3.   

    对啊 用LOCK不就可以了吗? 不过这个还是不够安全~ 还有一个.... 忘了~
      

  4.   

    这种情况可以用线程池加连接池机制,你已经用上了线程池,但你的每个线程都用得同一个SqlConnection对象,这样如果不采用Lock机制,就可能会出问题。但如果你每个线程都自己创建一个SqlConnection对象,就没有这个问题了,而且不必Lock(如果你没有用到其它需要独占的资源的话)。使用连接池的方法很简单,只要你每次需要用到SqlConnection对象时,就用new创建一个然后Open,用完Close就可以了。.Net的XXXConnection类都默认是采用连接池的,详情参见MSDN。
      

  5.   

    finally裏面加入這句:
    scmd.Parameters.Clear();
    懷疑是你的參數重復添加了
      

  6.   

    InsertItems()在這個添加參數的方法裏面,既然你要多次執行這個方法,那就不能重復添加參數
      

  7.   

    看到好像是你重复添加参数了,不知道你用多个线程,每个线程都用同一个sqlcommander吗,如果是这样的话,要避免线程之间的访问冲突。
      

  8.   

    问题解决  
    如果放置commnd.Parameters.Clear()则将Parameters设置为空引用,而framework机制只是限制两个SqlParameterCollection指向同一个对象,并没有限制数组和SqlParameterCollection指向同一个对象。此时单线程调用时不会出错。但因为web本身就是多线程,在多线程的情况下,只有通过deep copy才能避免SqlParameterCollection指向同一个对象,所以此种方法不可行
     解决方法是 
    public bool InsertItems(SqlParameter[] sprs)
    {

    try
    {
    if(sqc.State==ConnectionState.Open)
    sqc.Close();
    SqlCommand scmd=new SqlCommand("prInsertItems",sqc);
    scmd.CommandType=CommandType.StoredProcedure;
    sqc.Open();
    SqlParameter[] sqlprs=new SqlParameter[sprs.Length];
    for(int j=0;j<sprs.Length;j++)
    {
    sqlprs[j]=(SqlParameter)((ICloneable)sprs[j]).Clone();
    }
    for(int i=0;i<sqlprs.Length;i++)
    {
    scmd.Parameters.Add(sqlprs[i]);
    }

    scmd.ExecuteNonQuery();
    return true;

    }
    catch(Exception sex)
    {
    System.Windows.Forms.MessageBox.Show("InsertItemsError",sex.Message);
    return false;
    }
    finally
    {
    if(sqc.State==ConnectionState.Open)
    sqc.Close();
    }



    }