Использование диалогового окна Windows во внешних процедурах SQL - PullRequest
0 голосов
/ 23 октября 2018

Я написал dll для своей базы данных SQL, которая берет BLOB-данные из таблиц и преобразует их в pdf-файл.Это работает хорошо, но я пытаюсь добавить диалоговое окно для выбора пути сохранения PDF и выдает мне следующее сообщение:

System.InvalidOperationException: отображение модального диалогового окна или формы, когда приложение не работает в режиме UserInteractive,недопустимая операция.Укажите стиль ServiceNotification или DefaultDesktopOnly для отображения уведомления от приложения-службы.

Может кто-то знает, в чем проблема?

Код DLL, где проблема:

public static void Run(SqlInt32 i)
        {          
            FolderBrowserDialog fd = new FolderBrowserDialog();
            fd.ShowDialog();
            string save_pth = fd.SelectedPath+'\\';
            if (gener_pdf(gener_jpg(i, save_pth), save_pth))
            {
                List<string> to_del = gener_jpg(i, save_pth);
                for (int p = 0; p < to_del.Count(); p++) { File.Delete(to_del[p]);}
            }           
        } 

1 Ответ

0 голосов
/ 23 октября 2018

Сообщение об исключении уже достаточно точно говорит вам, в чем проблема:

Отображение модального диалогового окна или формы, когда приложение не работает в режиме UserInteractive, не является допустимой операцией.

Как указано в комментариях, SQL Server не является интерактивным процессом пользователя;это услуга.

Вы говорите, что вам «нужно» сделать это (предположительно, вам нужно показать пользователю диалоговое окно для выбора пути сохранения), но довольно просто, что это неправильно на каждомуровень.Не в последнюю очередь из-за того, что, как также указывалось в комментариях, крайне маловероятно, что кто-либо войдет в систему на компьютере, на котором выполняется процесс SQL Server, поэтому нет никого, кто мог бы ответить на диалоговое окно.

Тамочевидно, это способы отображения диалогового окна из неинтерактивного процесса, , но , который все еще предполагает, что кто-то ожидает его отображения (в данном случае) на компьютере сервера базы данных.Шансы этого кажутся незначительными.

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

Скорее всего вам просто нужно поместить куда-нибудь (где угодно) PDF-файл со случайно сгенерированным именем (которое, в свою очередь, хранится в базе данных) или даже просто как двоичный двоичный объект в базе данных, изатем предложите пользователю загрузить PDF-файл, сгенерированный таким образом, через интерфейс, который у вас уже есть, чтобы пользователь мог взаимодействовать с данными. Это позволит полностью обойти проблему, сохранив четкое разделение слоев.

...