动态创建.mdf 数据库时文件激活错误

File activation error when dynamically creating .mdf database

我尝试使用继承 DataContext.CreateDatabase() 的 class 创建一个新数据库,我还尝试了 StackExchange post 的方法,但两者的结果相同使用类似的回溯抛出异常。我安装了 SQL Server 2008,但我从未使用过它,所以完全有可能我没有进行一些基本配置。

我尝试过的:

https://msdn.microsoft.com/en-us/library/bb399420(v=vs.110).aspx

using System;
using System.Data.Linq;
using System.Data.Linq.Mapping;
namespace sandbox
{
    public class MyDVDs : DataContext
    {
        public Table<DVD> DVDs;
        public MyDVDs(string connection) : base(connection) { }
    }

    [Table(Name = "DVDTable")]
    public class DVD
    {
        [Column(IsPrimaryKey = true)]
        public string Title;
        [Column]
        public string Rating;
    }
    class Program
    {
        public static void Main(string[] args)
        {
            MyDVDs db = new MyDVDs("mydvds.mdf");
            db.CreateDatabase();
        }
    }
}

Create .mdf/.sdf database dynamically

public static void CreateSqlDatabase(string filename)
{
    string databaseName = System.IO.Path.GetFileNameWithoutExtension(filename);
    using (var connection = new System.Data.SqlClient.SqlConnection(
        "Data Source=.\sqlexpress;Initial Catalog=tempdb; Integrated Security=true;User Instance=True;"))
    {
        connection.Open();
        using (var command = connection.CreateCommand())
        {
            command.CommandText =
                String.Format("CREATE DATABASE {0} ON PRIMARY (NAME={0}, FILENAME='{1}')", databaseName, filename);
            command.ExecuteNonQuery();

            command.CommandText =
                String.Format("EXEC sp_detach_db '{0}', 'true'", databaseName);
            command.ExecuteNonQuery();
        }
    }
}

异常和跟踪:

System.Data.SqlClient.SqlException: A file activation error occurred. The physical file name 'testdb.mdf' may be incorrect. Diagnose and correct additional errors, and retry the operation. CREATE DATABASE failed. Some file names listed could not be created. Check related errors.

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)

at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)

at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)

at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)

at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

at sandbox.Program.CreateSqlDatabase(String filename)

at sandbox.Program.Main(String[] args)

显然在创建 DataContext 对象时需要指定完整的文件路径。仅仅使用 "mydvds.mdf" 是不够的。