2016-12-31 23 views
1

在這行代碼:> =工作不正常

sql = "Select CustomerNumber,Surname,Villa, 
     Village,Suburb,BookedinDate,BookedInOrder 
     FROM Customers WHERE 
     (BookedInDate >= @StartPeriod And BookedInDate <= @EndPeriod)" 

其中

cmd.Parameters.AddWithValue("@StartPeriod", StartPeriod) 
cmd.Parameters.AddWithValue("@EndPeriod", EndPeriod) 

StartPeriod = "01-09-2017" 
EndPeriod = "01-15-2017" 

該數據表包含一個記錄以「01-一個BookedInDAte值09-2017「,但沒有在上面的Sqlite字符串中找到。

任何幫助,將不勝感激 布拉德

回答

1

這是usual problem with AddWithValue。你傳遞給它一些字符串,並期望數據庫引擎將它們轉換爲日期時間值。
這是從一開始就註定要失敗的。 AddWithValue構建一個參數,其數據類型與傳遞的值相同,當然一個字符串參數無效用於在DateTime列上進行搜索。

您應該使用

cmd.Parameters.Add("@StartPeriod", DbType.Date).Value = DateTime.Parse(StartPeriod) 
cmd.Parameters.Add("@EndPeriod", DbType.Date).Value = DateTime.Parse(EndPeriod) 

當然,這正常工作僅當您的表列是DateTime類型。如果他們只是字符串,那麼我們有一個完全不同的問題。您不應該將日期時間值存儲在字符串列中。您使用正確的數據類型,否則您將永遠無法針對這些列編寫正確的查詢。

+0

謝謝史蒂夫我試過這些改變,但仍然無法正常工作。我的數據類型是DATE,而不是DATETIME,所以在SQLite中進行了更改,但它仍然無法找到該記錄。變量StartPeriod和EndPeriod也是日期變量。 – Brad

+0

我很抱歉,但無法重現該問題。我已經嘗試過使用SQLite數據庫,並且按照預期使用Date或DateTime列進行所有工作。所以它應該是不同的東西,你使用什麼版本的SQLite?您是否調試過代碼以確定兩個變量的值? – Steve

+0

我不明白的是,每週的其他日子的記錄都會出現並被選中,它只是星期一的一個記錄,即> =搜索條件。我將不得不回去檢查可能影響結果的代碼的其他部分。謝謝你的幫助史蒂夫。 – Brad

1

可以做到這一點,通過拼湊的正確格式的時間字符串:

StartPeriod = "20170109" 
EndPeriod = "20170115" 
sql = @"Select CustomerNumber, Surname, Villa, Village, Suburb, BookedinDate, 
       BookedInOrder 
     FROM Customer 
     WHERE SUBSTR(BookedInDate,7) || SUBSTR(BookedInDate,4,2) || 
       SUBSTR(BookedInDate,1,2) BETWEEN @StartPeriod AND @EndPeriod" 

但最好將你存儲在一個適當的格式的最新資料,即YYYY-MM-DD

+0

感謝Tim的想法,變量被聲明爲日期,並且數據表中的字段也是Date。正如Steve提到的,我不想使用字符串,因爲它造成了更多的麻煩。 – Brad

+0

@Brad SQLite中沒有日期類型。您正試圖比較具有不可用格式的字符串。我的答案應該解決這個問題。 –