文件夹浏览器对话框,从远程机器角度来看,就像SSMS使用的那样

时间:2013-12-13 22:18:37

标签: c# sql-server dialog smo

我正在创建一个维护工具,我需要让用户为新数据库选择一个文件位置。我会使用FolderBrowserDialog,除了我想从SQL Server实际运行的机器的角度向用户显示目录结构,而不是运行工具的客户端。

我知道SSMS会在您选择备份位置时执行此操作,因此我想知道它使用的对话框是否可用,或者是否有办法使FolderBrowserDialog以这种方式运行。看来当你通过SMSS做到这一点时,你可以绕过某些权限问题(即服务器不需要共享或任何东西)。

建议?

1 个答案:

答案 0 :(得分:1)

我一直在做类似的任务,遇到了同样的问题。 我很乐意分享现成的解决方案,但我与魔鬼签订了协议,公司拥有我为他们工作时所做的一切。 但它的要点是:

  1. 使用Server.EnumAvailableMedia方法获取服务器上的硬盘驱动器。
  2. 调用xp_dirtree存储过程以获取给定路径中的文件和子目录
  3. 我最终使用TreeView创建了自己的文件对话框Form。填充它的代码应该类似于:

    public partial class RemoteFileDialog : Form
    {
        public Server server = new Server( new ServerConnection("ServerName", "User", "Password") );
    
        /* ... */
    
        public void getServerDrives()
        {
            DataTable d = server.EnumAvailableMedia();
            foreach (DataRow r in d.Rows)
                treeView.Nodes.Add( new TreeNode(r["Name"].ToString() );
        }
    
        /* ... */
    
        //populate a node with files and subdirectories when it's expanded
        private void treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            DataSet ds = server.ConnectionContext.ExecuteWithResults(string.Format("exec xp_dirtree '{0}', 1, 1", e.Node.FullPath));
            ds.Tables[0].DefaultView.Sort = "file ASC"; // list directories first, then files
            DataTable d = ds.Tables[0].DefaultView.ToTable();
            foreach (DataRow r in d.Rows)
                e.Node.Nodes.Add( new TreeNode(r["subdirectory"].ToString());
        }
    }