Выполнение операции Insert в SqlDataSource с параметром типа uniqueidentifier

Представляю вниманию читателей переводную статью о решении проблемы возникновения исключения “Implicit conversion from data type sql_variant to uniqueidentifier is not allowed” при использовании SqlDataSource.

Сценарий: Создаем страницу с редактируемым GridView или DetailsView (FormView) с поддержкой операции добавления записей. Эти контролы используют SqlDataSource содержимое которого сгенерировано с использованием Configure Data Source wizard. Выражение SELECT в SqlDataSouce возвращает колонку с типом uniqueidentifier (GUID), и wizard сконфигурирован для автоматической генерации INSERT, UPDATE и DELETE выражений.

Проблема: При попытке обновить или вставить данные в GridView или DetailsView (или FormsView) я получаю исключение с сообщением об ошибке: “Implicit conversion from data type sql_variant to uniqueidentifier is not allowed. Use the CONVERT function to run this query”.

Solution: Вот в этой статье описана такая же проблема (или что то похожее) – это была ошибка в Beta 2, которая (к сожалению) осталась также в RTM.

Причина проблемы кроется в том, что значение в теге <asp:Parameter> для поля с типом uniqueidentifier по умолчанию устанавливается в Type=”Object”. Чтобы исправить проблему, просто удалите свойство Type. Это все, что нужно сделать. Поменяйте настройки параметров SqlDataSource с таких:

<asp:SqlDataSource …>
<InsertParameters>
<asp:Parameter Name=”UserId” Type=”Object” />

</InsertParameters>
</asp:SqlDataSource>

На такие:

<asp:SqlDataSource …>
<InsertParameters>
<asp:Parameter Name=”UserId”  />

</InsertParameters>
</asp:SqlDataSource>

У меня это работает замечательно. Как только параметр Type был удален, exception перестало появляться и операции изменения и вставки записей работают как ожидалось.

Оригинал статьи с решением

Выполнение операции Insert в SqlDataSource с параметром типа uniqueidentifier: 2 комментария

  1. Мурадов Артем

    А я указываю тип String и в запросе на добавление записи делаю convert(uniqueidentifier, @UserId) — потому что бог знает, как будет реагировать sqldatasource в последующих версиях фреймворка, если не указывать тип параметра…

  2. dv

    спасибо, ценное замечание! согласен, что ваш подход лучше 😉
    (нужно будет проверить, поправили ли это в .NET 4)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *