powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неправильно генерируется SQL-выражение для хранимой процедуры
22 сообщений из 22, страница 1 из 1
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353720
vrastrigin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Когда я пробую запустить простую процедуру с помощью EntityFramework,
я получаю следующую ошибку:
"FirebirdSql.Data.FirebirdClient.FbException: Dynamic SQL Error SQL error code = -204 Implementation limit exceeded ..."
Я предполагаю, что проблема в неправильной генерации SQL-выражения Entity Framework'ом.
Текст процедуры (Firebrd) :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
procedure B_IMP_I_REESTR ( 
    IDUSER integer, 
    IMPMODE integer, 
    IDGEN integer, 
    IDPARENT integer, 
    IDTCH integer, 
    NOMER varchar(15), 
    SBORNIK integer, 
    NAME varchar(250), 
    VIX_DAN blob sub_type 0 segment size 80, 
    ISSYSTEM integer, 
    POKAZ varchar(8), 
    GOD integer, 
    RABMAT integer, 
    IDGROUP integer, 
    IDPODGROUP integer, 
    IDTYPE integer, 
    ORDERVIEW integer, 
    CREATEDATE date, 
    AUTHOR varchar(250), 
    NORM_GUID varchar(100), 
    INSTALL_GUID varchar(100), 
    INDEX_YEAR integer, 
    INDEX_MONTH integer, 
    INDEX_ORGNAME varchar(250), 
    INDTYPE varchar(50)) 
returns ( 
    ID integer) 


Текст процедуры (то, что сгенерировал Entity Framework) :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT 1 AS "C1", "A"."ID" AS "ID" 
FROM "B_IMP_I_REESTR"(CAST(@IDUSER AS INT), CAST(@IMPMODE AS INT), CAST(@IDGEN AS INT), 
CAST(@IDPARENT AS INT), CAST(@IDTCH AS INT), CAST(@NOMER AS VARCHAR(8191)), 
CAST(@SBORNIK AS INT), CAST(@NAME AS VARCHAR(8191)), CAST(@VIX_DAN AS BLOB SUB_TYPE BINARY), 
CAST(@ISSYSTEM AS INT), CAST(@POKAZ AS VARCHAR(8191)), CAST(@GOD AS INT), 
CAST(@RABMAT AS INT), CAST(@IDGROUP AS INT), CAST(@IDPODGROUP AS INT), 
CAST(@IDTYPE AS INT), CAST(@ORDERVIEW AS INT), CAST(@CREATEDATE AS TIMESTAMP), 
CAST(@AUTHOR AS VARCHAR(8191)), CAST(@NORM_GUID AS VARCHAR(8191)), CAST(@INSTALL_GUID AS VARCHAR(8191)), 
CAST(@INDEX_YEAR AS INT), CAST(@INDEX_MONTH AS INT), CAST(@INDEX_ORGNAME AS VARCHAR(8191)), 
CAST(@INDTYPE AS VARCHAR(8191))) 
AS "A" 


Например, почему-то:
INDTYPE varchar( 50 ) -> CAST(@INDTYPE AS VARCHAR( 8191 )) ??????

Я использую следующие версии:
Visual Studio 2013

Firebird 2.5 (Win32)

EntityFramework 6.1.3

FirebirdClient, DDEX-provider - 5.6.0

Подскажите пожалуйста, в чём может быть причина такого преобразования, можно ли это как-либо настроить?
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353723
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Vrastrigin!
You wrote on 24 ноября 2016 г. 14:56:46:

Vrastrigin> Я использую следующие версии:
> # Visual Studio 2013
> # Firebird 2.5 (Win32)
> # EntityFramework 6.1.3
> # FirebirdClient, DDEX-provider - 5.6.0а почему?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353740
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vrastriginCAST(@IDUSER AS INT)
это не Firebird.
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353746
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vrastrigin,

У автора провайдера спроси.

Если я правильно понял процедура добавляет новую запись. Какого хрена ты тогда её через SELECT вызываешь?

З.Ы. Сгенерированный запрос отстой. Неужели внутренний генератор запросов настолько туп, что ему надо каждому параметру преобразование типа делать?
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353749
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

в .NET это нормальное обозначение параметра. В Firebird вне PSQL/EXECUTE STATEMENT именованных параметров нет. Так что драйвер в праве использовать любой понравившийся ему префикс для параметров.
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353781
vrastrigin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий,

Существующий рабочий проект использует Firebird 2.5, необходимо использовать .NET-ORM для работы с данными, хранящимися в БД - EntityFramework. Для его работы в VS нужно установить клиент и провайдер.
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353786
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Vrastrigin!
You wrote on 24 ноября 2016 г. 15:30:39:

