C#为什么我的日期时间总是为空?

时间:2016-12-30 18:32:52

标签: c# sql-server

看看以下代码:

const string UPDATE_TIME_STATUS = "UPDATE BilledHour SET [SubmittedAt] = @SubmittedAt, TimeStatus = 2 WHERE EmployeeID = @EmployeeID AND WorkDate >= @FromDate AND WorkDate <= @ToDate AND TimeStatus = 1";

using (m_DAL = new DAL())
{
    SqlCommand cmd = new SqlCommand(UPDATE_TIME_STATUS, m_DAL.sqlConn);
    cmd.CommandType = CommandType.Text;

    cmd.Parameters.Add("@SubmittedAt", SqlDbType.DateTime).Value = DateTime.Now; 
    cmd.Parameters.AddWithValue("@EmployeeID", EmployeeID);
    cmd.Parameters.AddWithValue("@EmployeeID", EmployeeID);
    cmd.Parameters.AddWithValue("@FromDate", FromDate);
    cmd.Parameters.AddWithValue("@ToDate", ToDate);

    int rows = cmd.ExecuteNonQuery();
}

运行此代码后,数据库始终将[SubmittedAt]列显示为null。

WorkDate                TimeStatus  SubmittedAt
-----------------------------------------------
2016-12-26 00:00:00.000 2           NULL
2016-12-27 00:00:00.000 2           NULL
2016-12-28 00:00:00.000 2           NULL
2016-12-29 00:00:00.000 2           NULL
2016-12-30 00:00:00.000 2           NULL

它正在更新[TimeStatus]列,所以我知道SQL语句正在执行。

这是SQL I在Management Studio中运行以查看结果:

DECLARE @EmployeeID int
DECLARE @SubmittedAt datetime
DECLARE @FromDate datetime
DECLARE @ToDate datetime

SET @EmployeeID = 3111
SET @SubmittedAt = GetDate()
SET @FromDate = '12/25/2016 12:00:00 AM'
SET @ToDate ='12/31/2016 12:00:00 AM'

select WorkDate, TimeStatus, SubmittedAt
from BilledHour
WHERE
    EmployeeID = @EmployeeID
AND
    WorkDate BETWEEN @FromDate AND @ToDate

我做错了什么?

2 个答案:

答案 0 :(得分:0)

假设“SubmittedAt”是SQL中的DATETIME字段,而不是使用此

cmd.Parameters.AddWithValue("@SubmittedAt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));

使用此

cmd.Parameters.AddWithValue("@SubmittedAt", DateTime.Now);

或者这(如其他人建议的那样)

cmd.Parameters.Add("@SubmittedAt", SqlDbType.DateTime).Value = DateTime.Now;

另外,您提到它成功更新了[TimeStatus]。在更新查询中,您指定了更新TimeStatus = 2 WHERE TimeStatus = 1 。对于所有记录,结果集的TimeStatus = 1。

WorkDate                TimeStatus  SubmittedAt
2016-12-26 00:00:00.000 1           NULL
2016-12-27 00:00:00.000 1           NULL
2016-12-28 00:00:00.000 1           NULL
2016-12-29 00:00:00.000 1           NULL
2016-12-30 00:00:00.000 1           NULL

您确定要查看正确的数据吗?您可能希望搜索TimeStatus = 2,如下所示

SELECT WorkDate, TimeStatus, SubmittedAt FROM BilledHour Where TimeStatus=2

编辑1:

解决方法:

const string UPDATE_TIME_STATUS = "UPDATE BilledHour SET [SubmittedAt] = GETDATE(), TimeStatus = 2 WHERE EmployeeID = @EmployeeID AND WorkDate >= @FromDate AND WorkDate <= @ToDate AND TimeStatus = 1";

跳过传递日期参数,只在查询中使用SQL函数GETDATE()。

答案 1 :(得分:0)

好的,我错过了显而易见的事。在运行此代码之前,所有[TimeStatus]字段都设置为2.由于更新筛选记录设置为1(AND TimeStatus = 1),因此不会更新任何记录。

现在我在找到机会之前找出谁正在更新我的桌子......