Column.DbType, влияющий на поведение во время выполнения

Согласно документам MSDN свойство / атрибут DbType типа / элемента Column используется только для создания базы данных.

Тем не менее, сегодня, когда я пытался отправить данные в столбец IMAGE в базе данных SQLCE (не уверен, если только в CE), я получил исключение «Данные усечены до 8000 байт». Это произошло из-за того, что DbType по-прежнему определяется как VARBINARY (MAX), который SQLCE не поддерживает. Изменение типа на IMAGE в DbType устраняет проблему.

Итак, какие еще сюрпризы преподносят атрибуты Linq2SQL? Это ошибка или это задумано? Я должен сообщить об этом в MS?

ОБНОВЛЕНИЕ

Получив ответ от Guffa, я проверил его, но, похоже, для NVARCHAR (10) добавление строки длиной 11 символов вызывает исключение SQL, а не Linq2SQL.

The data was truncated while converting from one data type to another. 
     [ Name of function(if known) =  ]
A first chance exception of type 'System.Data.SqlServerCe.SqlCeException' 
     occurred in System.Data.SqlServerCe.dll

person leppie    schedule 15.04.2009    source источник
comment
Да, исключение исходит от ADO.NET, а не от LINQ to SQL, поскольку именно ADO.NET обрабатывает проверку типов.   -  person Guffa    schedule 15.04.2009


Ответы (2)


DbType требуется только в том случае, если вы собираетесь создать таблицу, но это не означает, что в остальное время он игнорируется.

Если вы, например, определите столбец VarChar размером 100, вы получите исключение, если отправите строку, длина которой превышает 100 символов, даже если поле в базе данных действительно может содержать строку.

В документации говорится, что вам не следует указывать DbType, если он не нужен, поскольку тип данных выводится из используемого вами значения. Однако могут быть ситуации, когда вы не хотите, чтобы он использовал предполагаемый DbType.

person Guffa    schedule 15.04.2009
comment
Спасибо, я этого не знал, но клянусь, я никогда не видел такого поведения с VARCHAR. Пойду еще раз проверю :) Возможно, это исключение L2S, а не SQL. - person leppie; 15.04.2009
comment
Да, исключение исходит от ADO.NET, а не от LINQ to SQL, поскольку именно ADO.NET обрабатывает проверку типов. - person Guffa; 15.04.2009

Это определенно звучит так, как будто статья MSDN может вводить в заблуждение ... однако LINQ-to-SQL, пока еще жив, не получает большого количества времени на разработку, поэтому я бы не стал задерживать дыхание в ожидании обновления.

Вы можете опубликовать сообщение при подключении или, возможно, добавить замечание на страницу MSDN (Контент сообщества).

person Marc Gravell    schedule 15.04.2009
comment
Спасибо, Марк :) Я буду продолжать использовать Linq2SQL и злоупотреблять ею до тех пор, пока мне не придется писать SQL. - person leppie; 15.04.2009