Создание сопоставления ADO.NET для пользовательского типа - PullRequest
4 голосов
/ 29 декабря 2008

У меня есть пользовательский тип, который я создал, который должен быть сохранен в базе данных (в данном случае, на SQL-сервере) в качестве guid (хотя этот вопрос так же актуален для объекта, который может храниться в виде строки, целого числа , так далее).

Когда я передаю этот тип в качестве параметра объекту DbCommand, я получаю исключение:

ArgumentException: не существует сопоставления между типом объекта [...] и собственным типом известного управляемого поставщика.

В классе есть операторы CType, которые позволяют неявное преобразование в строку или guid, но .NET не использует их, так как не знает, что должно преобразовывать тип.

Есть ли способ добавить тип во внутреннее сопоставление или иным образом сообщить .NET, как хранить мой пользовательский тип в базе данных?

Я, очевидно, могу сам преобразовывать тип при передаче его в .NET, но я бы хотел, чтобы это происходило автоматически, как это происходит с большинством встроенных типов.


Я пытался реализовать класс TypeConverter для моего типа (наследует от TypeConverter, переопределяет CanConvertFrom, CanConvertTo, ConvertFrom, ConvertTo, IsValid и добавил атрибут System.ComponentModel.TypeConverter в мой класс), но это все еще т работа.

Я предполагаю, что в нем отсутствует фрагмент, сообщающий .NET, какой тип преобразовывать при сохранении значения в базе данных.


Мой обходной путь для этого на данный момент заключается в том, что я перехватываю список параметров, прежде чем передать их на сервер SQL, и у меня есть метод, который изменяет мой пользовательский тип на guid. Это грязно, но пока работает, но я все еще думаю, что на этот вопрос нет ответа.

Ответы [ 3 ]

3 голосов
/ 28 августа 2009

Согласно Как передать пользовательский тип в SqlParameterCollection.AddWithValue? , это невозможно. Я также посмотрел на метод GetMetaTypeFromValue, и похоже, что все сопоставления фактически жестко закодированы в платформе, поэтому сопоставление, определенное пользователем, невозможно.

Как досадно, было бы очень полезно иметь атрибут, который определяет отображение для данного типа.

1 голос
/ 22 мая 2012

Для решения проблемы создан интерфейс:


    public interface ICustomDbValue
    {
        object Value { get; }
    }

, и я реализовал это для своего пользовательского типа. Также я завернул создание команд SQL функцией, в которой работает следующий код:


    ...
    IDbCommand command = connection.CreateCommand();
    ...
    ICustomDbValue customParam = rawData as ICustomDbValue;
    object value = customParam != null ? customParam.Value : rawData;
    IDataParameter parameter = command.CreateParameter();
    parameter.Value = value ?? DBNull.Value;
    ...

Все, что мне нужно сделать, это всегда использовать эту функцию и реализовать ICustomDbValue для моих типов. Это почти похоже на использование атрибутов.

0 голосов
/ 29 декабря 2008

Вот несколько ссылок на преобразователи типов в .Net

http://msdn.microsoft.com/en-us/library/yy580hbd.aspx

http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...