2

我有一段代码在运行时创建 SQL Server Express 2008,然后尝试连接到它以在 Transact-SQL 中执行数据库初始化脚本。创建数据库的代码如下:

private void CreateDatabase()
    {
        using (var connection = new SqlConnection(
            "Data Source=.\\sqlexpress;Initial Catalog=master;" +
            "Integrated Security=true;User Instance=True;"))
        {
            connection.Open();
            using (var command = connection.CreateCommand())
            {
                command.CommandText =
                "CREATE DATABASE " + m_databaseFilename +
                " ON PRIMARY (NAME=" + m_databaseFilename +
                ", FILENAME='" + this.m_basePath + m_databaseFilename + ".mdf')";
                command.ExecuteNonQuery();
            }
        }


    }

数据库创建成功。之后,我尝试使用以下代码连接到数据库以运行初始化脚本:

private void ExecuteQueryFromFile(string filename)
    {
        string queryContent = File.ReadAllText(m_filePath + filename);
        this.m_connectionString = string.Format(
            @"Server=.\SQLExpress; Integrated Security=true;Initial Catalog={0};", m_databaseFilename);
        using (var connection = new SqlConnection(m_connectionString))
        {
            connection.Open();
            using (var command = connection.CreateCommand())
            {
                command.CommandText = queryContent;
                command.CommandTimeout = 0;
                command.ExecuteNonQuery();
            }
        }
    }

但是,connection.Open() 语句失败,抛出以下异常:

无法打开登录请求的数据库“TestData”。登录失败。用户“MYDOMAIN\myusername”登录失败。

我对这个错误完全感到困惑,因为我尝试连接的帐户具有系统管理员权限,这应该允许我连接任何数据库(请注意,我首先使用与主数据库的连接来创建数据库)。

4

3 回答 3

4

在创建它时指定 User Instance=True 而不是在尝试连接到它时是否有原因?

当您在与用户实例连接后创建它时,它将创建数据库文件,但不会将其附加到您的实际实例。您要么不必在第一个连接字符串中指定 User Instance=True,要么将其添加到第二个连接字符串并指定要使用的数据库文件。

于 2010-05-13T13:15:27.280 回答
0

您登录的用户是否有权访问数据库“TestData”?

如果不授予用户所需的权限。

我不确定这是否意味着什么,但在您第一次创建时,您正在连接到服务器

.\\sqlexpress

第二个是

.\SQLExpress
于 2010-05-13T13:02:45.710 回答
0

您需要在创建数据库之后但在尝试打开与该数据库的连接之前发出 CREATE USER 命令(请参阅:http: //msdn.microsoft.com/en-us/library/ms173463.aspx )。

例如:

CREATE USER 'MYDOMAIN\myusername' FOR LOGIN 'MYDOMAIN\myusername'
于 2010-05-13T13:09:14.707 回答