-1

我为我的 SQL 数据库编写了 dll,该数据库从表中获取 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]);}
            }           
        } 
4

1 回答 1

0

异常消息已经非常准确地告诉您问题所在:

当应用程序未在 UserInteractive 模式下运行时显示模式对话框或表单不是有效操作。

正如评论中所指出的,SQL Server 不是用户交互过程;这是一项服务。

您说您“需要”这样做(大概是您需要向用户显示一个对话框来选择保存路径),但很简单,这样做在每个级别上都是错误的。尤其重要的是,正如评论中所指出的那样,任何人都不太可能登录到运行 SQL Server 进程的机器,因此没有人响应对话框提示。

显然有一些方法可以从非用户交互进程中显示一个对话框,但这仍然假设有人正在等待它显示在(在这种情况下)数据库服务器机器上。这种可能性似乎很小。

重新考虑您要做什么以及如何做。如果您绝对需要用户在数据库服务器上提供用于保存生成的报告的位置和文件名,请通过他们正在使用的任何 UI 预先收集该信息,而不是在执行数据库代码期间。

更有可能您应该将 PDF 放在具有随机生成名称(又存储在数据库中)的某个地方(任何地方),或者甚至只是数据库中的二进制 blob,然后为用户提供一种下载 PDF 的方法因此通过您已经拥有的任何界面生成,以便用户与数据进行交互。这样做将完全规避问题,同时保持清晰的层分离。

于 2018-10-23T08:51:37.127 回答