【发布时间】:2012-03-07 00:20:08
【问题描述】:
我正在使用SQL Server Management Objects 创建一个数据库。
我写了如下方法来生成数据库:
public static void CreateClientDatabase(string serverName, string databaseName)
{
using (var connection = new SqlConnection(GetClientSqlConnectionString(serverName, String.Empty)))
{
var server = new Server(new ServerConnection(connection));
var clientDatabase = new Database(server, databaseName);
clientDatabase.Create();
server.ConnectionContext.Disconnect();
}
}
此后不久,我调用另一个方法来执行 SQL 脚本以生成表等:
public static void CreateClientDatabaseObjects(string createDatabaseObjectsScriptPath, string serverName, string databaseName)
{
using (var connection = new SqlConnection(GetClientSqlConnectionString(serverName, databaseName)))
{
string createDatabaseObjectsScript = new FileInfo(createDatabaseObjectsScriptPath).OpenText().ReadToEnd();
var server = new Server(new ServerConnection(connection));
server.ConnectionContext.ExecuteNonQuery(createDatabaseObjectsScript);
server.ConnectionContext.Disconnect();
}
}
语句server.ConnectionContext.ExecuteNonQuery(createDatabaseObjectsScript) 抛出SqlException 并带有消息无法打开登录请求的数据库“数据库名称”。登录失败。
用户“用户”登录失败。
如果我尝试单步执行调试器中的语句,则会发生此异常从不,并且脚本可以正常执行。
我唯一的猜测是服务器需要一些时间来初始化数据库,然后才能打开它。这是准确的吗?除了尝试连接和连接失败之外,还有其他方法可以判断数据库是否准备就绪?
编辑:我应该提一下,在所有情况下都肯定会创建数据库。
编辑2: 在创建数据库之前,我调用EntityFramework.dll 的System.Data.Entity.Database.Exists 方法来检查数据库是否已经存在。如果我删除该呼叫,一切似乎都按预期工作。就好像该调用正在缓存结果并从查看新数据库中弄乱后续连接(无论他们是否使用实体框架)。
编辑 3: 我将 EntityFramework 的 Database.Exists 方法替换为使用 Server.Databases.Contains(databaseName) 的基于 SMO 的方法。我遇到了同样的问题,即创建后无法立即打开数据库。同样,如果我在创建之前不检查数据库是否存在,我可以在创建后立即打开它,但我希望能够在创建之前检查是否存在,所以我不会尝试创建现有数据库。
EntityFramework 的Database.Exists 和SMO 的Server.Databases.Contains 都只执行在master.sys.databases 中查找数据库名称的SQL。我不明白这为什么/如何干扰数据库连接。
【问题讨论】:
-
消息是否真的给你一个数据库名称“数据库名称”和一个用户“用户”?这可能是个问题。
-
该方法并没有真正告诉我们有关如何创建数据库的信息。您是否有可以发布的脚本或代码显示数据库的创建语句...?
-
@shanabus:不,我只是将它们更改为不公开真实的数据库或登录名。
-
@DJKRAZE:我正在使用 SQL Server 管理对象的Database.Create。我没有编写自己的 CREATE DATABASE SQL 语句。
-
你不是在这个位置读到一些东西吗 createDatabaseObjectsScriptPath 在一个文件中..??
标签: c# .net sql-server smo