Vrastrigin> необходимо использовать .NET-ORM для работы с даннымипочему?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353830
vrastrigin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvvrastriginCAST(@IDUSER AS INT)
это не Firebird.
Спасибо за ответ! Раз проблема не в Firebird, попробую обратиться в ветку по EF.
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353954
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vrastrigin,

я имел в виду, что сгенерированный SQL не для Firebird, а для MS SQL или чего-то другого. У Firebird переменные или параметры предваряются не символом @, а символом :.
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39353970
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

на сервер всё равно уйдут вопросительные знаки "?" вместо именованных параметров. Так что драйверу всё равно какой разделитель использовать, это его личное дело. Так что с этим там всё нормально. Неясно на кой там преобразование типа для каждого параметра, да ещё и к максимальной для UTF8 длине строки.

Селективная процедура с таким набором параметров выглядит подозрительно, так что могу предположить, что эта процедура делает добавление записи. Тогда не понятно почему она вызывается с помощью SELECT.
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39354032
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8 * 8191 = приплыли по длине сообщения в 64КБ. Нафига там все эти касты...
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39354270
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr8 * 8191 = приплыли по длине сообщения в 64КБ. Нафига там все эти касты...Разве не 4 * 8191 ?
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39354273
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

посчитай сколько раз в этом кривом запросе используется число 8191
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39354277
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, аааа... В этом смысле. Понятно.
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39354423
vrastrigin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисkdv,

на сервер всё равно уйдут вопросительные знаки "?" вместо именованных параметров. Так что драйверу всё равно какой разделитель использовать, это его личное дело. Так что с этим там всё нормально. Неясно на кой там преобразование типа для каждого параметра, да ещё и к максимальной для UTF8 длине строки.

Селективная процедура с таким набором параметров выглядит подозрительно, так что могу предположить, что эта процедура делает добавление записи. Тогда не понятно почему она вызывается с помощью SELECT.

Процедура более сложная и делает не только добавление записи - и Insert и Update и Select и вызов других процедур внутри; а Select - был сгенерирован EntityFramework'ом:
После добавления процедуры в .edmx-модель БД вызов процедуры в коде выглядит следующим образом:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var Context = new DbEntities();
var temp_B_IMP_I_REESTR = Context.B_IMP_I_REESTR
(
 10, 1, 19105302, 
 1399455, null, "132456", 
 0, "some text", null, 
 0, "", null, 0,
 1, 1, 1399451, 
 6000000, null, "some other text",
 Guid.NewGuid().ToString(), null, null, 
 null, "", "some random text"
);
foreach (B_IMP_I_REESTR_ReturnType bImpReestReturnComplexType in temp_B_IMP_I_REESTR)
{
 MessageBox.Show(bImpReestReturnComplexType.ID.ToString());
}


Селективное выражение является результатом вызова этого метода. Да, я тоже не могу понять, почему EntityFramework генерирует выражение, которое содержит параметры, размеры которых не соответствуют указанным в процедуре.
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39358493
vrastrigin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если в IBExpert'e запустить сгенерированную процедуру, но при этом уменьшить размер хотя бы одного varchar'а:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT * FROM B_IMP_I_REESTR(CAST(@IDUSER AS INT), CAST(@IMPMODE AS INT),
CAST(@IDGEN AS INT), CAST(@IDPARENT AS INT), CAST(@IDTCH AS INT),
CAST(@NOMER AS VARCHAR(8191)), CAST(@SBORNIK AS INT),
CAST(@NAME AS VARCHAR(8191)), CAST(@VIX_DAN AS BLOB SUB_TYPE BINARY),
CAST(@ISSYSTEM AS INT), CAST(@POKAZ AS VARCHAR(8191)), CAST(@GOD AS INT),
CAST(@RABMAT AS INT), CAST(@IDGROUP AS INT), CAST(@IDPODGROUP AS INT),
CAST(@IDTYPE AS INT), CAST(@ORDERVIEW AS INT), CAST(@CREATEDATE AS TIMESTAMP),
CAST(@AUTHOR AS VARCHAR(8191)), CAST(@NORM_GUID AS VARCHAR(8191)),
CAST(@INSTALL_GUID AS VARCHAR(8191)), CAST(@INDEX_YEAR AS INT),
CAST(@INDEX_MONTH AS INT), CAST(@INDEX_ORGNAME AS VARCHAR(8191)),
CAST(@INDTYPE AS VARCHAR(7191)))


