2009-12-26 2 views
0

когда я компилирую следующий код, возникает ошибка «Преобразование с ошибкой при преобразовании даты и времени из символьной строки», что с этим не так?Ошибка преобразования при преобразовании даты и времени из символьной строки

код:

DateTime after3Dyas = DateTime.Now.AddDays(3); 

     try 
     { 
      Con.Open(); 
      SqlCommand Command = Con.CreateCommand(); 
      Command.CommandText = "Select * from Forcast Where City='" + city + "' And Date between '" + DateTime.Now.Date + "' and '" + after3Dyas.Date + "'"; 

      SqlDataReader thisReader = Command.ExecuteReader(); 

      int i=0; 
      while (thisReader.Read()) 
      { 
       //do something 
       i++; 

      } 

      thisReader.Close(); 

ответ

4

база данных пытается преобразовать значение из любого DateTime.ToString, дает вам ... вы действительно хотите верить, что .NET на вашей вызывающей машине и использование SQL Server точно так же, формат? Это звучит хрупким для меня.

Избегайте этого, не помещая значение непосредственно в SQL - используйте parameterized query. Это не только позволяет избежать проблем с конверсией, но также (не менее важно) позволяет избежать SQL injection attacks.

Пример кода:

DateTime start = DateTime.Now; 
DateTime end = start.AddDays(3); 
string sql = @" 
SELECT * FROM Forecast 
WHERE City = @City AND Date BETWEEN @StartDate AND @EndDate"; 

// Don't forget to close this somewhere. Why not create a new connection 
// and dispose it? 
Con.Open(); 
using (SqlCommand command = new SqlCommand(sql, Con)) 
{ 
    command.Parameters.Add("@City", SqlDbType.NVarChar).Value = city; 
    command.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = start; 
    command.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = end; 
    using (SqlDataReader reader = command.ExecuteReader()) 
    { 
     int i = 0; 
     while (reader.Read()) 
     { 
      //do something 
      i++; 
     } 
    } 
} 
+0

бы вы сказать мне больше?! –

+0

@persian Dev: Я редактировал код в ответ. Посмотрите на это и прочитайте ссылку на свойство 'Parameters' для получения более подробной информации. Любая хорошая книга по доступу к базе данных .NET должна всесторонне охватывать параметризованные запросы. –

0

Попробуйте формат ниже вместо этого:

DateTime.Now.ToString("yyyy-MM-dd") 

Но я настоятельно советую вам использовать параметры, из-за вопросов безопасности:

Command.CommandText = 
    "Select * from Forcast Where [email protected] And Date between @StartDate and @EndDate"; 

SqlParameter city = new SqlParameter("@City", SqlDbType.VarChar, 10); 
city.Value = yourCityValue; 
Command.Parameters.Add(city); 

SqlParameter startDate = new SqlParameter("@StartDate", SqlDbType.DateTime); 
startDate.Value = yourStartDate; 
Command.Parameters.Add(startDate); 

SqlParameter endDate = new SqlParameter("@EndDate", SqlDbType.DateTime); 
endDate.Value = yourEndDate; 
Command.Parameters.Add(endDate); 
+0

Вы имеете в виду использование параметров Свойство SqlCommand? –

+0

@persian Dev: Да, точно. – Canavar

0
  1. Вы должны использовать параметризованный запрос.
  2. Если вы не хотите использовать параметризованный запрос, используйте функцию CONVERT:

CONVERT(Datetime,'2009-12-25',120) преобразующий тип VARCHAR для типа даты и времени с заданным форматом. Это также поможет с внедрением sql, но параметры - лучшее решение.

0

Вы должны использовать параметризованные запросы, когда это возможно. Существует несколько причин, таких как:

  1. Вы избежите атак с использованием SQL-атак.
  2. Планы выполнения параметризованных запросов будут кэшироваться сервером sql, поэтому вы получите лучшую производительность при выполнении одного и того же запроса с разными значениями параметров.
  3. Вы избежите необходимости избегать параметров строки.

Обратитесь к следующей статье для получения более подробной информации: http://www.codeproject.com/KB/database/SqlInjectionAttacks.aspx

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

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