我在C#中用SQLDMO新建数据库,遇到了一个问题:数据库文件的保存路径问题
先选定本地网络中的一个SQL服务器(DATASRV),之后在其上新建一个数据库,创建过程中有一个参数:PhysicalName是指定数据库文件(.MDF)的存放路径,假设指定为D:/TEMP/TEST.MDF则是保存在服务器(DATASRV)的D:/TEMP/下。
用字符串的方式指定没有问题,可以在服务器的指定文件夹下新建数据库文件(即使这个文件夹并没有共享),但我想用一个SaveFileDialog框让用户选择存放路径,问题是(假设服务器上管理员权限的用户名和密码都已知)我只能看到和访问服务器上共享出来的文件夹,但使用这样的路径名PhysicalName参数却不能接受,比如:服务器DATASRV在D盘共享出一个叫SHARE的文件夹。PhysicalName参数只能接受“D:/SHARE/TEST.MDF”这样的路径而不接受“//DATASRV/SHARE/TEST.MDF”这样的路径。
看起来有两种解决方式:A)让SaveFileDialog框访问服务器上的“我的电脑”(像访问本机一样) B)通过共享出的文件夹取得它在服务器上的绝对路径
相关代码如下:
SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass();
srv.Connect(srvName, "sa", "");
if (srvName != "local")
sFDNewDB.InitialDirectory = @"//" + srvName;
if(sFDNewDB.ShowDialog() == DialogResult.Cancel)
{
srv.Close();
sqlApp.Quit();
return;
}
dbPath = sFDNewDB.FileName;
dbName = dbPath.Substring(dbPath.LastIndexOf("//")+1,dbPath.Length - dbPath.LastIndexOf("//") - 5);
bool DBExist = false;
foreach (SQLDMO.Database db in srv.Databases)
{
if (db.Name == dbName)
{
DBExist = true;
}
}
if (DBExist)
{
staS.Items["SSLDB"].Text = "此数据库存名已存在请选择其它名称";
srv.Close();
sqlApp.Quit();
return;
}
else
staS.Items["SSLDB"].Text = "正在创建数据库...";
SQLDMO.Database nDB = new SQLDMO.Database();
SQLDMO.DBFile nDBFile = new SQLDMO.DBFile();
SQLDMO.LogFile nLogFile = new SQLDMO.LogFile();
nDB.Name = dbName;
nDBFile.Name = dbName + "file";
nDBFile.PhysicalName = @dbPath;
nDBFile.PrimaryFile = true;
nDBFile.FileGrowthType = 0;
nDBFile.FileGrowth = 1;
nDB.FileGroups.Item("primary").DBFiles.Add(nDBFile);
nLogFile.Name = dbName + "log";
nLogFile.PhysicalName = @dbPath.Substring(0,dbPath.Length - 3) + "ldf";
nDB.TransactionLog.LogFiles.Add(nLogFile);
srv.Databases.Add(nDB);
//程序在这里报错:
//The physical file name '//DATASRV/SHARE/TEST.MDF'my be incorrect
srv.Close();
sqlApp.Quit();
我的暂时解决办法:
string dbPath = srv.Registry.SQLDataRoot + "//DATA//" + dbName;
把文件存到服务器SQLServer安装文件夹的DATA文件夹里