【问题标题】:Using dialog Windows in SQL external procedures在 SQL 外部过程中使用对话框窗口
【发布时间】:2019-03-27 07:12:55
【问题描述】:

我为我的 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]);}
            }           
        } 

【问题讨论】:

  • 我见过很少有像这个一样糟糕的想法(除了可能在事务中打开用户对话框......)。你做错了!
  • SQL Server 是一个服务器。大多数情况下,它将在 nobody 以交互方式登录的机器上运行。您希望谁会看到此对话框?
  • @Damien_The_Unbeliever 我认为 opendialog 显示本地目录,而不是来自服务器的 realtes
  • @MitchWheat 但我需要这样做
  • 建议您在这里的尝试中被误导了,因为您确实将所有分层的概念都抛到了窗外。 SQL Server 本身没有任何 UI。它作为服务在后台运行。你的 UI 和数据库之间应该至少有几层。突然让 数据库 尝试显示一个对话框是错误的。

标签: c# sql-server dll opendialog


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多