Не удалось преобразовать значение параметра из временного интервала в дату-время

#asp.net #.net #sql #vb.net

#asp.net #.net #sql #vb.net

Вопрос:

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

 Failed to convert parameter value from a TimeSpan to a DateTime.
  

Передача значения текстового поля:

 .CamActiveDateFrom = CDate(uitxtCamDateStart.Text.Trim)
  

Моя переменная и свойство:

 Private _camActiveTimeFrom As Nullable(Of TimeSpan)

Public Property CamActiveTimeFrom() As Nullable(Of TimeSpan)

Get     

Return Me._camActiveTimeFrom        

End Get     

Set(ByVal value As Nullable(Of TimeSpan))            

Me._camActiveTimeFrom = value      

End Set    

End Property
  

Параметр:

  AddInParameter(dbCommand,

    "@ActiveTimeFrom", DbType.Time, 6, DBNull.Value)                

    If (.CamActiveTimeFrom).HasValue Then

     dbCommand.Parameters("@ActiveTimeFrom").Value = .CamActiveTimeFrom     

End If
  

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

1. Какая именно строка выдает ошибку?

2. Привет, когда я выполняю свою SQL-команду: retAutoID = CType(ExecuteScalar(DbCommand), целое число)

3. В сообщении об ошибке сказано все. Временной интервал не является DateTime. Эти два типа несовместимы.

Ответ №1:

DbType.Time документируется как:

Тип, представляющий значение DateTime SQL Server. Если вы хотите использовать значение времени SQL Server, используйте SqlDbType.Time .

Поэтому либо используйте SqlDbType.Time вместо этого, либо установите значение в DateTime значение вместо TimeSpan значения.

По общему признанию, в этой таблице сопоставления показано DbType.Time сопоставление с TimeSpan , поэтому здесь есть некоторая несогласованность, но если вы можете использовать более конкретный тип, это может быть только хорошо.

Конечно, легко построить a DateTime из a TimeSpan , если вы хотите — вам, вероятно, следует выбрать конкретную дату для использования всегда (например, 1 января 2000 года), чтобы затем вы могли сравнивать значения в базе данных и эффективно сравнивать только биты времени.

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

1. Только что нашел это спустя годы, но когда я пытаюсь db. AddInParameter(DbCommand, «TimeOfDayStart», SqlDbType.Time, newFolderSelectionValue. TimeOfDayStart); Я получаю аргумент 3: невозможно преобразовать из ‘System.Data.SqlDbType’ в ‘System.Data.DbType’, если я попытаюсь преобразовать его в db. AddInParameter(DbCommand, «TimeOfDayStart», (DbType)SqlDbType.Time, значение newFolderSelectionValue. TimeOfDayStart); Я получаю System. Исключение ArgumentException : не существует сопоставления DbType 32 с известным SqlDbType .

2. Выяснил, что добавит еще один комментарий вместо ответа на ваш.

Ответ №2:

У меня та же проблема. И я решил, что он просто использовал «toString ()».

мой код выглядит следующим образом: тип даты «info.START_TIME» — это TimeSpan.

 db.AddInParameter(dbCommand, "@START_TIME", DbType.Time, info.START_TIME.ToString());
  

Ответ №3:

Чтобы использовать AddInParameter со столбцом типа данных time, вам необходимо использовать SqlDbType вместо DbType (как описано в ответе Джона Скита)

 db.AddInParameter(dbCommand, "@ActiveTimeFrom", SqlDbType.Time, 6, DBNull.Value)   
  

вместо

 db.AddInParameter(dbCommand, "@ActiveTimeFrom", DbType.Time, 6, DBNull.Value)   
  

НО.

Для того, чтобы вы использовали SqlDbType .Time вместо DbType.Time вы должны объявить свой объект базы данных как SQLDatabase, то есть

 SqlDatabase db = (SqlDatabase)DatabaseFactory.CreateDatabase();
  

вместо

 Database db = DatabaseFactory.CreateDatabase();
  

поскольку в противном случае он не примет параметр.