以编程方式附加数据库

时间:2016-02-29 12:51:58

标签: c# sql-server winforms

我的项目中有一个登录表单,当我登录表单加载时,我在下面编写代码来附加我的数据库(在d:\中):

try
{ 
    SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True");
    con.Open();

    SqlDataAdapter da = new SqlDataAdapter("select name from sys.databases", con);
    DataTable dt = new DataTable();
    da.Fill(dt);

    string[] array = dt
        .AsEnumerable()
        .Select(row => row.Field<string>("Name"))
        .ToArray();

    if (!array.Contains("cstmrDB", StringComparer.OrdinalIgnoreCase))
    {
        SqlCommand cmd = new SqlCommand("sp_attach_db");
        cmd.Connection = con;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@dbname", "Apdb");
        cmd.Parameters.AddWithValue("@filename1", @"d:\Apdb.mdf");
        cmd.ExecuteNonQuery();

    }
}
catch (exception ex) 
{ 
    messagebox.show(ex.message); 
}

它在我的笔记本电脑上工作正常。我发布我的项目(使用c#publish)并安装SQL Server和我的项目,并将我的数据库复制到另一台PC的d:\中。但是当我运行我的项目时,数据库不会被附加!我不知道为什么会出现这个问题...但我想也许是因为我没有编写任何代码来定义* .ldf文件(但我把mdf和ldf文件放在d:\中)

  

错误:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。

     

找不到服务器或无法访问服务器。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。

     

(provider:Named Pipes Provider,错误:40 - 无法打开与SQL Server的连接)

1 个答案:

答案 0 :(得分:2)

我冒昧地猜测这是一个权限问题,通常新安装的SQL Server正在运行<reference>.observeEventType(FEventType.Value, withBlock: { snapshot in let currentUser = snapshot.value.objectForKey("username") as! String <--your code--> print("Username: \(currentUser)") self.currentUsername = currentUser }, withCancelBlock: { error in print(error.description) }) } 这是一个相当低权限的帐户。 可能无法访问G驱动器的根目录(或其任何部分)。

您可以通过将服务更改为NETWORK_SERVICE来快速测试。一旦您确认这是一个问题,我建议您将使用日志更改回LocalSystem,然后将相应的权限应用于需要它的文件夹/文件。