![](/img/trans.png)
[英]Error converting data type nvarchar to int - while executing stored procedure
[英]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.