LINQ无法创建数据库

时间:2010-10-21 11:21:57

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

以下代码示例在某些PC上随机失败。在其他PC上,问题无法再现。所有PC都在Vista SP1上运行.NET 3.5 SP1。

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

TestDatabase db = new TestDatabase (connection);

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

DatabaseExists()返回false,但CreateDatabase()会抛出此异常:

  

System.Data.SqlClient.SqlException:   数据库'TestDatabase'已经存在   存在。选择其他数据库   名。

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

什么可能导致数据库无法使用?

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

4 个答案:

答案 0 :(得分:2)

可能是权利问题,即数据库存在,但您无权打开它。这将返回false以及您提供的例外。

答案 1 :(得分: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

因此,我可以确认代码是好的。看起来你在服务器上没有足够的烫发。

答案 2 :(得分:0)

可能是多用户竞争条件吗?

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

答案 3 :(得分:0)

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

将此功能设置为关闭可解决问题:

ALTER DATABASE [database] SET AUTO_CLOSE OFF

因为AUTO_CLOSE在30秒空闲时间后停止了数据库,所以这也解决了应用程序中与数据库无关的其他错误。

More info on AUTO_CLOSE