2

我有一个执行创建,编辑,删除和读取操作的存储过程。将数据类型nvarchar转换为int时出错 - 执行存储过程时

ALTER PROCEDURE [dbo].[CURDOpSP]  
@operation varchar(50), 
@regid int = 0, 
@fname varchar(50) = null, 
@lname varchar(50) = null, 
@phone varchar(50) = null, 
@email varchar(50) = null 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
if(@operation = 'Insert') 
BEGIN 
    insert into Register(fname,lname,phone,email,status)values(@fname,@lname,@phone,@email,0); 
END 

else if(@operation = 'Select') 
BEGIN 
    select * from Register where status = 0; 
END 

else if(@operation = 'Edit') 
BEGIN 
    update Register set fname= @fname, lname = @lname, phone = @phone, email = @email where RegisterId = @regid; 

END 

else if(@operation = 'Delete') 
BEGIN 
    Update Register set status = 1 where RegisterId = @regid; 
END 
END 

而且我在Controller上调用了这个过程。

// GET: /Employee/Create 
public ActionResult Create() 
{ 
    return View(); 
} 

// POST: /Employee/Create 
[HttpPost] 
public ActionResult Create(Register register) 
{   
    if (ModelState.IsValid) 
    { 
     db.Database.ExecuteSqlCommand("dbo.CURDOpSP @p0, @p1, @p2, @p3, @p4", "Insert", register.fname, register.lname, register.phone, register.email); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(register); 
} 

// POST: /Employee/Delete/5   
public ActionResult Delete(int id) 
{ 
    Register register = db.Registers.Find(id); 
    if (register == null) 
    { 
     return HttpNotFound(); 
    }   
    db.Database.ExecuteSqlCommand("dbo.CURDOpSP @p0, @p1", "Delete",register.RegisterId); 

    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

当我尝试创建一个新的记录,我得到这个错误:

Error converting data type nvarchar to int.

Source Error:

Line 40: if (ModelState.IsValid)

Line 41: {

Line 42: db.Database.ExecuteSqlCommand("dbo.CURDOpSP @p0, @p1, @p2, @p3, @p4", "Insert", register.fname, register.lname, register.phone, register.email);

Line 43: db.SaveChanges();

Line 44: return RedirectToAction("Index");

其他三个操作工作的罚款。

如果我把在存储过程中参数@regid,在参数声明类似的末尾:

ALTER PROCEDURE [dbo].[CURDOpSP]  
@operation varchar(50),  
@fname varchar(50) = null, 
@lname varchar(50) = null, 
@phone varchar(50) = null, 
@email varchar(50) = null, 
@regid int = 0 

然后创建将被罚款。但现在删除功能将无法正常工作。

+0

看起来你应该有独立的存储过程,所以你可以只为每个存储过程的相应参数... –

+1

你的SP预计6个paramters所以在删除您需要通过其他paramters为好。 – Mairaj

回答

3

你需要传递其他参数,当你用Delete这样的方法调用它。我猜想参数器@regid最后会像你发布的那样结束。

db.Database.ExecuteSqlCommand("dbo.CURDOpSP @p0, @p1,@p2,@[email protected],@p4,@p5", "Delete","","","","",register.RegisterId); 
相关问题