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

时间:2015-06-09 21:37:55

标签: c# .net sql-server linq-to-sql

我尝试使用继承DataContext.CreateDatabase()的类创建一个新数据库,并且我还尝试了一个来自StackExchange帖子的方法,但两者都会导致使用类似的回溯抛出相同的异常。我安装了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:发生文件激活错误。   物理文件名&#39; testdb.mdf&#39;可能不正确。诊断和   更正其他错误,然后重试该操作。创建数据库   失败。无法创建列出的某些文件名。检查相关   错误。

     

在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,   Boolean breakConnection,Action`1 wrapCloseInAction)

     

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

     

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

     

在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,   SqlCommand cmdHandler,SqlDataReader dataStream,   BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject   stateObj,布尔&amp; dataReady)

     

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

     

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

     

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

     

at sandbox.Program.CreateSqlDatabase(String filename)

     

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

1 个答案:

答案 0 :(得分:0)

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