以下代码示例在某些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
答案 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中得到错误,如下所示......
因此,我可以确认代码是好的。看起来你在服务器上没有足够的烫发。
答案 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秒空闲时间后停止了数据库,所以这也解决了应用程序中与数据库无关的其他错误。