我正在创建一个维护工具,需要让用户为新数据库选择一个文件位置。我会使用FolderBrowserDialog,只是我想从SQL Server实际所在的计算机的角度向用户显示目录结构,而不是从运行该工具的客户端的角度。
我知道每当您选择备份位置时,SSMS都会这样做,所以我想知道它使用的对话框是否可用,或者是否有办法使FolderBrowserDialog以这种方式运行。看起来,当你通过SMSS进行操作时,你可以绕过某些权限问题(即服务器不需要共享或其他任何事情)。
建议?
我一直在做类似的任务,遇到了同样的问题。我很乐意分享现成的解决方案,但我与魔鬼签署了一份协议,公司拥有我为他们工作时所做的一切。但其要点是:
- 使用Server.EnumAvailableMedia方法获取服务器上的硬盘驱动器
- 调用xp_dirtree存储过程以获取给定路径中的文件和子目录
我最终使用TreeView制作了自己的文件对话框窗体。填充它的代码应该看起来像:
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());
}
}