代码之家  ›  专栏  ›  技术社区  ›  Fedearne

Linq无法创建数据库

  •  1
  • Fedearne  · 技术社区  · 15 年前

    下面的代码示例在某些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”已存在 存在。选择其他数据库 姓名。

    文件规定: 数据库存在() 如果数据库存在并且可以打开,则返回true。

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

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

    4 回复  |  直到 15 年前
        1
  •  2
  •   Lazarus    15 年前

    这可能是一个权限问题,即数据库存在,但您没有打开它的权限。会返回一个 false 以及您提供的例外情况。

        2
  •  0
  •   Rahul Soni    15 年前

    刚刚用以下代码创建了一个简单的Windows应用程序…

    string connection=@“data source=\sqlexpress;database=testdatabase;integrated security=true”;
    
    linqtosqldataContext dc=新建linqtosqldataContext(连接);
    
    如果(!)dc.databaseexists())
    {
    dc.createDatabase();
    }
    < /代码> 
    
    

    确保没有名为testdatabase的数据库。因为代码按预期工作。在我的案例中,唯一的区别是我使用的是集成安全性。当然,这不是完整的代码,我将在dc.createdatabase中得到一个如预期的错误,如下所示…

    因此,我可以确认代码是好的。看起来你的烫发次数不够。

    翼码…

           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

    因此,我可以确认代码是好的。看起来你的烫发次数不够。

        3
  •  0
  •   Amy B    15 年前

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

    User1: test database existance (false)
    User2: test database existance (false)
    User1: create database
    User2: create database (exception!)
    
        4
  •  0
  •   Fedearne    15 年前

    连接问题是由自动关闭属性设置为true导致的。这是所有SQL Server Express 2008数据库的默认值。

    将此功能设置为“关闭”解决了此问题:

    ALTER DATABASE [database] SET AUTO_CLOSE OFF
    

    因为自动关闭会在空闲30秒后停止数据库,这也解决了应用程序中其他无法解释的与数据库相关的错误。

    More info on AUTO_CLOSE