#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();
поскольку в противном случае он не примет параметр.