UpdateParameters with datetime

时间:2013-05-10 02:18:08

标签: asp.net sql-server

我正在尝试使用sqldatasource.UpdateParameters.Add()向我的数据库表添加日期/时间。 列数据类型是smalldatetime,它在gridview中显示就好了。如果我尝试结束编辑此日期/时间,则保存其他字段更新的更改,但日期/时间保持不变。我尝试过使用DateTime.Parse方法但没有成功。

sqlds1.UpdateParameters.Add("MeasurementDateTime", Data.DbType.DateTime, currentMsrmntDateTime.Text)

我对每个相应的值和参数对使用上面的代码,但是日期/时间字段不会更新。 update语句再次适用于除日期/时间之外的所有参数。

 CREATE PROCEDURE [dbo].[UpdateCathodeTemps]
(
    @MeasurementTypeCode int
    ,@MeasurementDateTime smalldatetime
    ,@Value nvarchar(50)
    ,@Comments nvarchar(512)
    ,@IsMeasurementChecked bit
    ,@MeasurementCheckedBy nvarchar(50)
    ,@BakeDetailsID int
    -- 7 Params
) AS



BEGIN TRANSACTION

UPDATE tblMeasurementsAtPeriod
SET MeasurementDateTime =  @MeasurementDateTime, 
Value = @Value, 
Comments = @Comments, 
MeasurementCheckedBy = @MeasurementCheckedBy, 
IsMeasurementChecked = @IsMeasurementChecked, 
MeasurementTypeCode = @MeasurementTypeCode, 
BakeDetailsID = @BakeDetailsID  
WHERE MeasurementDateTime = @MeasurementDateTime AND MeasurementTypeCode = @MeasurementTypeCode


IF @@ERROR <> 0
BEGIN
    ROLLBACK
    RETURN
END



COMMIT

当我点击保存按钮时没有抛出任何错误,所有其他字段都会更新,但日期/时间保持不变。我已经检查了值,因为它们被传递给存储过程,它们正如我所料。

2 个答案:

答案 0 :(得分:2)

以下是存储过程的WHERE子句中的问题:

WHERE MeasurementDateTime = @MeasurementDateTime AND 
      MeasurementTypeCode = @MeasurementTypeCode

所以你要更新到完全相同的日期!

where子句选择具有给定MeasurementDateTime的行,然后更新这些行,但您要更新的MeasurementDateTime是相同的(显然)。

也许你想要2个参数:

,@OriginalMeasurementDateTime smalldatetime
,@NewMeasurementDateTime smalldatetime

答案 1 :(得分:0)

我认为您的UPDATE查询可能存在缺陷 -

您正在尝试更新 MeasurementDateTime,但您的WHERE子句正在查找与您尝试更新MeasurementDateTime的值相同的记录,因此您赢了“要更新相同的记录。您将更新没有记录(如果没有记录具有相同的值),或者您将更新其他记录。

这可能是你想要做的,但对我来说这似乎很奇怪。为之前的值设置另一个参数来搜索并将其更新为 new 值似乎更合乎逻辑:

UPDATE tblMeasurementsAtPeriod
SET MeasurementDateTime =  @NewMeasurementDateTime, /* NEW date value */
    Value = @Value, 
    Comments = @Comments, 
    MeasurementCheckedBy = @MeasurementCheckedBy, 
    IsMeasurementChecked = @IsMeasurementChecked, 
    MeasurementTypeCode = @MeasurementTypeCode, 
    BakeDetailsID = @BakeDetailsID  
    WHERE MeasurementDateTime = @OldMeasurementDateTime /* OLD date value */
      AND MeasurementTypeCode = @MeasurementTypeCode