2015-04-15 3 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 Date Casting в вашем запросе – 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-инъекций (не обязательно для этого конкретного запроса, потому что у нас есть безопасный ввод), он помогает использовать кешированные планы запросов, если вы дважды выполняете один и тот же запрос с разными значениями. –

Смежные вопросы