繁体   English   中英

尝试通过存储过程将数据插入表中。 不断将数据类型nvarchar转换为int时出错

[英]Trying to Insert data into tables via Stored Procedure. Keep getting Error converting data type nvarchar to int

所以我的问题是,当我尝试通过使用存储过程将数据从视图传递到控制器以输入4个表时,出现“将数据类型从nvarchar转换为int的错误” sql异常。 其中三个表在一个表中具有外键,其中两个外键填充一个下拉列表,最后一个外键将文件上载到目录。

我尝试更改字段的数据类型,但仍然收到错误。 我也将控制器代码与具有相同实现的控制器代码进行了比较,只是少了一张表,而且代码看起来还不错。

我想知道实际上是什么导致此错误,以及如何解决和解决它。

我的观点特别是外键部分:

                <div class="form-group">
                    @Html.LabelFor(model => model.colourID, "Colour", htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                        @Html.DropDownList("colourID", String.Empty)
                        @Html.ValidationMessageFor(model => model.colourID)
                    </div>
                </div>

                <div class="editor-label">
                    <label> Upload FCC Logo </label>
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.Upload, new { type = "file" })
                    @Html.ValidationMessageFor(model => model.Upload)
                </div>

                <div class="form-group">
                    @Html.LabelFor(model => model.formatID, "formatID", htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                        @Html.DropDownList("formatID", String.Empty)
                        @Html.ValidationMessageFor(model => model.formatID)
                    </div>
                </div>

我的控制器的创建方法:

 public ActionResult Create()
        {
            ViewBag.colourID = new SelectList(db.Colours, "colourDesc", "colourDesc");
            ViewBag.logoDocID = new SelectList(db.FCCLogoDocs, "logoDocID", "logoDocTitle");
            ViewBag.formatID = new SelectList(db.Formats, "formatID", "formatName");
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(CreateFCCLogoViewModel createLogo)
        {
            if (ModelState.IsValid)
            {
                var doc = createLogo.Upload;

                var temp = "";
                var temp2 = "";

                if (doc.ContentLength > 0)
                {
                    var docName = Path.GetFileName(doc.FileName);
                    var path = Path.Combine("/Content/FCCLogoDocs", docName);
                    temp = Path.Combine("/Content/FCCLogoDocs", docName);
                    temp2 = docName;
                    doc.SaveAs(Server.MapPath(path));
                }
                else
                {
                    temp2 = "No documentation available";
                }
                SqlParameter pName = new SqlParameter("@Name", createLogo.name);
                SqlParameter pDesc = new SqlParameter("@Desc", createLogo.desc);
                SqlParameter pYear = new SqlParameter("@Year", createLogo.year);
                SqlParameter pColourID = new SqlParameter("@ColourID", createLogo.colourID);
                SqlParameter pDocPath = new SqlParameter("@DocPath", temp);
                SqlParameter pDocName = new SqlParameter("@DocName", temp2);
                SqlParameter pFormatID = new SqlParameter("@FormatID", createLogo.formatID);

                db.Database.ExecuteSqlCommand("spCreateFCCLogo @Name,@Desc, @Year,@ColourID,@DocPath, @DocName, @FormatID",
                                                pName, pDesc, pYear, pColourID, pDocPath, pDocName, pFormatID);

                db.SaveChanges();

                return RedirectToAction("Index");
            }

            ViewBag.colourID = new SelectList(db.Colours, "colourID", "colourDesc", createLogo.colourID);
            ViewBag.formatID = new SelectList(db.Formats, "formatID", "formatName", createLogo.formatID);
            return View(createLogo);
        }

我的存储过程:

CREATE PROCEDURE [dbo].[spCreateFCCLogo]
    @Name varchar(300),
    @Desc varchar(300),
    @Year DateTime,
    @ColourID int,
    @FormatID int,
    @DocName varchar(300),
    @DocPath varchar(300)
AS

BEGIN
    DECLARE @DocID int

    INSERT INTO [dbo].[FCCLogoDoc]([logoDocPath],[logoDocTitle])
    VALUES(@DocPath,@DocName)

    SELECT @DocID = SCOPE_IDENTITY()

    INSERT INTO [dbo].[FCCLogo]([name],[desc],[year],[colourID],[logoDocID],[formatID])
    VALUES(@Name,@Desc,@Year,@ColourID,@DocID,@FormatID)


END

亚伦·伯特兰(Aaron Bertrand)回答了问题。 问题是与代码相比,在存储过程中声明参数的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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