2012-06-11 23 views
0

我越來越絕望這裏。我不知道爲什麼會發生這種異常。我搜索瞭解這個問題,似乎每個人都設法用command.Parameters.Clear()來解決它,但這對我不起作用。這裏是我的代碼:SqlParameter有已經包含另一個SqlParameterCollection - command.Parameters.Clear()不工作

public class ProductsDataAccess : Connection 
{ 
    public static SqlParameter[] createParams(Products prod) 
    { 
     SqlParameter idParam = new SqlParameter("@id", prod.prodID); 
     idParam.SqlDbType = System.Data.SqlDbType.VarChar; 
     idParam.Size = 45; 
     idParam.IsNullable = false; 
     idParam.Direction = ParameterDirection.Input; 

     SqlParameter nameParam = new SqlParameter("@name", prod.prodName); 
     nameParam.SqlDbType = System.Data.SqlDbType.VarChar; 
     nameParam.Size = 45; 
     nameParam.IsNullable = false; 
     nameParam.Direction = ParameterDirection.Input; 

     SqlParameter demandParam = new SqlParameter("@demand", prod.demand); 
     demandParam.SqlDbType = System.Data.SqlDbType.Int; 
     demandParam.IsNullable = false; 
     demandParam.Direction = ParameterDirection.Input; 

     SqlParameter demandLTParam = new SqlParameter("@demandLT", prod.demandLT); 
     demandLTParam.SqlDbType = System.Data.SqlDbType.Int; 
     demandLTParam.IsNullable = false; 
     demandLTParam.Direction = ParameterDirection.Input; 

     SqlParameter leadTimeParam = new SqlParameter("@leadTime", prod.leadTime); 
     leadTimeParam.SqlDbType = System.Data.SqlDbType.Int; 
     leadTimeParam.IsNullable = false; 
     leadTimeParam.Direction = ParameterDirection.Input; 

     SqlParameter fixedCoastParam = new SqlParameter("@k", prod.k); 
     fixedCoastParam.SqlDbType = System.Data.SqlDbType.Float; 
     fixedCoastParam.IsNullable = false; 
     fixedCoastParam.Direction = ParameterDirection.Input; 

     SqlParameter cParam = new SqlParameter("@c", prod.c); 
     cParam.SqlDbType = System.Data.SqlDbType.Float; 
     cParam.IsNullable = false; 
     cParam.Direction = ParameterDirection.Input; 

     SqlParameter chPrecentageParam = new SqlParameter("@chPrecent", prod.precentOfC); 
     chPrecentageParam.SqlDbType = System.Data.SqlDbType.Int; 
     chPrecentageParam.IsNullable = false; 
     chPrecentageParam.Direction = ParameterDirection.Input; 

     SqlParameter chParam = new SqlParameter("@ch", prod.ch); 
     chParam.SqlDbType = System.Data.SqlDbType.Float; 
     chParam.IsNullable = false; 
     chParam.Direction = ParameterDirection.Input; 

     SqlParameter optimalQParam = new SqlParameter("@q", prod.q); 
     optimalQParam.SqlDbType = System.Data.SqlDbType.Int; 
     optimalQParam.IsNullable = false; 
     optimalQParam.Direction = ParameterDirection.Input; 

     SqlParameter annualChParam = new SqlParameter("@annualCh", prod.annualCh); 
     annualChParam.SqlDbType = System.Data.SqlDbType.Float; 
     annualChParam.IsNullable = false; 
     annualChParam.Direction = ParameterDirection.Input; 

     SqlParameter annualKParam = new SqlParameter("@annualK", prod.annualK); 
     annualKParam.SqlDbType = System.Data.SqlDbType.Float; 
     annualKParam.IsNullable = false; 
     annualKParam.Direction = ParameterDirection.Input; 

     SqlParameter optimalTACParam = new SqlParameter("@tac", prod.tac); 
     optimalTACParam.SqlDbType = System.Data.SqlDbType.Float; 
     optimalTACParam.IsNullable = false; 
     optimalTACParam.Direction = ParameterDirection.Input; 

     SqlParameter rParam = new SqlParameter("@r", prod.r); 
     rParam.SqlDbType = System.Data.SqlDbType.Int; 
     rParam.IsNullable = false; 
     rParam.Direction = ParameterDirection.Input; 

     SqlParameter inventoryLvlParam = new SqlParameter("@invLvl", prod.inventoryLvl); 
     inventoryLvlParam.SqlDbType = System.Data.SqlDbType.Int; 
     inventoryLvlParam.IsNullable = false; 
     inventoryLvlParam.Direction = ParameterDirection.Input; 

     SqlParameter statusParam = new SqlParameter("@status", prod.status); 
     statusParam.SqlDbType = System.Data.SqlDbType.VarChar; 
     statusParam.Size = 10; 
     statusParam.IsNullable = false; 
     statusParam.Direction = ParameterDirection.Input; 

     SqlParameter[] paramList = {idParam, nameParam, demandParam, demandLTParam, 
            leadTimeParam, fixedCoastParam, cParam, 
            chPrecentageParam, chParam, optimalQParam, 
            annualChParam, annualKParam, optimalTACParam, 
            rParam, inventoryLvlParam, statusParam }; 
     return paramList; 

    } 

