2015-04-15 80 views
0

我正在使用C#向SQL服務器發出請求。請求需要在2個時間戳(日期和小時)之間。問題是如果我只把日期(2015-04-15)它的工作原理,但如果我把時間放在後面(2015-04-15 16:00:00)它不再工作,並顯示錯誤:「接近' 16'的語法不正確。「具有時間戳的SQL請求

我嘗試不同的事情,但我找不到方法。

這裏是我的代碼:

DateTime Endtime = Convert.ToDateTime(DateTime.Now.Date.ToString("d") + " " + DateTime.Now.AddHours(1).Hour.ToString("00") + ":00:00"); 
DateTime Starttime = Convert.ToDateTime(DateTime.Now.Date.ToString("d") + " " + DateTime.Now.Hour.ToString("00") + ":01:00"); 

string time = string.Empty; 

SqlConnection sqlCon = new SqlConnection("..."); 
sqlCon.Open(); 
SqlCommand sqlCmd = new SqlCommand("SELECT COUNT(TimeStamp) FROM net WHERE Timestamp BETWEEN " + Starttime.ToString("yyyy-MM-dd hh:mm:ss") + " AND " + Endtime.ToString("yyyy-MM-dd hh:mm:ss"), sqlCon); 

SqlDataReader reader = sqlCmd.ExecuteReader(); //Error comes from here 
while (reader.Read()) 
{ 
    time = reader[0].ToString(); 
} 

Console.WriteLine(time); 

你有什麼想法,使之?

+0

在查詢中使用SQL日期鑄造 – Jankya

+3

或者只是在日期'WHERE Timestamp BETWEEN''...' –

+0

周圍添加單引號此外,只要確定:'TimeStamp'在數據庫中的類型爲'DateTime',是的? – DWright

回答

5

如何使這一參數化查詢,如:

// Somewhere in your class declaration: 
// Fixed parameterized query text as a constant. 
private const string TimeRangeQuerySQL = 
    "SELECT COUNT(TimeStamp) FROM net WHERE Timestamp BETWEEN @starttime AND @endtime"; 

// ... 
var cmd = new SqlCommand(TimeRangeQuerySQL, sqlCon); 
cmd.Parameters.Add("@starttime", SqlDbType.DateTime).Value = Starttime; 
cmd.Parameters.Add("@endtime", SqlDbType.DateTime).Value = Endtime; 

var reader = sqlCmd.ExecuteReader(); 

// ... 

要注意的是使用,而不是試圖自己裝配查詢字符串參數查詢,讓你不暴露自己好的做法到SQL注入攻擊。您可能想要閱讀little bobby tables的故事。

+1

它不僅防止SQL注入攻擊(對於此特定查詢不是嚴格必要的,因爲我們有一個安全的已知輸入),它有助於使用緩存的查詢計劃,如果使用不同的值執行兩次相同的查詢。 –