2014-09-04 61 views
0

我試過所有這些工作,我知道我錯過了一些非常簡單的事情。無法使用SQL Server存儲過程更新記錄

我有一個調用存儲過程來更新一個表中的記錄的方法。

恰恰恰巧其中一個參數在數據庫中是可以爲空的,並且它的程序值在這種情況下以vehicleNo列的空字符串(「」)形式出現。

所有其他記錄得到更新,除非一個空字符串進來,我嘗試和更新存儲過程的記錄。

可有人請指出我需要添加到正確使存儲過程或代碼的工作?

下面的代碼,我試過用硬編碼值執行存儲過程,但隨着ImageID沒有更新。

存儲過程

ALTER PROCEDURE [dbo].[SPR_UPDATE_IMAGEID] 
    @ticketNo int, 
    @vehicleNo varchar(6) = NULL, 
    @imageID varchar(20) 
AS 
BEGIN 
    IF ((@vehicleNo = '') OR (@vehicleNo IS NULL)) 
    BEGIN 
     UPDATE dbo.HH_FuelTkt 
      SET Image_ID = @imageID 
      WHERE Ticket_No = @ticketNo 
       AND Vehicle_No = NULL 
    END 
ELSE 
    BEGIN 
     UPDATE dbo.HH_FuelTkt 
      SET Image_ID = @imageID 
      WHERE Ticket_No = @ticketNo 
       AND Vehicle_No = @vehicleNo 
    END END 

C#代碼:

public static bool UpdateData(int ticketNo, string vehicleNo, string imageID) 
{ 
    int retValue = 0; 

    try 
    { 
     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HHInboundSqlConnection"].ToString())) 
     { 
      SqlCommand cmd = new SqlCommand("SPR_UPDATE_IMAGEID", conn); 
      cmd.CommandType = CommandType.StoredProcedure; 

      cmd.Parameters.AddWithValue("@ticketNo", ticketNo); 
      cmd.Parameters.AddWithValue("@vehicleNo", vehicleNo); 
      cmd.Parameters.AddWithValue("@imageID", imageID); 

      cmd.Connection.Open(); 
      retValue = cmd.ExecuteNonQuery(); 
     } 
    } 
    catch (Exception e) 
    { 
     throw e; 
    } 

    return (retValue > 0); 
} 

手冊存儲過程執行#1:

DECLARE @return_value int 

EXEC @return_value = [dbo].[SPR_UPDATE_IMAGEID] 
     @ticketNo = 147058, 
     @vehicleNo = N'''''', 
     @imageID = N'39084' 

SELECT 'Return Value' = @return_value 

手動存儲過程執行#2:

DECLARE @return_value int 

EXEC @return_value = [dbo].[SPR_UPDATE_IMAGEID] 
     @ticketNo = 147058, 
     @vehicleNo = N'NULL', 
     @imageID = N'39084' 

SELECT 'Return Value' = @return_value 
+0

這看起來錯 IF((@vehicleNo <> '')或(@vehicleNo IS NULL)) 豈不是@ vehicleN0 = ''? – ojf 2014-09-04 00:08:49

+0

我沒有看到任何語法錯誤。我嘗試刪除一部分,然後另一部分;單獨運行它們,但仍然無法運行。 – sagesky36 2014-09-04 00:10:48

+0

你不想檢查它是否爲空字符串或null?還有,在第二個sproc中,你是不是指 @vehicleNo = NULL 而不是nvarchar值'NULL' 另外,我不認爲你應該在你的字符串文字前使用N,因爲這表示nvarchar,你是使用變量 – ojf 2014-09-04 00:12:19

回答

2
IF ((@vehicleNo = '') OR (@vehicleNo IS NULL)) 
BEGIN 
    UPDATE dbo.HH_FuelTkt 
     SET Image_ID = @imageID 
     WHERE Ticket_No = @ticketNo 
      **AND Vehicle_No = NULL** 
END 

變化

AND Vehicle_No = NULL 

AND Vehicle_No IS NULL 

通常在我們使用SQL檢查空值IS NULL代替= NULL

+0

我同意@ah_hau。 'something = NULL'是SQL代碼中常見的菜鳥錯誤。 – 2014-09-04 01:32:15

+0

我不能相信我將語句設置爲「= NULL」而不是「IS NULL」。這是漫長的一天......超過12個小時,我的大腦被炸了。我不記得我最後一次犯這個錯誤。謝謝 :) – sagesky36 2014-09-04 12:25:51

相關問題