    public static void insertProduct(Products product) 
    { 


     String comStr = "insert into Products(prodID, name, demand, demandLT, leadTime, fixedCoast, " + 
      "c, chAsPrecentage, ch, optimalQ, annualCh, annualK, optimalTAC, r, inventoryLvl, prodStatus) " + 
      "values(@id, @name, @demand, @demandLT, @leadTime, @k, @c, @chPrecent, " + 
      "@ch, @q, @annualCh, @annualK, @tac, @r, @invLvl, @status)"; 

     createConncetion(); 

     SqlCommand command = new SqlCommand(comStr, con); 
     command.Parameters.AddRange(createParams(product)); 

     openConnection(); 

     command.ExecuteNonQuery(); 
     closeConnection(); 

     command.Parameters.Clear() 
     command.Dispose(); 
    } 

    public static DataTable getAllProducts() 
    { 
     String comStr = "select prodID, name, demand, demandLT, leadTime, fixedCoast, c, chAsPrecentage, " + 
      "ch, optimalQ, annualCh, annualK, optimalTAC, r, inventoryLvl, prodStatus from Products"; 

     createConncetion(); 

     SqlCommand command = new SqlCommand(comStr, con); 

     DataTable table = new DataTable("allProduct"); 
     SqlDataAdapter adapter = new SqlDataAdapter(); 
     adapter.SelectCommand=command; 

     openConnection(); 

     adapter.Fill(table); 
     command.Dispose(); 
     closeConnection(); 
     return table; 
    } 

} 

這裏是其他類中,我使用sqlParameters:

public class StatisticsDataAccess : Connection 
{ 

    public static SqlParameter[] createParams(Statistics stat, string prodID) 
    { 

     SqlParameter idParam = new SqlParameter("@id", prodID); 
     idParam.SqlDbType = System.Data.SqlDbType.VarChar; 
     idParam.Size = 45; 
     idParam.IsNullable = false; 
     idParam.Direction = ParameterDirection.Input; 

     SqlParameter m1Param = new SqlParameter("@m1", stat.month1); 
     m1Param.SqlDbType = System.Data.SqlDbType.Int; 
     m1Param.IsNullable = false; 
     m1Param.Direction = ParameterDirection.Input; 

     SqlParameter m2Param = new SqlParameter("@m2", stat.month2); 
     m2Param.SqlDbType = System.Data.SqlDbType.Int; 
     m2Param.IsNullable = false; 
     m2Param.Direction = ParameterDirection.Input; 

     SqlParameter m3Param = new SqlParameter("@m3", stat.month3); 
     m3Param.SqlDbType = System.Data.SqlDbType.Int; 
     m3Param.IsNullable = false; 
     m3Param.Direction = ParameterDirection.Input; 

     SqlParameter m4Param = new SqlParameter("@m4", stat.month4); 
     m4Param.SqlDbType = System.Data.SqlDbType.Int; 
     m4Param.IsNullable = false; 
     m4Param.Direction = ParameterDirection.Input; 

     SqlParameter m5Param = new SqlParameter("@m5", stat.month5); 
     m5Param.SqlDbType = System.Data.SqlDbType.Int; 
     m5Param.IsNullable = false; 
     m5Param.Direction = ParameterDirection.Input; 

     SqlParameter m6Param = new SqlParameter("@m6", stat.month6); 
     m6Param.SqlDbType = System.Data.SqlDbType.Int; 
     m6Param.IsNullable = false; 
     m6Param.Direction = ParameterDirection.Input; 

     SqlParameter m7Param = new SqlParameter("@m7", stat.month7); 
     m7Param.SqlDbType = System.Data.SqlDbType.Int; 
     m7Param.IsNullable = false; 
     m7Param.Direction = ParameterDirection.Input; 

     SqlParameter m8Param = new SqlParameter("@m8", stat.month8); 
     m8Param.SqlDbType = System.Data.SqlDbType.Int; 
     m8Param.IsNullable = false; 
     m8Param.Direction = ParameterDirection.Input; 

     SqlParameter m9Param = new SqlParameter("@m9", stat.month9); 
     m9Param.SqlDbType = System.Data.SqlDbType.Int; 
     m9Param.IsNullable = false; 
     m9Param.Direction = ParameterDirection.Input; 

     SqlParameter m10Param = new SqlParameter("@m10", stat.month10); 
     m10Param.SqlDbType = System.Data.SqlDbType.Int; 
     m10Param.IsNullable = false; 
     m10Param.Direction = ParameterDirection.Input; 

     SqlParameter m11Param = new SqlParameter("@m11", stat.month11); 
     m11Param.SqlDbType = System.Data.SqlDbType.Int; 
     m11Param.IsNullable = false; 
     m11Param.Direction = ParameterDirection.Input; 

     SqlParameter m12Param = new SqlParameter("@m12", stat.month12); 
     m12Param.SqlDbType = System.Data.SqlDbType.Int; 
     m12Param.IsNullable = false; 
     m12Param.Direction = ParameterDirection.Input; 

     SqlParameter[] paramList = {idParam, m1Param, m2Param, m3Param, m4Param, 
            m5Param, m6Param, m7Param, m8Param, m8Param, 
            m10Param, m11Param, m12Param }; 
     return paramList; 
    } 

