2010-10-21 73 views
1

以下代码示例在某些PC上随机失败。在其他PC上,问题不能被复制。所有PC都在Vista SP1上运行.NET 3.5 SP1。LINQ无法创建数据库

string connection = @"Data Source=PCNAME\SQLEXPRESS;Database=TestDatabase ;User Id=sa;Password=ThePassword;"; 

TestDatabase db = new TestDatabase (connection); 

if (!db.DatabaseExists()) 
{ 
    db.CreateDatabase(); 
} 

DatabaseExists()返回falseCreateDatabase()抛出这个异常:

System.Data.SqlClient.SqlException: 数据库 'TestDatabase' 已经存在 。选择不同的数据库 名称。

该文档指出,如果数据库存在并且可以打开,DatabaseExists()返回true。

什么可能导致数据库不可用?

编辑:数据库服务器的SQL Server Express 2008

回答

0

连接问题是由AUTO_CLOSE属性设置为true引起的。这是所有SQL Server Express 2008数据库的默认设置。

设置此功能为关解决了问题:

ALTER DATABASE [database] SET AUTO_CLOSE OFF 

由于AUTO_CLOSE停止30秒空闲时间后,数据库,这也是在应用程序中解决其他不明原因的数据库相关的错误。

More info on AUTO_CLOSE

2

这可能是一个供股,即数据库中存在,但您没有权限打开它。这将返回一个false,也是您提供的例外。

+0

奇怪的是,问题出现在某些机器上。即有一次它未能成功。 – Fedearne 2010-10-21 11:55:16

+0

这是在你的代码的连续执行,没有做任何事情(我的意思是什么)之间?如果是这样,那确实很奇怪。 – Lazarus 2010-10-21 11:59:46

+0

我在应用程序启动过程中执行操作。如果我得到错误 - 我只是重新启动应用程序,我通常立即工作。 – Fedearne 2010-10-21 12:11:13

0

就创建了一个简单的Windows应用程序使用下面的代码...

 string connection = @"Data Source=.\SQLEXPRESS;Database=TestDatabase;Integrated Security=True"; 

     LinqToSQLDataContext dc = new LinqToSQLDataContext(connection); 

     if (!dc.DatabaseExists()) 
     { 
      dc.CreateDatabase(); 
     } 

确保有一个名为TestDatabase没有数据库。由于代码按预期工作。我的情况唯一的区别是我使用集成安全性。当然,这不是完整的代码,如dc.CreateDatabase预计如下,我会得到一个错误......

alt text

因此,我可以证实,该代码是好的。看起来你在服务器上没有足够的权限。

0

它可能是一个多用户的竞争条件?

User1: test database existance (false) 
User2: test database existance (false) 
User1: create database 
User2: create database (exception!) 
+0

这是一个很好的理论,但数据库已经存在,当应用程序启动时。 – Fedearne 2010-10-22 11:26:58