Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неправильно генерируется SQL-выражение для хранимой процедуры / 22 сообщений из 22, страница 1 из 1
24.11.2016, 14:54
    #39353720
vrastrigin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
Здравствуйте!
Когда я пробую запустить простую процедуру с помощью 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
24.11.2016, 14:57
    #39353723
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
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
24.11.2016, 15:04
    #39353740
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
vrastriginCAST(@IDUSER AS INT)
это не Firebird.
...
Рейтинг: 0 / 0
24.11.2016, 15:06
    #39353746
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
vrastrigin,

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

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

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

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

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

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

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

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

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

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

посчитай сколько раз в этом кривом запросе используется число 8191
...
Рейтинг: 0 / 0
25.11.2016, 09:11
    #39354277
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
Симонов Денис, аааа... В этом смысле. Понятно.
...
Рейтинг: 0 / 0
25.11.2016, 11:34
    #39354423
vrastrigin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
Симонов Денис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
01.12.2016, 14:22
    #39358493
vrastrigin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
Если в 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
01.12.2016, 14:25
    #39358495
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
vrastrigin,

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

мне кажется тебе пора уже об этом сообщить вот сюда NET Data provider tracker
...
Рейтинг: 0 / 0
02.12.2016, 10:44
    #39359148
vrastrigin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
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
02.12.2016, 10:50
    #39359156
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
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
02.12.2016, 10:51
    #39359157
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неправильно генерируется SQL-выражение для хранимой процедуры
vrastriginБыла рекомендация - взять исходный код .Net-Провайдера и урезать максимальный размер varchar вот здесь:

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


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