То вместо ошибки:
Код: sql
1.
2.
3.
4.
5.
Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Implementation limit exceeded.
block size exceeds implementation restriction.


Она выполнится успешно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
План
PLAN (B_TEMP_BLOB INDEX (RDB$PRIMARY4))(B_TEMP_BLOB INDEX (RDB$PRIMARY4))(B_IMP_F_REESTR NATURAL)(B_REESTR INDEX (B_REESTR_PARENT))(B_READ_DEFAULT_REESTR_GROUPS NATURAL)(B_FIND_IND_PARAMS NATURAL)(B_REESTR INDEX (B_REESTR_PARENT))(B_REESTR INDEX (RDB$PRIMARY52))(B_REESTR INDEX (RDB$PRIMARY52))
Адаптированный план
PLAN (B_TEMP_BLOB INDEX (PK_B_TEMP_BLOB))(B_TEMP_BLOB INDEX (PK_B_TEMP_BLOB))(B_IMP_F_REESTR NATURAL)(B_REESTR INDEX (B_REESTR_PARENT))(B_READ_DEFAULT_REESTR_GROUPS NATURAL)(B_FIND_IND_PARAMS NATURAL)(B_REESTR INDEX (B_REESTR_PARENT))(B_REESTR INDEX (PK_B_REESTR))(B_REESTR INDEX (PK_B_REESTR))
------ Performance info ------
Prepare time = 32ms
Execute time = 31ms
Avg fetch time = 31,00 ms
Current memory = 10 182 588
Max memory = 10 701 300
Memory buffers = 2 048
Reads from disk to cache = 18
Writes from cache to disk = 0
Fetches from cache = 23
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39358495
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vrastrigin,

ясен пень. До 3.0 суммарный размер всех параметров не должен превышать 64 Кбайт. Ищи почему у тебя CAST к VARCHAR(8191) идёт. Не должно быть такого каста.
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39358497
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vrastrigin, вам dimitr написал об этом еще неделю назад 19931307 .
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39358500
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vrastrigin,

мне кажется тебе пора уже об этом сообщить вот сюда NET Data provider tracker
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39359148
vrastrigin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_dev,
Симонов Денис,
По ошибке "-204 Implementation limit exceeded" на трекере много тем, последняя - вот эта DNET-723 . Была рекомендация - взять исходный код .Net-Провайдера и урезать максимальный размер varchar вот здесь:
Код: c#
1.
UnicodeVarcharMaxSize (FbProviderManifest.cs:52)


Но это очень топорный хак. Также я вчера разобрался, как можно избавиться от CAST'ов во входных параметрах процедур:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
FirebirdSql.Data.EntityFramework6.SqlGen.cs:
public override ISqlFragment Visit(DbParameterReferenceExpression e) 
{ 
  _shouldCastParameter = false; 
  ... 
 _shouldCastParameter = true; 
  return result; 
}


В результате генерируется процедура:
Код: sql
1.
2.
3.
4.
SELECT 
1 AS "C1", 
"A"."ID" AS "ID"
FROM "B_IMP_I_REESTR"(@IDUSER, @IMPMODE, @IDGEN, @IDPARENT, @IDTCH, @NOMER, @SBORNIK, @NAME, @VIX_DAN, @ISSYSTEM, @POKAZ, @GOD, @RABMAT, @IDGROUP, @IDPODGROUP, @IDTYPE, @ORDERVIEW, @CREATEDATE, @AUTHOR, @NORM_GUID, @INSTALL_GUID, @INDEX_YEAR, @INDEX_MONTH, @INDEX_ORGNAME, @INDTYPE) AS "A"


Теперь входные параметры хранимых процедур всегда передаются "как есть". Существует ли ситуация, при которой необходимо делать им CAST принудительно?
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39359156
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vrastrigin Существует ли ситуация, при которой необходимо делать им CAST принудительно?

существует но довольно редко, когда невозможно вывести типа параметра, например

Код: sql
1.
2.
3.
select
  :id as id
from rdb$database



здесь нельзя заранее сказать какого типа параметр id, поэтому надо делать подсказки, например с помощью CAST

Код: sql
1.
2.
3.
select
  CAST(:id AS BIGINT) as id
from rdb$database
...
Рейтинг: 0 / 0
Неправильно генерируется SQL-выражение для хранимой процедуры
    #39359157
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vrastriginБыла рекомендация - взять исходный код .Net-Провайдера и урезать максимальный размер varchar вот здесь:

ИХМО, глупая рекомендация
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неправильно генерируется SQL-выражение для хранимой процедуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]