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); 
相關問題