2013-06-09 2 views
0

Я пытался получить это право в течение более 2 часов, так что любая помощь будет высоко оцененаВставка DateTime в Sql Server 2008 с C#

public void setAppointment(int studentID, DateTime appt) 
    { 
     connection.Open(); 

     string sqlStatement3 = "UPDATE dbo.students SET appointmentDate = '" + appt.Date.ToString("yyyy-MM-dd HH:mm:ss") + "' WHERE ID = " + studentID + ";"; 

     OleDbCommand updateCommand = new OleDbCommand(sqlStatement3, connection);    
     updateCommand.ExecuteNonQuery(); 

     connection.Close(); 
    } 

Так в основном то, что делает это вставить DateTime в таблицу SQL Server, сохраняя тот же формат месяца и дня, чтобы избежать уклонения от региональных настроек.

Единственная проблема в том, что время остается 00:00:00. Несмотря на то, когда я отладки кода, 'АЧТВ' показывает 28/06/2013 09:30:00

+2

[SQL Injection предупреждение] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - вы должны ** не ** сцепить вместе ваши SQL-запросы - используйте ** параметризованные запросы **, чтобы избежать SQL-инъекции. –

ответ

1

линия 5. Изменить

... appt.Date.ToString(... 

к

... appt.ToString(... 
+0

. Параметрированный запрос, как показано ниже, является более безопасным и быстрым. Вы должны привыкнуть всегда делать это - вы вряд ли столкнетесь с проблемами с int и datetime, но в тот момент, когда вы используете это для строкового значения, вы вводите уязвимости SQL-инъекций. – jedigo

10

попробовать ниже

public void setAppointment(int studentID, DateTime appt) 
     { 
      connection.Open(); 

      string sqlStatement3 = "UPDATE dbo.students SET appointmentDate = ? WHERE ID = ?"; 

      OleDbCommand updateCommand = new OleDbCommand(sqlStatement3, connection); 
      updateCommand.Parameters.AddWithValue("@p1", appt); 
      updateCommand.Parameters.AddWithValue("@p2", studentID); 
      updateCommand.ExecuteNonQuery(); 

      connection.Close(); 
     } 

НО!

Вы говорите, что это сервер sql, но почему вы используете OleDbCommand?

попробовать ниже, если это SQL Server

public void setAppointment(int studentID, DateTime appt) 
{ 
    using (SqlConnection con = new SqlConnection(connectionString)) 
    using (SqlCommand cmd = con.CreateCommand()) 
    { 
     cmd.CommandText = "UPDATE dbo.students SET appointmentDate = @appointmentDate WHERE ID = @ID"; 
     con.Open(); 
     cmd.Parameters.AddWithValue("@appointmentDate", appt); 
     cmd.Parameters.AddWithValue("@ID", studentID); 
     cmd.ExecuteNonQuery(); 
    } 
} 
+0

+1 это абсолютно безопасный способ **, и для SQL Server гораздо разумнее использовать 'SqlConnection/SqlCommand', а не OleDb-файл .... –

+0

Второй ответ - с параметрами - работает как шарм. Раньше я использовал непараметризированные запросы, и у меня были всевозможные проблемы с датами. С параметрами нет проблем. – FrenkyB

0

Я надеюсь, что вы решили проблему с предыдущего поста, и я согласен операторов SQL, которые будут использоваться с параметрами.

Если у вас есть формат даты, формат фиксирован, тогда нет никакого вреда в жестком кодировании, но было бы хорошим кодом, чтобы получить формат времени даты из вашего файла web.config. Это поможет вашему коду быть таким же согласованным общим проектом.

Вместо

ToString ("гггг-ММ-дд чч: мм: сс")

ToString (ConfigValue)

0

слишком поздно, но для ваш вопрос: попробуйте код ниже.

public void setAppointment(int studentID, DateTime appt) 
     { 

connection.Open(); 

    string sqlStatement3 = "UPDATE dbo.students SET appointmentDate = '" + "CONVERT(datetime, '" + appt.Date.ToString("yyyy-MM-dd HH:mm:ss") + "', 103)" + "' WHERE ID = " + studentID + ";"; 

    OleDbCommand updateCommand = new OleDbCommand(sqlStatement3, connection);    
    updateCommand.ExecuteNonQuery(); 

    connection.Close(); 
} 
Смежные вопросы