    public static void insertStatistic(Statistics stat, string prodID) 
    { 


     String comStr = "insert into LTDStatistic(prodID, month1, month2, month3, month4, month5, " + 
      "month6, month7, month8, month9, month10, month11, month12)" + 
      "values(@id, @m1, @m2, @m3, @m4, @m5, @m6, @m7, @m8, @m9, @m10, @m11, @m12)"; 

     createConncetion(); 

     SqlCommand command = new SqlCommand(comStr, con); 
     command.Parameters.AddRange(createParams(stat, prodID)); 

     openConnection(); 

     command.ExecuteNonQuery(); 
     closeConnection(); 
     command.Parameters.Clear(); 
     command.Dispose(); 

    } 

} 

WCF服務使用這些類的方法,以便修改數據的基礎上

 public void create(ProductsData product) 
    { 

     Statistics statDLT = new Statistics(product.demandLTStat.month1, product.demandLTStat.month2, 
      product.demandLTStat.month3, product.demandLTStat.month4, product.demandLTStat.month5, 
      product.demandLTStat.month6, product.demandLTStat.month7, product.demandLTStat.month8, 
      product.demandLTStat.month9, product.demandLTStat.month10, product.demandLTStat.month11, 
      product.demandLTStat.month12); 

     Products newProd = new Products(product.prodID, product.prodName, 
      product.leadTime, product.k, product.c, product.precentOfC, 
      product.demand, statDLT); 

     newProd.callculate(); 
     newProd.determineR(); 
     ProductsDataAccess.insertProduct(newProd); 
     //String plsWork = newProd.prodID; 
     StatisticsDataAccess.insertStatistic(newProd.demandLTStat, newProd.prodID); 
    } 

也許我缺少的是如何工作的一些重要的方面......我不知道。希望有人能幫助我,對於長代碼段感到抱歉。

+0

你有沒有調試的代碼,看看哪個參數導致了問題? –

+0

是的,我做到了,我看到該命令的參數集合是在各自的方法結束時清空。我不能看到這會導致其發生在下面的行例外的確切參數: command.Parameters.AddRange(的CreateParams(STAT,PRODID)); 我會嘗試逐個添加參數,看看是否有新的東西彈出。 –

+0

你需要爲你的連接和你的命令使用塊。這將始終確保正確調用Dispose方法。發生錯誤的是哪一類? – Josh

回答

5

m8Param在由StatisticsDataAccess.createParams()返回的數組中出現兩次。

+2

感謝您的幫助! 這種尷尬的錯誤:( –

+1

發生的時間:) –

5
SqlParameter[] paramList = { 
      idParam, m1Param, m2Param, m3Param, m4Param,        
      m5Param, m6Param, m7Param, **m8Param**, **m8Param**, 
          m10Param, m11Param, m12Param }; 
相關問題