2015-04-15 50 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注入攻击(对于此特定查询不是严格必要的,因为我们有一个安全的已知输入),它有助于使用缓存的查询计划,如果使用不同的值执行两次相同的查询。 –