Добрый день всем

 

возможно кто-то уже сталкивался с проблемой при установке ниже полный код ошибки

Unhandled exception. Terrasoft.Common.DublicateDataException: Duplicates data in object "SysCulture".
   at Terrasoft.Core.Entities.Entity.Load(Select select, IDictionary`2 columnMap) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/Entities/Entity.cs:line 2406
   at Terrasoft.Core.Entities.Entity.InternalFetchFromDB(IEnumerable`1 columnsToFetch, IDictionary`2 conditions, Boolean useDisplayValues, Boolean performValuesCleanup) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/Entities/Entity.cs:line 2093
   at Terrasoft.Core.Entities.Entity.FetchFromDB(EntitySchemaColumn conditionColumn, Object conditionValue, Boolean useDisplayValues) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/Entities/Entity.cs:line 3165
   at Terrasoft.Core.Entities.Entity.FetchFromDB(Object keyValue, Boolean useDisplayValues) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/Entities/Entity.cs:line 3223
   at Terrasoft.Core.AppConnection.SetPrimaryCultureInResourceStorage() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/AppConnection.cs:line 705
   at Terrasoft.Core.AppConnection.InitializeCulture() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/AppConnection.cs:line 858
   at Terrasoft.Core.AppConnection.Initialize() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/AppConnection.cs:line 808
   at Terrasoft.WebHost.Application.OnAfterConfigure() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Application.cs:line 186
   at Terrasoft.WebHost.Startup.Configure(IApplicationBuilder app, IHostEnvironment env, IHostApplicationLifetime applicationLifetime, IApplication application, IAntiforgery antiforgery) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Startup.cs:line 275
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__2(IApplicationBuilder app)
   at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
   at Terrasoft.WebHost.Program.StartWebApplication(String[] args) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 29
   at Terrasoft.WebHost.Program.<>c__DisplayClass2_0.<Main>b__0(StartOptions _) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 62
   at CommandLine.ParserResultExtensions.MapResult[T1,T2,TResult](ParserResult`1 result, Func`2 parsedFunc1, Func`2 parsedFunc2, Func`2 notParsedFunc)
   at Terrasoft.WebHost.Program.Main(String[] args) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 65
Aborted (core dumped)

 

Нравится

2 комментария
Лучший ответ

С такой ошибкой не сталкивался, но есть предположение, что проблема возникла на этапе рестора базы данных. Рекомендую удалить базу, которая развернута на данный момент, и заново ее заресторить, после чего попробовать запустить приложение повторно.

С такой ошибкой не сталкивался, но есть предположение, что проблема возникла на этапе рестора базы данных. Рекомендую удалить базу, которая развернута на данный момент, и заново ее заресторить, после чего попробовать запустить приложение повторно.

Олег Нефедьев,

действительно после полного сноса базы и повторного восстановления ошибка ушла. Спасибо

Показать все комментарии

Продолжение темы: https://community.terrasoft.ru/questions/vopros-po-updateselect-k-razra…

 

Зачем в классе Terrasoft.DB.PostgreSql.PostgreSqlEngine в методе BuildUpdateSelectTargetSqlText(StringBuilder sb, ModifyQuerySource modifySource, string alias) код "string value = " \"" + alias + "\""; sb.Append(value);" ?

Класс генерирует неправильный запрос в БД:

var us =
	new UpdateSelect(_userConnection, "Contact", "c")
		.Set("Name", Column.Parameter("Andrew Baker (sample) + 1"))
		.From("Contact", "c")
		.InnerJoin("Account").As("a").On("a", "Id").IsEqual("c", "AccountId")
		.Where("a", "Web").IsEqual(Column.Parameter("ac.com"))
		.And("c", "Id").IsNotEqual(Column.Parameter(Guid.NewGuid()))
	as UpdateSelect;
UPDATE "public"."Contact" "c"
SET
	"Name" = 'Andrew Baker (sample) + 1'
FROM
	"public"."Contact" "c"
	INNER JOIN "public"."Account" "a" ON "a"."Id" = "c"."AccountId"
WHERE
	"a"."Web" = 'ac.com'
	AND "c"."Id" <> '{19812101-C7A9-4DED-BD44-F8973A98D746}'

Результат выполнения:

При этом если бы упомянутого выше кода не было, то запрос был бы верным:

Нравится

1 комментарий

Владислав, проблема в самом запросе, вы пытаетесь  задать один и тот же алиас как целевой таблице так и источнику. В вашем случае запрос должен выглядеть так: 

var us =
                new UpdateSelect(UserConnection, "Contact", "c")
                    .Set("Name", Column.Parameter("Andrew Baker (sample) + 2"))
                    .From("Contact", "ca")
                    .InnerJoin("Account").As("a").On("a", "Id").IsEqual("ca", "AccountId")
                    .Where("a", "Web").IsEqual(Column.Parameter("ac.com"))
                    .And("ca", "Id").IsNotEqual(Column.Parameter(Guid.NewGuid()))
                as UpdateSelect;

Как и в случае с методом ReplaceUpdateTargetAliasWithName, эта строка нужна для правильного построения запроса. С ней были проведены тесты и они показали правильность её работы.

Показать все комментарии

Добрый день, сделал копию бд, стал ставить локально, версии creatio, postgres, расположение и именования папок идентичное. Уже делал бэкап и восстанавливал на другую машину, работало без проблем. Подскажите, может кто-то сталкивался и знает. Права на папке где creatio лежит, тоже проверил, там все в порядке. Пароль от postgres и от бд тоже знаю, connectionString весь проверил, локально все компоненты IIS тоже есть.

 

Нравится

3 комментария

БД  и приложение Creatio на одной машине (серваке)?

Pavel Litvinovich,

Да, и бд и creatio на одной локалке

Добрый день.

Проверьте, корректно ли прописаны параметры подключения к БД в ConnectionStrings.config.

 

Показать все комментарии

Доброго дня!

У нас есть рабочая Creatio Sales Enterprise на базе MS SQL Server. Сейчас мы переезжаем на другой сервер с PostgreSQL. Не получается выполнить восстановление бэкапа БД (создан в MS SQL Server, восстанавливаем в PostgreSQL). Пробовали и напрямую через интерфейс pgAdmin, и через командную строку, и конвертировали БД через программу-конвертер - результата нет. В какую сторону ещё смотреть, что поискать, у кого заказать?

Нравится

5 комментариев

это невозможно реализовать стандартными средствами, ибо названия колонок и таблиц могут отличаться для двух баз + конфиг самой базы
Только если развернуть чистую базу на постгрис и переносить скриптами данные или ручками через выгрузку excel или привязки данных к пакету, как вариант

Возможно, ещё придётся переписывать хранимые процедуры и VIEW, так как местами есть существенные отличия

Здравствуйте!
 

На текущий момент техническая поддержка может направить бета-версию утилиты для миграции, которая совместима с версией 7.15.4.

Релиз в проработке, к сожалению, по срокам не можем сориентировать.

Утилиту и рекомендации предоставит техническая поддержка по запросу.

С уважением, Елена.

Elena Sidko,

Елена, а Вы не могли бы ещё уточнить версии/билды/релизы MS SQL Server и PostgreSQL Server, на которых точно работает эта утилита? Мы хотим поставить точно такие же

Антон, добрый день.

Приносим свои извинения за задержку с обратной связью.

Данная утилита работает и привязана только к версии приложения Creatio 7.15.4 под продукты Sales/Marketing/Service (без вертикальных решений по типу Real Estate, BCJ и т.д.).

Касательно версии серверов и перечнем других системных требований для разворачивания приложения Creatio Вы можете ознакомиться на Академии:

Системные требования к серверам
Калькулятор системных требований
Системные требования к клиентскому компьютеру

 

С уважением, Елена.

 

Показать все комментарии
Добрый день, выполнял настройку elasticsearch по инструкции, linux+docker. Версия Creatio 7.17.1.1364 (.NET Core 3.1.15). Компоненты на машинах запустились без ошибок, дошел до момента когда нужно выполнить sql  скрипт. Для этого в Creatio добавил плагин SQL консоли, он там 1. Вот первый скрипт который запускаю:
БД Postgres
DO $$

DECLARE 
    GlobalSearchFeature VARCHAR(50) := 'GlobalSearch';
    GlobalSearchFeatureId uuid;
    GlobalSearchV2Feature VARCHAR(50) := 'GlobalSearch_V2';
    GlobalSearchV2FeatureId uuid;
    GS_RelatedEntityIndexingFeature VARCHAR(50) :=   'GlobalSearchRelatedEntityIndexing';
    GS_RelatedEntityIndexingFeatureId uuid;
    allEmployeesId uuid := 'A29A3BA5-4B0D-DE11-9A51-005056C00008';

BEGIN

   SELECT "Id" INTO GlobalSearchFeatureId FROM "Feature"
   WHERE "Code" = GlobalSearchFeature
   LIMIT 1;
   IF (GlobalSearchFeatureId IS NOT NULL)
      THEN
          IF EXISTS (SELECT * FROM "AdminUnitFeatureState" WHERE "FeatureId" = GlobalSearchFeatureId) THEN
             UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = GlobalSearchFeatureId;
          ELSE
              INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', GlobalSearchFeatureId);
          END IF;
   ELSE
       GlobalSearchFeatureId := uuid_generate_v4();
       INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (GlobalSearchFeatureId, GlobalSearchFeature, GlobalSearchFeature);
       INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', GlobalSearchFeatureId);
   END IF;

   SELECT "Id" INTO GlobalSearchV2FeatureId FROM "Feature"
   WHERE "Code" = GlobalSearchV2Feature
   LIMIT 1;
   IF (GlobalSearchV2FeatureId IS NOT NULL)
    THEN
        IF EXISTS (SELECT * FROM "AdminUnitFeatureState" WHERE "FeatureId" = GlobalSearchV2FeatureId) THEN
            UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = GlobalSearchV2FeatureId;
        ELSE
           INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', GlobalSearchV2FeatureId);
        END IF;
   ELSE
       GlobalSearchV2FeatureId := uuid_generate_v4();
       INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (GlobalSearchV2FeatureId, GlobalSearchV2Feature, GlobalSearchV2Feature);
       INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', GlobalSearchV2FeatureId);
   END IF;

  SELECT "Id" INTO GS_RelatedEntityIndexingFeatureId FROM "Feature" WHERE "Code" =GS_RelatedEntityIndexingFeature LIMIT 1;
  IF (GS_RelatedEntityIndexingFeatureId IS NOT NULL)
  THEN
  IF EXISTS (SELECT * FROM "AdminUnitFeatureState" WHERE "FeatureId" = Bulk_ES_DD_FeatureId) THEN
UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = GS_RelatedEntityIndexingFeatureId;
  ELSE
  INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState","FeatureId") VALUES (allEmployeesId, '1', GS_RelatedEntityIndexingFeatureId);
  END IF;
  ELSE
  GS_RelatedEntityIndexingFeatureId := uuid_generate_v4();
  INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (GS_RelatedEntityIndexingFeatureId, GS_RelatedEntityIndexingFeature, GS_RelatedEntityIndexingFeature);
  INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState","FeatureId") VALUES (allEmployeesId, '1', GS_RelatedEntityIndexingFeatureId);
  END IF;
END $$;

Этот скрипт падает с ошибкой(но таймер у скрипта все таки стартует)
Вот второй скрипт:
Данные нужные подставил
 
UPDATE "SysSettingsValue"
SET "TextValue" = [укажите URL к индексу ElasticSearch, строка следующего типа: http://external.elasticsearch:9200/indexname]
WHERE "SysSettingsId" = (SELECT "Id" FROM "SysSettings" WHERE "Code" = 'GlobalSearchUrl' LIMIT 1 );

UPDATE "SysSettingsValue"
SET "TextValue" = [укажите URL к Global Search Service, строка следующего типа: http://SERVER2_IP_ADDRESS:81]
WHERE "SysSettingsId" = (SELECT "Id" FROM "SysSettings" WHERE "Code" = 'GlobalSearchConfigServiceUrl' LIMIT 1 );

UPDATE "SysSettingsValue"
SET "TextValue" = [укажите URL к Global Search Indexing Service, строка, сл. типа - http://SERVER2_IP_ADDRESS:82]
WHERE "SysSettingsId" = (SELECT "Id" FROM "SysSettings" WHERE "Code" = 'GlobalSearchIndexingApiUrl' LIMIT 1 );

Окей, раз скрипты не работают я пошел на:
 

/Nui/ViewModule.aspx#BaseSchemaModuleV2/FeaturesPage
Без /0/ потому что Linux.
Там нашел один единственный тумблер с надписью GlobalSearch, вот его и включил и сохранил, все ок.
Вопрос в следующем, как мне убедится что Глобальный поиск работает? И нужны ли все таки выполненные эти скрипты?
Если скрипты нужно выполнять, то где? в Postgres(на Linux)? или как это работает?

Нравится

9 комментариев

Здравствуйте, скрипты необходимо запускать для корректного включения функциональности. Подскажите, какие ошибки возникают при выполнении скриптов?
Скрипты необходимо выполнять на базе данных приложения Creatio.

После выполнения скриптов нужно перезапустить сайт с очисткой Redis.
Далее создать тестовую запись и через минуту попробовать поискать её в глобальном поиске. 

Алёна Доля, здравствуйте, встретился с ошибкой с ссылкой на отсутствие переменных в psql, GlobalSearchUrl, GlobalSearchConfigServiceURL, GlobalSearchIndexingApiUrl
если есть пример того как должно выглядеть буду благодарен

Алёна Доля,

ещё вопрос не по теме  БД, на сервере с компонентами elasticsearch заметил что не дописал порт в команду curl, вопрос, как теперь удалить старую запись? Потому что сейчас не дает записать ничего из-за того что ранее уже записывал

Евгений Шевченко,
Для более быстрой настройки можете заполнить настройки GobalSearchUrl, GlobalSearchConfigServiceURL, GlobalSearchIndexingApiUrl  через интерфейс в разделе  "Системные настройки". Необходимые записи фильтруйте в разделе по коду.

ОШИБКА:  "globalsearchfeatureid" - не известная переменная
СТРОКА 14:    SELECT "Id" INTO GlobalSearchFeatureId FROM "Feature"

не подскажете в чем причина?

Добрый день!

Проблема заключалась в функционале страницы https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/razvertyvanie_onsite/nastrojka_kontejnernyh_komponentov/nastroit_globalnyy_poisk
В ближайшее время мы исправим этот функционал в статье.

Воспроизводится проблема в результате использования кнопки Копировать код (скриншот во вложении).
Если копировать сам текст запроса, ошибка перестанет воспроизводиться.

Жмурко Сергей,

Всё ещё не поправлено :)

Андрей,

Добрый день! Проблема зарегистрирована для исправления в будущих версиях Creatio.

Показать все комментарии

При асинхронном запуске бизнес-процессов  в которых есть элемент - "Читать данные", постоянно выскакивает ошибка - Npgsql.NpgsqlOperationInProgressException: A command is already in progress.

Может кто сталкивался и знает как правильно работать с БД что бы при асинхронных запросах не было таких ошибок? 

Нравится

3 комментария

Андрей, что вы имеете ввиду под асинхронными? Фоновый режим? Как воспроизвести описанную проблему? И о какой версии идет речь?

Тарас Пономарёв,

EntityList.SplitOnParts(ChunkSize).AsParallel().AsOrdered().ForAll(EntityListPart=> { foreach(var entity in EntityListPart) {// тут запрос в бд, скажем дорогостоящий поиск по name like});

Здравствуйте!

 

Сейчас на платформе не поддерживается в полной мере работа в многопоточности . На текущий момент возможность запускать паралельную обработку есть только через фоновые процессы, асинхронные таски в RMQ. 

Показать все комментарии

Приветствую, коллеги. Фильтрацию по содержимому в поле, которое является типом массива байт, можно произвести например таким условием: 

where encode("InputArguments", 'escape') like '%identifierNo=cardnumber123%';

По той же логике пытался сделать фильтр через ESQ такого формата:

esq.Filters.Add(
    esq.CreateFilterWithParameters(
        FilterComparisonType.Contain,
        "InputArguments",
        Encoding.UTF8.GetBytes(inputArguments)
));

В результате получаю исключение:  "42883: function upper(bytea) does not exist". Есть ли обходные пути для реализации данного фильтра?

Нравится

1 комментарий

Добрый день, Александр.
К сожалению, наше приложение не поддерживает фильтр Contain с типом данных "массив байт". Мы передадим данную проблему разработчикам приложения для исправления в будущих версиях.

Показать все комментарии

В описании дополнения File storage for Creatio (https://marketplace.terrasoft.ru/app/file-storage-creatio) написано, что оно работает только с Субд MS SQL. Может ли данное дополнение работать с СУБД Postgre SQL?
Если нет, то есть ли подобное решение для данной БД?

Нравится

2 комментария

Нет, надо дорабатывать.

Добрый день, Оксана.

 

Евгений правильно уточнил, что дополнение не совместимо с СУБД Postgre SQL. Подобные решения также поддерживают работу с Субд MS SQL. Предлагаю уточнить у разработчиков решений планы по добавлению совместимости с Postgre SQL:

https://marketplace.terrasoft.ru/app/external-file-storage-creatio

https://marketplace.terrasoft.ru/app/file-manager-creatio

Показать все комментарии
Пробую развернуть стенд на centos. Делаю все по шагам:

1. https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/razvertyvanie_onsite/server_subd/razvernut_bazu_dannykh_postgresql_linux
2. https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/razvertyvanie_onsite/server_keshirovaniya/nastroit_server_keshirovaniya_dannykh_redis_na_linux
3. https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/razvertyvanie_onsite/server_prilozhenij_net_core_na_linux/ustanovit_creatio_net_core_na_linux

не стартует dotnet Terrasoft.WebHost.dll

в чем может быть проблема?

Нравится

3 комментария

eugenes, покажите весь текст стека. Похоже, на скриншот не попала верхняя часть, где непосредственно текст исключения.

Зверев Александр,

Похоже, не может подключиться к БД, ошибка тайм-аута.

Проверьте правильность настройки параметров подключения в ConnectionStrings.config и доступность по сети сервера БД с веб-сервера.

Показать все комментарии

Есть запрос в базу данных, по ответу поддержки "классы EntitySchemaQuery, Select, Insert, Update, Delete это СУБД-независимое API ", исходя из этого был использован InsertSelect. На PostgreSQL запрос отрабатывает отлично, но в Oracle выдает ошибку при использовании TOP в запросе.

Код запроса:

Query selectQuery = new Select(UserConnection)
    .Top(numberCountForNumberPool)
    .Column(Column.Parameter(request))
    .Column(Column.Parameter(currentUserContactId))
    .Column(Column.Parameter(currentUserContactId))
    .Column("KtSimManagementInitialPoolNumbers", "KtIccid")
    .Column("KtSimManagementInitialPoolNumbers", "KtImsi")
    .Column("KtSimManagementInitialPoolNumbers", "KtMsisdn")
    .Column("KtSimManagementInitialPoolNumbers", "KtName")
    .Column(Column.Parameter(cityAndCountNumbersEntity.GetTypedColumnValue<Guid>(city.Name)))
    .Column(Column.Parameter(cityAndCountNumbersEntity.GetTypedColumnValue<string>(note.Name)))
    .Column(Column.Parameter(DateTime.UtcNow.Date))
    .Column(Column.Parameter(DateTime.UtcNow.Date
        .AddDays((int)Core.Configuration.SysSettings.GetValue(UserConnection,
            "DayCountForDedicatedPoolNumbers") + 1).AddSeconds(-1)))
    .From("KtSimManagementInitialPoolNumbers")
    .OrderByAsc("KtSimManagementInitialPoolNumbers", "KtName")
    .Join(JoinType.LeftOuter, "KtJasperFullNumberPool")
    .On("KtSimManagementInitialPoolNumbers", "KtName")
    .IsEqual("KtJasperFullNumberPool", "KtName")
    .Where("KtJasperFullNumberPool", "KtName")
    .IsNull()
    .And("KtSimManagementInitialPoolNumbers", "KtMarketCodeId")
    .IsEqual(Column.Parameter(cityForMarketCode));
 
InsertSelect insertSelectQuery = new InsertSelect(UserConnection)
    .Into("KtJasperFullNumberPool")
    .Set("KtRequestId", "ModifiedById", "CreatedById", "KtIccid", "KtImsi", "KtMsisdn", "KtName", "KtCityId", "KtNote", "KtReserveDate", "KtReserveToDate")
    .FromSelect(selectQuery);
int numberCountInserted = insertSelectQuery.Execute();

Подскажите, есть ли возможность использовать в Select для Oracle - TOP для выборки необходимого количества записей в запросе?

Нравится

8 комментариев
Лучший ответ

Проверил, на запросе с Top, OrderByAsc,  Join, On, IsEqual, Where отрабатывает нормально. А если добавить колонки с числом и датой из параметра, получим такую же ошибку, как у Вас. Но если, как я выше предложил, дописать «.As», она исчезнет:

			var query = new Select(UserConnection)
				.Top(2)
				.Column("Contact", "Dear")
    			.Column(Column.Parameter("test")).As("SomeString")
    			.Column(Column.Parameter(DateTime.UtcNow.Date)).As("SomeDate")
				.From("Contact")
				.OrderByAsc("Contact", "Dear")
		    	.Join(JoinType.LeftOuter, "Account")
    			.On("Contact", "AccountId")		
				.IsEqual("Account", "Id")
    			.Where("Account", "AnnualRevenueId")
    			.IsNull()				;
var text =  query.GetSqlText();

Код генерируется:

SELECT  "Dear", "SomeString",   "SomeDate"FROM (SELECT  "Contact"."Dear",       :P1 "SomeString",       :P2 "SomeDate"FROM      "название_базы"."Contact""название_базы"."Account"WHERE      ("Account"."AnnualRevenueId" IS NULL)   AND "Contact"."AccountId" = "Account"."Id"(+)ORDER BY   "Contact"."Dear" ASC NULLS FIRST)WHERE  (ROWNUM <= 2)

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

Александр, какая именно выдаётся ошибка? Только в Insert Select или просто в Select с Top тоже?

Если перед последней строчкой считать insertSelectQuery.GetSqlText(), что там будет?

Зверев Александр,

 в Select тоже, пишет что "

Terrasoft.Common.NullOrEmptyException: Псевдоним колонки запроса не может быть пустым
   в Terrasoft.Core.DB.DBEngine.BuildSelectColumnAliasesSqlText(StringBuilder sb, QueryColumnExpressionCollection columnExpressions)
   в Terrasoft.DB.Oracle.OracleEngine.BuildSelectQuerySqlText(StringBuilder sb, Select select)
   в Terrasoft.Core.DB.DBEngine.BuildQuerySqlText(StringBuilder sb, Select selectQuery)
   в Terrasoft.Core.DB.DBEngine.GetQuerySqlText(Select selectQuery)
   в Terrasoft.Core.DB.Select.GetSqlText()
   в Terrasoft.Configuration.KtReserveNumbersService.ReserveNumbers(Guid request)
   в SyncInvokeReserveNumbers(Object , Object[] , Object[] )
   в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   в Terrasoft.Web.Common.ServiceModel.ThreadContextInitializer.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)

"

Проверил без TOP - такой ошибки нет

А если без этой колонки?

    .Column(Column.Parameter(DateTime.UtcNow.Date
        .AddDays((int)Core.Configuration.SysSettings.GetValue(UserConnection,
            "DayCountForDedicatedPoolNumbers") + 1).AddSeconds(-1)))

Или с ней, но сразу после после дописать псевдоним:

.As("MyColumnName")

Она самая подозрительная, но если дело не в ней, проверьте и предыдущие.

Зверев Александр, Проверил - при закоментировании колонок разницы нет, но заметил закономерность:
1) если использовать Top без OrderByAsc и Join (ну вчесте с его on, IsEqual, Where) - тогда работает
2) если использовать OrderByAsc или Join (ну вчесте с его on, IsEqual, Where) без Top - тогда работает
3) если использовать Top с OrderByAsc или Join (ну вчесте с его on, IsEqual, Where) - тогда не работает, ошибка

Проверил, на запросе с Top, OrderByAsc,  Join, On, IsEqual, Where отрабатывает нормально. А если добавить колонки с числом и датой из параметра, получим такую же ошибку, как у Вас. Но если, как я выше предложил, дописать «.As», она исчезнет:

			var query = new Select(UserConnection)
				.Top(2)
				.Column("Contact", "Dear")
    			.Column(Column.Parameter("test")).As("SomeString")
    			.Column(Column.Parameter(DateTime.UtcNow.Date)).As("SomeDate")
				.From("Contact")
				.OrderByAsc("Contact", "Dear")
		    	.Join(JoinType.LeftOuter, "Account")
    			.On("Contact", "AccountId")		
				.IsEqual("Account", "Id")
    			.Where("Account", "AnnualRevenueId")
    			.IsNull()				;
var text =  query.GetSqlText();

Код генерируется:

SELECT  "Dear", "SomeString",   "SomeDate"FROM (SELECT  "Contact"."Dear",       :P1 "SomeString",       :P2 "SomeDate"FROM      "название_базы"."Contact""название_базы"."Account"WHERE      ("Account"."AnnualRevenueId" IS NULL)   AND "Contact"."AccountId" = "Account"."Id"(+)ORDER BY   "Contact"."Dear" ASC NULLS FIRST)WHERE  (ROWNUM <= 2)

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

Зверев Александр,

 да, именно Ваша рекомендация с .As("SomeString") помогла когда прописал данный алиас во все колонки где используется "Column.Parameter". Так же в поддержке ответили. Не понял только почему в PostgreSQL это работает без алиаса, а в Oracle без него не так. Но видимо это специфика запросов СУБД, главное что с алиасом работает и там, и там.

Спасибо за помощь!

Передал информацию об этой особенности для освещения в академии.

Показать все комментарии