2014-09-04 62 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

相关问题