以编程方式修改C#SMO创建的数据库的文件路径位置?

时间:2015-03-06 19:20:56

标签: c# sql-server smo

我正在尝试以编程方式在C#中使用SMO创建一个新数据库。对于这个项目,我不希望.mdf / .ldf文件放在默认文件夹中 " C:\ Program Files \ Microsoft SQL Server \ MSSQL10_50.SQL2008R2 \ MSSQL \ DATA"。我没有在网上找到任何告诉如何修改文件位置设置的内容。

运行以下代码时出现失败的操作异常:

Server srv = new Server(serverName.Text);

var db = new Database(srv, dbName.Text);            

db.Create();

DataFile df = new DataFile(db.FileGroups["PRIMARY"],
    dbName.Text, pathText.Text + dbName.Text + "_data.mdf");

df.Create();

LogFile lf = new LogFile(db, "Log01", pathText.Text + dbName.Text + "_log.ldf");
lf.Create();

异常发生在df.Create();行。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我认为这个问题适合你。 Use SMO to Change SQL Server Database Default Locations

TTRider的回答是: 您需要显式添加有关数据和日志文件的信息:

答案 1 :(得分:0)

TTRider在链接问题中的答案指向正确的方向,但不完整。使用this post中的一些其他信息,我能够使其正常运行(使用SMO 2016库进行测试)。

private void CreateDatabase(string connectionString, string databaseName, string dataFilePath)
{
    using (SqlConnection sqlConnection = new SqlConnection(connectionString))
    {
        ServerConnection serverConnection = new ServerConnection(sqlConnection);
        Server sqlServer = new Server(serverConnection);
        Database smoDatabase = new Database(sqlServer, databaseName);

        string dataFileName = string.Format("{0}_Data", databaseName);
        string dataFileFullPath = Path.ChangeExtension(Path.Combine(dataFilePath, dataFileName), ".mdf");
        string logFileName = string.Format("{0}_Log", databaseName);
        string logFileFullPath = Path.ChangeExtension(Path.Combine(dataFilePath, logFileName), ".ldf");

        FileGroup fileGroup = new FileGroup(smoDatabase, "PRIMARY");
        smoDatabase.FileGroups.Add(fileGroup);

        DataFile dataFile = new DataFile(fileGroup, dataFileName, dataFileFullPath);
        dataFile.IsPrimaryFile = true;
        fileGroup.Files.Add(dataFile);

        LogFile logFile = new LogFile(smoDatabase, logFileName, logFileFullPath);
        smoDatabase.LogFiles.Add(logFile);

        smoDatabase.Create();

        serverConnection.Disconnect();
    }
}