1

我在这里越来越绝望。我无法弄清楚为什么会发生此异常。我搜索并阅读了这个问题,似乎每个人都设法用 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);
    }

也许我错过了事情如何运作的一些重要方面......我不知道。希望有人可以帮助我,并对长代码段感到抱歉。

4

2 回答 2

6

m8Param在 .返回的数组中出现两次StatisticsDataAccess.createParams()

于 2012-06-11T14:38:00.177 回答
5
 SqlParameter[] paramList = {
            idParam, m1Param, m2Param, m3Param, m4Param,                            
            m5Param, m6Param, m7Param, **m8Param**, **m8Param**,
                             m10Param, m11Param, m12Param }; 
于 2012-06-11T14:41:36.807 回答