#c# #sql #datetime
#c# #sql #datetime
Вопрос:
я пытаюсь выполнить команду INSERT в мою базу данных SQLEXPRESS и получаю ошибку при попытке ввести значение в мой столбец DateTime.
это команда sql, которую я использую:
SqlDateTime sTime = new SqlDateTime(book.PublishedDate);
string sql = string.Format("Insert into Books"
"(Name, PublishDate, IsInternal) Values"
"('{0}', '{1}', '{2}')",
book.Name, sTime.Value, book.IsInternal);
книга.publishedDate — это тип DateTime
, а столбец publishedDate — это sql DateTime
я получаю следующую ошибку: преобразование типа данных varchar в тип данных datetime привело к значению вне диапазона.
как я могу это решить?
Ответ №1:
Используйте параметризованные запросы. Они поддерживаются практически в любой технологии доступа к данным, которую вы можете использовать. И они позволяют вам продолжать обрабатывать даты как даты, вместо того, чтобы преобразовывать все в строки.
Например. (ADO.Net SqlCommand)
SqlCommand cmd = new SqlCommand("Insert into Books (Name,PublishDate,IsInternal) Values (@Name,@PublishDate,@IsInternal)");
cmd.Parameters.Add(new SqlParameter("@Name", System.Data.SqlDbType.VarChar, 50));
cmd.Parameters.Add(new SqlParameter("@PublishDate", System.Data.SqlDbType.DateTime));
cmd.Parameters.Add(new SqlParameter("@IsInternal", System.Data.SqlDbType.Bit));
cmd.Parameters["@Name"].Value = book.Name;
cmd.Parameters["@PublishDate"].Value = book.PublishedDate;
cmd.Parameters["@IsInternal"].Value = book.IsInternal;
Самый большой источник ошибок, которые люди допускают, когда сообщают о проблемах с типами данных между своим клиентским кодом и базой данных SQL, заключается в том, что по какой-либо причине они преобразовали все в строки. Это не только обычно менее эффективно, но вы также полагаетесь на корректное выполнение как минимум двух преобразований между ними (Type -> string и string -> Type), и часто по крайней мере одно из этих преобразований будет оставлено для любых функций преобразования по умолчанию.
Комментарии:
1. теперь при использовании параметризованных запросов я получаю ошибку, когда у меня есть нулевые значения в определенных полях: параметризованный запрос ‘(@Name nvarchar (57),@publishDate datetime,@isValid бит,@IsApprov’ ожидает параметр ‘@Author’, который не был указан.
2. @kaycee — Я не вижу ваш код. Код, который я опубликовал до сих пор, почти в точности эквивалентен коду, который вы опубликовали до сих пор.
3. у меня есть поле в запросе, которое имеет значение null cmd.Параметры[«@Author»].Значение = книга. Автор; и если книга. Author == null, затем я получаю ошибку, о которой я только что упомянул… похоже, он не знает, как обращаться с нулевым значением
4. @Kaycee —
cmd.Parameters["@Author"].Value = (object)(book.Author) ?? DBNull.Value;
работает ли?5. да, Дэмиен, это работает. но, похоже, это требует много работы: чтобы проверить, равно ли значение null -> затем DBNull это еще -> вставить значение, у меня много полей…