ASP.NET MVC: не удается извлечь часы, минуты, секунды из базы данных SQL, они всегда показывают 12:00

#c# #sql #asp.net-mvc #datetime #dotnetnuke

#c# #sql #asp.net-mvc #дата и время #dotnetnuke

Вопрос:

Примечание: я также ищу способ AddWithParameter избежать риска SQL-инъекции, но я не уверен, как это сделать с помощью DotNetNuke, так что это второй вопрос к этому вопросу.

Я сохраняю дату как C # DateTime в столбец базы данных SQL datetime . При получении этой даты я не могу получить информацию о hh: mm: ss, она всегда отображает 12:00, но день, месяц, год извлекаются и отображаются правильно.

Вот как я вставляю дату в SQL:

 string sqlDateFormat = "yyyy-MM-dd HH:mm:ss.fff";               
string sqlInsertString = String.Format("INSERT INTO TABLE_NAME (Date_Column_Name) VALUES ({0})", thisDate?.ToString(sqlDateFormat)};

using (IDataContext ctx = DataContext.Instance())
{
    try
    {                  
        ctx.Execute(System.Data.CommandType.Text, 
        sqlInsertString);      
        success = true;                                                     
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}
  

Вот как я извлекаю данные таблицы:

 using (IDataContext ctx = DataContext.Instance())
{
    string sqlString = @"SELECT Date_Column_Name FROM Table_Name  WHERE ID = "   paramId;

    try
    {
        myTableDates = ctx.ExecuteQuery<TableModel> (System.Data.CommandType.Text, sqlString);
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}
  

Вот как я пытаюсь отобразить в представлении:

 <tbody>
    @foreach (TableModel tm in Model.AllTablesDates)
    {
        var dateVar = tm.Date == null ? "N/A" : 
        tm.Date.Value.ToString("dd-MMM-yyyy h:mm tt");

        <tr>
            <td data-title="Day">@dateVar</td>                        
        </tr>
    }
</tbody>
  

Комментарии:

1. Не используйте String.Format для создания вашей команды Sql. Используйте параметризованные запросы. Вы открываете себя для атак с использованием Sql-инъекций.

2. ctx.Execute("INSERT INTO TABLE_NAME (Date_Column_Name)VALUES (@0)", thisDate) . Источник

3. @EmilRR1 Смотрите предоставленную мной ссылку, найдите «листинг 6» на этой странице

4. Можете ли вы открыть свою таблицу с помощью SQL Server Explorer в Visual Studio и выбрать вставленные строки там? Это делается для проверки того, попадает ли правильное значение со временем в базу данных. По этому вы можете выяснить, заключается ли проблема во вставке или извлечении данных. Во-вторых, 12:00 как время может привести к строке кода, в которой вы случайно получаете доступ к свойству «Date» вашего объекта DateTime (см. learn.microsoft.com/de-de/dotnet/api /… )

5. От вас просят проверить тип схемы для этого столбца. Вам нужно посмотреть, поддерживает ли тип временной аспект. В идеале это должен быть тип DateTime2 с точностью 3 или более, но если вы хотите только зафиксировать дату, тогда используйте Date вместо этого. Чего вам не следует делать, так это использовать char / varchar или другие типы текста для записи данных даты или DateTime. Если вы обнаружите, что тип схемы представляет собой некоторое строковое представление, тогда вам нужно перепроектировать свою схему.

Ответ №1:

На основе этого сообщения измените свое утверждение на следующее:

 ctx.Execute("INSERT INTO TABLE_NAME (Date_Column_Name)VALUES (@0)", thisDate);