Дырявые абстракции
Sep. 3rd, 2006 11:58 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Так вот, к вопросу об отладке MS Jet базы данных, заведенной через OleDbConnection.
Как я уже писал, апдейт таблицы из трех столбцов вызывал исключение "Data type mismatch in criteria expression." причем типы параметров были точно правильными. Причина - неясна.
Решил я сегодня попытаться разобраться с этой фигней. И совершенно случайно всплыла в голове, фраза, сказанная
belnetmon, когда он пытался завести проект, работающий с сервером через ADO. На дельфи, не на .NET: "Параметры надо указывать в том порядке, в котором они идут в запросе". Решил проверить(на самом деле будучи уже уверенным, что именно это причина ошибки):
Код с ошибкой:
cmd.CommandText = "update BaseData set Base_Value=@Val,Base_State=@State where Base_ID=@ID";
OleDbParameter prmid = cmd.Parameters.Add("@ID",OleDbType.Integer);
OleDbParameter prmval = cmd.Parameters.Add("@Val",OleDbType.LongVarChar);
OleDbParameter prmstate = cmd.Parameters.Add("@State",OleDbType.Integer);
Код без ошибки:
cmd.CommandText = "update BaseData set Base_Value=@Val,Base_State=@State where Base_ID=@ID";
OleDbParameter prmval = cmd.Parameters.Add("@Val",OleDbType.LongVarChar);
OleDbParameter prmstate = cmd.Parameters.Add("@State",OleDbType.Integer);
OleDbParameter prmid = cmd.Parameters.Add("@ID",OleDbType.Integer);
Итак, что мы получаем? А получаем мы, что имена параметрам указать можно и при работе с MSSQL они используются. А при работе с MS Jet ADO.NET МОЛЧА ложит на имена болт и проставляет параметры в запрос в том порядке, в каком их добавляли, и движок базы данных выдает ошибку несоответствия типа для условия where.
Более менее осмысленный способ отладки таких вещей - мониторинг запросов на уровне движка базы данных, но поиск по гуглу выдал только пару ссылок на коммерческое ПО с такой функциональностью (и то не факт, что оно в данном случае подойдет).
Как я уже писал, апдейт таблицы из трех столбцов вызывал исключение "Data type mismatch in criteria expression." причем типы параметров были точно правильными. Причина - неясна.
Решил я сегодня попытаться разобраться с этой фигней. И совершенно случайно всплыла в голове, фраза, сказанная
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Код с ошибкой:
cmd.CommandText = "update BaseData set Base_Value=@Val,Base_State=@State where Base_ID=@ID";
OleDbParameter prmid = cmd.Parameters.Add("@ID",OleDbType.Integer);
OleDbParameter prmval = cmd.Parameters.Add("@Val",OleDbType.LongVarChar);
OleDbParameter prmstate = cmd.Parameters.Add("@State",OleDbType.Integer);
Код без ошибки:
cmd.CommandText = "update BaseData set Base_Value=@Val,Base_State=@State where Base_ID=@ID";
OleDbParameter prmval = cmd.Parameters.Add("@Val",OleDbType.LongVarChar);
OleDbParameter prmstate = cmd.Parameters.Add("@State",OleDbType.Integer);
OleDbParameter prmid = cmd.Parameters.Add("@ID",OleDbType.Integer);
Итак, что мы получаем? А получаем мы, что имена параметрам указать можно и при работе с MSSQL они используются. А при работе с MS Jet ADO.NET МОЛЧА ложит на имена болт и проставляет параметры в запрос в том порядке, в каком их добавляли, и движок базы данных выдает ошибку несоответствия типа для условия where.
Более менее осмысленный способ отладки таких вещей - мониторинг запросов на уровне движка базы данных, но поиск по гуглу выдал только пару ссылок на коммерческое ПО с такой функциональностью (и то не факт, что оно в данном случае подойдет).
no subject
Date: 2006-09-03 09:42 pm (UTC)no subject
Date: 2006-09-04 05:45 am (UTC)Вообще, без комментариев.
ЗЫ Я от использования АДО категорически отказался.
no subject
Date: 2006-09-04 09:52 pm (UTC)если не используете изолейшн левелс то отлично работает, и быстро
no subject
Date: 2006-09-04 07:27 am (UTC)no subject
Date: 2006-09-04 07:43 am (UTC)