C#使用SMO以编程方式创建数据库

时间:2013-06-20 23:16:49

标签: c# sql-server-2008

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

服务器是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();

N ????我试过了

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

System.Environment.UserName

但它失败了(更新),错误Add member failed for DatabaseRole 'db_datareader'.包含两个值。

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

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

** 更新 **

如果我对database.Roles["..."].AddMember(...)行进行评论,并在srv.Refresh()添加断点,那么从那里恢复程序就可以解决所有问题。

为什么断点能解决所有问题?我不能只是在生产中破坏程序......也不能在每次创建数据库时破坏程序。

2 个答案:

答案 0 :(得分:1)

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

这个可能也是角色AddMember的问题,但是这里有很多可能有问题的东西,而且我们没有足够的信息可讲。 (具体来说,AddMember稍后会工作吗?并且正确传递的字符串是否正确?)

答案 1 :(得分:0)

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

要对此进行直观显示,Login位于Management Studio中Security的{​​{1}}节点下,而Server位于UserSecurity的节点。两者都需要存在才能访问SQL Server。