简体   繁体   中英

MVC ADO.NET Expects Parameter Error while inserting values

Problem Message: Message "The parameterized query '(@ProductName nvarchar(3),@SupplierID nvarchar(4000),@CategoryID' expects the parameter '@SupplierID', which was not supplied." string

I've been trying to insert multiple values to product table of Classic North wind Table with MVC Actions. There is not any problem while listing the table but when i try insert values with scaffold-ed Create page(Auto generated) it gives me error in above.

Here is my ProductController and AddProduct cshtml

Controller

public class ProductController : Controller
    {
        public string connectionString = @"Data Source = DESKTOP-O5J7OII\SQLEXPRESS01; Initial Catalog = NORTHWND; Integrated Security = True";
        //NORTHWNDEntities Kod = new NORTHWNDEntities();
        //Product x = new Product();

        public ActionResult Index(Product t = null)
        {


            DataTable tableProduct = new DataTable();
            using (SqlConnection sqlCon = new SqlConnection(connectionString))
            {
                sqlCon.Open();
                SqlDataAdapter sqlDA = new SqlDataAdapter("use NORTHWND SELECT * FROM Products Order By ProductID ASC", sqlCon);
                sqlDA.Fill(tableProduct);

            }

            return View(tableProduct);


            //var result = Kod.Products.Where(x => x.ProductID > 0).OrderBy(x => x.ProductID).ToList();


            //return View(result.ToList());
        }

        public ActionResult AddProduct()
        {
            return View(new WebApplication1.Product());
        }

        [HttpPost]
        public ActionResult AddProduct(Product productModel)
        {
            using (SqlConnection sqlCon = new SqlConnection(connectionString))
            {
                sqlCon.Open();
                string query = @"INSERT INTO Products VALUES(@ProductName,@SupplierID,@CategoryID,@QuantityPerUnit,@UnitPrice,@UnitsInStock,@UnitsOnOrder,@ReorderLevel)";
                SqlCommand sqlCmd = new SqlCommand(query, sqlCon);
                sqlCmd.Parameters.AddWithValue("@ProductName", productModel.ProductName);
                sqlCmd.Parameters.AddWithValue("@SupplierID", productModel.SupplierID);
                sqlCmd.Parameters.AddWithValue("@CategoryID", productModel.CategoryID);
                sqlCmd.Parameters.AddWithValue("@QuantityPerUnit", productModel.QuantityPerUnit);
                sqlCmd.Parameters.AddWithValue("@UnitPrice", productModel.UnitPrice);
                sqlCmd.Parameters.AddWithValue("@UnitsInStock", productModel.UnitsInStock);
                sqlCmd.Parameters.AddWithValue("@UnitsOnOrder", productModel.UnitsOnOrder);
                sqlCmd.Parameters.AddWithValue("@ReorderLevel", productModel.ReorderLevel);
                sqlCmd.Parameters.AddWithValue("@Discontinued", productModel.Discontinued);
                sqlCmd.ExecuteNonQuery();
            }
            return RedirectToAction("Index");
        }

And The .cshtml

@model WebApplication1.Product

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Product</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.ProductName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ProductName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.ProductName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.QuantityPerUnit, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.QuantityPerUnit, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.QuantityPerUnit, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.UnitPrice, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UnitPrice, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.UnitPrice, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Discontinued, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <div class="checkbox">
                    @Html.EditorFor(model => model.Discontinued)
                    @Html.ValidationMessageFor(model => model.Discontinued, "", new { @class = "text-danger" })
                </div>
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Thank you who tried to help and replied! :)

First problem is you are supplying more parameters(9) than your query needs(8). @Discontinued is not neccessary.

Error indicates that @SupplierID is not supplied. Which means it has null value. Check db if that column supports null values. Then change that line as below:

sqlCmd.Parameters.AddWithValue("@SupplierID", productModel.SupplierID ?? DBNull.Value);

?? is null coalesce operator. Using stored procedure is adviced:

CREATE PROC AddProduct
@ProductName nvarchar(100),
@SupplierID int=null, /*This line inserts a DBNull, if parameter is null*/
@CategoryID int,
@QuantityPerUnit int,
@UnitPrice money,
@UnitsInStock int,
@UnitsOnOrder int,
@ReorderLevel int
BEGIN

INSERT INTO Products VALUES(@ProductName,@SupplierID,@CategoryID,@QuantityPerUnit,@UnitPrice,@UnitsInStock,@UnitsOnOrder,@ReorderLevel)

END

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM