ошибка вставка типа DateTime c # в столбец SQL DateTime

#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 это еще -> вставить значение, у меня много полей…