Проблема с типами данных Dapper и Informix Text - PullRequest
0 голосов
/ 10 октября 2018

У меня есть библиотека .NET, которая имеет функциональность для вставки строк в таблицу Informix.Одно из полей в этой таблице имеет тип данных TEXT.Этот код использует Dapper (1.42.0).

В последнее время код самопроизвольно нарушается со следующей ошибкой.

ОШИБКА [HY000] [Informix] [Драйвер ODBC Informix] [Informix] Недопустимая попытка конвертировать текстовый / байтовый тип BLOB-объекта. "} System.Data.Odbc.OdbcException

Исключительная ситуация всплывает из драйвера ODBC через класс Dapper SQLMapper.

В конце концовБыло обнаружено, что проблема совпала с обновлением Windows, которое, по-видимому, нарушало функциональность самого Dapper. Чтобы проверить эту теорию, обновления были удалены, а функциональность восстановлена. К сожалению, у меня не было времени изолировать конкретное обновление.

Точнее говоря, использование обычных типов ODBC в .NET прекрасно работает.

Также отлично работает с динамическими параметрами и анонимной типизацией с Dapper. Вот консольное приложение в качестве примера;

private static void TestDapperAnon()
    {
        using (OdbcConnection cn = new OdbcConnection(connectionString))
        {
            DynamicParameters dparams = new DynamicParameters();
            dparams.Add("?note?", $"Adding a note #{new Random().Next(1000)}", System.Data.DbType.String, System.Data.ParameterDirection.Input);

            cn.Open();
            int result = cn.Execute(query, dparams);
            Console.WriteLine("result was " + result);
            Console.ReadLine();


        }
    }

Что нарушает код, так это использование строго типовой версии запроса с Dapper:

private static void TestDapperStronglyTyped()
    {
        Notepad pad = new Notepad
        {
            id = 0,
            note_id = 999,
            created = DateTime.Now,
            user = "USER",
            note = "meh"
        };
        using (OdbcConnection cn = new OdbcConnection(connectionString))
        {
            cn.Open();
            int result = cn.Execute(query, pad);
            Console.WriteLine("result was " + result);
            Console.ReadLine();
        }
    }

Я не могу показать тип блокнота по соображениям безопасности, но имена его свойств точно совпадают с именами полей, согласно документации Dapper.Я подозреваю, что это как-то связано с тем, как Даппер сопоставляет свойства типа со значениями параметров.

Мой вопрос заключается в том, сталкивался ли кто-нибудь недавно с этой проблемой и есть ли какие-либо предложения относительно исправления?

ОБНОВЛЕНИЕ

Потратив немного времени на изучение этой проблемы, я совершенно случайно обнаружил, что, если я настрою свойство Size параметра команды, я смогу избежать исключения.Динамические параметры, сгенерированные Dapper, имеют свойство Size, равное 4000. Случайно я обнаружил, что если вы установите для этого свойства значение 8001 с помощью средств отладки, исключения можно избежать.Я понятия не имею, почему это 8001.

Я предполагаю, но я подозреваю, что логика Dapper устанавливает размер по умолчанию 4000, когда она генерирует динамические параметры, основанные на типе строки.(Например, см. SqlMapper.cs, строка 2648).

Теперь я задаюсь вопросом, можно ли переопределить это поведение по умолчанию.

...