формат даты и времени - PullRequest
       2

формат даты и времени

0 голосов
/ 01 марта 2011

Привет, я пытаюсь вставить в БД дату и время, а столбец - это тип даты, что мне нужно сделать? это код

  string query = "INSERT INTO Feedback (user_Name, date_of_, Praise)  VALUES     ('"+TextBox1.Text+"',"+DateTime.Now+",'"+TextBox2.Text+"')";
    SqlCommand cmd = new SqlCommand(query, con);
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();

Ответы [ 7 ]

6 голосов
/ 01 марта 2011

Я бы не советовал использовать время с сервера приложений для вставки значений в базу данных. Самый простой пример того, как это может пойти не так, это то, что у вас может быть два сервера, настроенных на разные часовые пояса, которые используют одну и ту же базу данных. Какое время сервера подходит?

Другая вещь - это необходимое преобразование даты и времени в строку, когда вы используете встроенные операторы SQL. Если сервер приложений и сервер базы данных настроены на разные культуры, вам нужно быть очень осторожным, чтобы не вставить 2 мая (02.05), когда вы хотите вставить 5 февраля (02.05).

Конечно, всех этих проблем можно избежать, но зачем вообще их беспокоить, если СУБД может сделать все это за нас?


Кстати, даже если вы не хотите использовать хранимые процедуры, используйте параметры.
Этот код должен быть переформатирован как:

string query = "INSERT INTO Feedback (user_Name, date_of_, Praise)  VALUES     (@username, getdate(), @praise)"; 

SqlCommand cmd = new SqlCommand(query, con);
SqlParameter param = new SqlParameter("@username", SqlDbType.Text);
param.Value = text1;
cmd.Parameters.Add(param);

param = new SqlParameter("@praise", SqlDbType.Text);
param.Value = text2;
cmd.Parameters.Add(param);

con.Open(); 
cmd.ExecuteNonQuery(); 
con.Close(); 
5 голосов
/ 01 марта 2011

Не включайте значение непосредственно в ваш SQL .

Вместо этого используйте параметризованный запрос.Нет смысла возиться с форматированием строк, когда база данных вполне способна принять подготовленный оператор с параметром DateTime.

Вы должны привыкнуть использовать параметры запроса для all значения, которые не могут быть просто жестко запрограммированы в SQL для начала.Например, ваш запрос в настоящее время просто беспечно берет содержимое TextBox1.Text и вставляет его в SQL.Это рецепт атаки SQL-инъекцией.

Вы должны отделить код (SQL) от data (значения).Параметризованные запросы - способ сделать это.

РЕДАКТИРОВАТЬ: Использование встроенной в SQL функции хорошо, конечно, если вы счастливы использовать идею базы данных «сейчас» вместо вашего клиентаИдея "сейчас".Подумайте, что больше подходит для вашей ситуации.

2 голосов
/ 01 марта 2011

Почему вы не используете столбец TIMESTAMP в своей базе данных? Похоже, накладные расходы, вставив его через ваш код.

Следующая ссылка предоставляет дополнительную информацию:

http://msdn.microsoft.com/en-us/library/aa260631(SQL.80).aspx

edit: Установите значение по умолчанию для столбца вашей базы данных как CURRENT_TIMESTAMP (Transact-SQL) и оставьте имя столбца вне оператора вставки. Текущая дата и время будут вставлены вашей базой данных автоматически. Больше никаких проблем с конверсиями!

1 голос
/ 01 марта 2011

В большинстве реализаций SQL есть функция NOW ().

1 голос
/ 01 марта 2011

Заменить DateTime.Now на DateTime.Now.ToString("yyyy-MM-dd");

Кроме того, вы действительно должны параметризовать оператор вставки, чтобы вы не могли стать жертвой SQL-инъекции атаки.

0 голосов
/ 01 марта 2011

Вы можете использовать свойство Date:

DataTime.Now.Date
0 голосов
/ 01 марта 2011

Вы должны преобразовать свой DateTime в литерал Sql DateTime.Самый простой способ сделать это:

DateTime.Now.ToString(System.Globalisation.CultureInfo.InvariantCulture)

Тем не менее, особенно для DateTime.Now, вы можете использовать некоторую функцию Sql, такую ​​как GetDate(), но это часто зависит от вашего сервера базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...