簡體   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