2016-12-30 95 views
-1

下面的代码看看:C#为什么我的日期时间总是空?

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]列空。

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语句执行。

下面是我在Management Studio中运行SQL审查结果:

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 

我在做什么错?

+4

可能是因为您的WHERE子句没有返回任何更新行。 – Fabio

+1

也许是因为SQL Server无法将您的'@ SubmittedAt'参数值识别为日期。你为什么要调用'.ToString()'而不是简单地传递'DateTime.Now'? –

+2

您正在将日期转换为字符串。 “SumbittedAt”专栏是什么类型? – ChrisF

回答

0

假设 “SubmittedAt” 是SQL日期时间字段,而不是使用这种

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]成功。在您的更新查询中,您指定了Update 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()查询。

+0

我的不好,我在*后显示结果* *我会更正我的帖子 – yozepi

+0

我已经更改我的代码以使用Dat eTime.Now。同样的结果。 – yozepi

+0

你连接到正确的数据库吗?有时,我们可能会将代码指向不同的服务器(DEV,UAT,QA等),并最终在不同的数据库服务器上进行验证。 –

0

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

现在我想知道在我得到机会之前谁更新了我的表...

相关问题