2016-12-30 31 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),因此不會更新記錄。

現在我想知道在我得到機會之前誰更新了我的表...

相關問題