SQL Server LocalDB无法创建数据库

时间:2015-12-11 10:13:43

标签: c# sql-server localdb

这是我的完整示例:

var builder = new SqlConnectionStringBuilder();
builder.DataSource = "(localdb)\\v11.0";
builder.IntegratedSecurity = true;
builder.AttachDBFilename = "test.mdf";
builder.InitialCatalog = "test";
builder.ConnectTimeout = 60;

var connStr = builder.ToString();

using (var conn = new SqlConnection(connStr))
{
    conn.Open();
}

例外:

  

System.Data.SqlClient.SqlException(0x80131904):无法将文件'test.mdf'作为数据库'test'附加。
  在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔breakConnection,Action`1 wrapCloseInAction)
  ClientConnectionId:6ea99bb4-5703-4354-84f3-cfc5bcd8c045
  错误号码:1832,州:1,班级:14

如果我评论AttachDBFilename部分,我会得到:

  

无法打开登录请求的数据库“test”。登录失败。

如果我评论InitialCatalog部分,我会得到:

  

尝试为文件test.mdf附加自动命名的数据库失败。存在具有相同名称的数据库,或者无法打开指定的文件,或者它位于UNC共享上。

我以普通用户身份运行,如果我使用Path.GetTempPath()指定数据路径,则会得到完全相同的错误,即我拥有数据位置的访问权限。

没有现有test.mdf个文件,也没有test个数据库。我可以更改我喜欢的文件名和数据库名,并获得完全相同的消息。

如果我使用sqllocaldb工具stopdelete v11.0实例,第一次时间,我会运行上面的代码,我明白了:

  

连接超时已过期。尝试使用登录前握手确认时超时时间已过。这可能是因为登录前握手失败或服务器无法及时响应。尝试连接到此服务器所花费的时间是 - [Pre-Login] initialization = 3274;握手= 1;

(这几乎立即发生,即它没有用完我在连接字符串中设置的60秒连接超时)

如果我重新启动计算机然后运行代码,我会看到相同的内容。

之后,我每次都会得到上述错误。

我不确定还有什么要尝试的!

1 个答案:

答案 0 :(得分:3)

好的,这是交易:

LocalDB实际上并不自动创建数据库。只是大多数示例都有实体框架,在很多配置中都会创建缺少的数据库。

EF实际上非常聪明,它将检测连接字符串中的AttachDBFilename值以构建自定义CREATE DATABASE命令,以及符合指定值的正确数据/日志文件路径。它将尝试使用指定的连接字符串,如果失败,它将调整连接字符串以连接到master数据库并发出CREATE DATABASE。最后,这也是我所做的。

顺便说一下,我实际上是在我的主要例子中使用EF。我的问题中的代码是一个很好的测试用例,但是我很长时间没有得到我在这里概述的相同的异常,即使在“auto-create-if-missing”配置模式下使用EF也是如此。这是因为我打开了异常突破,Just Just Code关闭,即我看到了EF内部异常。