Как выполнить запрос на удаление, включающий поля 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();

Но действительно. Используйте параметризованные запросы

Другие вопросы по тегам