2010-10-21 71 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