1

我正在尝试创建一个数据库,但是一旦创建,我就无法连接到它。

服务器是 Microsoft SQL Server 2008 并使用 .Net 4.5。我们使用 SMO 创建数据库,但我们通常使用Dapper连接和查询数据库。

这是我到目前为止的代码,它有效:

System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(connectionString);

Microsoft.SqlServer.Management.Smo.Server srv = new Microsoft.SqlServer.Management.Smo.Server(new Microsoft.SqlServer.Management.Common.ServerConnection(con));

var database = new Microsoft.SqlServer.Management.Smo.Database(srv, dbName);

database.Create(false);

database.Roles["db_datareader"].AddMember(???);
database.Roles["db_datawriter"].AddMember(???);
database.Roles["db_backupoperator"].AddMember(???);

srv.Refresh();

没有????我努力了

System.Environment.UserDomainName + "\\" + System.Environment.UserName

System.Environment.UserName

但它失败(更新Add member failed for DatabaseRole 'db_datareader'.与两个值的错误。

问题是,当我创建数据库时,由于某种原因(使用 Dapper),我无法从同一个程序连接到它。(更新)我收到错误消息:(数据库名称、我的登录域和我的 Windows 登录Cannot open database \"<database_name>\" requested by the login. The login failed.\r\nLogin failed for user '<domain>\\<username>'在哪里)。<database_name><domain><username>

我错过了什么吗?我在做正确的事吗?我试过在网上搜索,但似乎没有人以这种方式创建数据库。方法在那里,它应该工作,不是吗?

**更新**

如果我注释这些database.Roles["..."].AddMember(...)行,并在 处添加一个断点srv.Refresh(),则从那里恢复程序可以解决所有问题。

为什么断点可以解决一切?我不能只在生产中破坏程序......也不能在每次创建数据库时破坏程序。

4

2 回答 2

1

听起来 Dapper 连接问题是 SQL Server 异步执行某些 SMO 操作的问题。很可能,新数据库不会立即为其他用户/连接做好准备,但 SQL Server 需要一些时间来准备它。在“人类时间”(在 SSMS 或断点中)这并不明显,但“程序时间”它太快了,所以你可能需要暂停一下。

也可能是 Role's 的问题AddMember,但这里有很多可能是错误的,我们没有足够的信息来说明。(具体来说,AddMember以后会起作用吗?传递的字符串是否正确?)

于 2013-06-21T01:13:45.980 回答
0

发生这种情况是因为您创建了user,但该用户没有登录。虽然我不知道确切的语法,但您将不得不创建一个Login. 您需要将其设置LoginTypeLoginType.WindowsUser. 此外,您可能需要将 设置WindowsLoginAccessTypeWindowsLoginAccessType.Grant并且您需要Credential通过构建一个来设置 ,可能是NetworkCredential您想要的用户名。

为了对此进行可视化,位于 Management StudioLoginSecurity节点下,而位于. 两者都需要存在才能访问 SQL Server。ServerUserSecurityDatabase

于 2013-06-21T01:14:21.440 回答