asp.net
  • database
  • 2012-06-08 4 views 0 likes 
    0

    У меня есть приложение asp.net, которое сохраняет некоторые данные пользователей, используя форму сообщения. Для этого у меня есть простой запрос, указанный ниже.Почему этот простой запрос прерывается?

    "UPDATE myTable SET LastUpdatedOn='" 
    + DateTime.UtcNow + "', Completed='1' 
    WHERE ID='" + requestid + "'" 
    

    Это не удается несколько раз. Но я думаю, что с этим нет никаких проблем. Поэтому, пожалуйста, дайте мне знать, почему это происходит.

    +4

    Сбой как в не обновляет или не вызывает исключение? Помогите нам помочь вам. –

    +0

    Какая ошибка? –

    +1

    Вы должны использовать параметризованные запросы. Я не знаю, откуда берутся ваши параметры, но вы можете столкнуться с атакой на SQL-инъекцию. Я также помогу вам забыть о формате параметров. –

    ответ

    0

    DateTime.UtcNow вряд ли будет синтаксически анализироваться по дате времени для запроса. Попробуйте:

    DateTime.UtcNow.ToString ('YYYY-MM-дд чч: мм: сс')

    (также, возможно, я бы испортил мой "м в", так что дважды проверьте его)

    +0

    Хотя я бы также подозревал дату, которая не коррелирует с утверждением «не удалось несколько раз». Я думал, что он просто не обновляется, потому что 'requestid' не соответствует записи. –

    +0

    обновления обычно не сбой, если они не соответствуют никаким записям. –

    +0

    Он не оценил «неудачу». –

    0

    InstEd использования DateTime.UtcNow рассмотреть возможность использования getdate() если Sql Sevrer или simmilar функции в любой базе данных вы используете

    "UPDATE myTable SET LastUpdatedOn= getdate(), Completed='1' WHERE ID='" + requestid + "'" 
    
    +0

    getdate() - это sql-сервер, который не указан ... –

    +0

    edit made - simmilar поддерживаемая функция в любой базе данных, которую вы используете – swapneel

    0

    Я точно не знаю, почему это будет ломаться. Нам нужно будет увидеть схему таблицы, чтобы лучше понять, что может произойти неправильно. В другой заметке я бы предложил вам использовать параметризованные запросы, а не просто конкатенировать ваш запрос. Ваш текущий запрос может быть уязвим для SQL-инъекции в зависимости от того, откуда поступают данные. Попробуйте изменить свой код, чтобы что-то вроде этого, чтобы увидеть, если он устраняет ошибку (это будет также уменьшить риск инъекции SQL):

    SqlCommand cmd = new SqlCommand("UPDATE myTable SET LastUpdatedOn = @LastUpdatedOn, Completed = @Completed WHERE ID = @RequestId", sqlConnectionObject); 
    cmd.Parameters.AddWithValue("@LastUpdatedOn", DateTime.UtcNow); 
    cmd.Parameters.AddWithValue("@Completed", 1); 
    cmd.Parameters.AddWithValue("@RequestId", requestid); 
    cmd.ExecuteNonQuery(); 
    
    1

    Вы должны ознакомиться с параметризованных запросов и начать использовать их, чтобы защитить систему от SQL Injection attacks.

    using (var cmd = conn.CreateCommand()) { 
        cmd.CommandText = 
         "UPDATE myTable SET [email protected], Completed='1' WHERE [email protected]"; 
        cmd.Parameters.AddWithValue("@Time", DateTime.UtcNow); 
        cmd.Parameters.AddWithValue("@Id", requestid); 
        var count = cmd.ExecuteNonQuery(); 
        if (count != 1) { 
         Console.Error.WriteLine(
          "Warning: Cannot update myTable for ID {0}", requestid 
         ); 
        } 
    } 
    

    В качестве дополнительного преимущества, такой подход исключает все возможные проблемы форматирования данных и ускоряет свои запросы, позволяя планы запросов кэша SQL Server. Но главным преимуществом является предотвращение попыток «Bobby Tables» мира получить несанкционированный доступ к вашей системе.

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