Как выполнить запрос на удаление, включающий поля varchar и datetime в предложении WHERE
Здравствуйте, я пытаюсь удалить из таблицы, где мне нужно получить доступ к полю заметки varchar и поле даты и времени.
Вот код:
DateTime test = (DateTime)powerPlant.timestamp;
string DateUS = test.ToString("s");
string deletePowerPlant =
String.Format(
"DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp] = CONVERT(datetime,"+ DateUS +",111) AND [note] = {0};",
note);
SqlCommand sqlDelete = new SqlCommand(deleteComponents, sqlConnection);
sqlDeletePowerPlant.CommandType = CommandType.Text;
sqlDeletePowerPlant.CommandText = deleteComponents;
sqlDeletePowerPlant.ExecuteNonQuery();
И да, обычно я бы использовал параметры sql, но я хочу знать, как это будет работать без параметров, просто чтобы проверить это, потому что как-то это должно быть возможно. Я попытался гуглить это и с некоторым другим форумом и некоторыми блогами, но безуспешно.
Спасибо за вашу помощь и извините за мой английский.
РЕДАКТИРОВАТЬ
Временная метка поля - это дата и время в таблице. Примечание - это нварчар в таблице. И я просто хочу использовать это один раз, поэтому я могу сказать, что знаю, как это сделать без параметров. Я знаю, это плохо....
2 ответа
Вы должны убедиться, что нет зависимости от локали операционной системы сервера. Поэтому, если вы используете определенный формат (111 в вашем случае) в запросе SQL, вы должны использовать эквивалент.NET для преобразования вашей даты в строку:
string DateUS = test.ToString("yyyy/MM/dd");
Для получения подробной информации о форматах, которые CONVERT
Функция поддерживает, см. здесь: https://msdn.microsoft.com/de-de/library/ms187928(v=sql.120).aspx
Как вы сами заявили в вопросе, использование (строго типизированного) SqlParameter является предпочтительным способом. Невыполнение этого требования может привести к уязвимости SQL инъекций.
При условии note
текстовый столбец, требуются одинарные кавычки и экранирование:
String.Format(
"DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp]=CONVERT(datetime,'{0}',111) AND [note]='{1}'",
DateUS
note.Replace("'","''").Replace(@"\",@"\\")
);
Если вы храните время суток, сравнение с =
не повлияет на записи с ненулевым компонентом времени.
Поместите некоторые строковые квалификаторы туда
DateTime test = (DateTime)powerPlant.timestamp; string DateUS = test.ToString("s");
string deletePowerPlant = String.Format("DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp] = CONVERT(datetime,'"+ DateUS +"',111) AND [note] = '{0}';", note);
SqlCommand sqlDelete = new SqlCommand(deleteComponents, sqlConnection);
sqlDeletePowerPlant.CommandType = CommandType.Text;
sqlDeletePowerPlant.CommandText = deleteComponents;
sqlDeletePowerPlant.ExecuteNonQuery();
Но действительно. Используйте параметризованные запросы