У меня есть библиотека .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).
Теперь я задаюсь вопросом, можно ли переопределить это поведение по умолчанию.