【问题标题】:Attach database programmatically以编程方式附加数据库
【发布时间】:2016-02-29 12:51:57
【问题描述】:

我的项目中有一个登录表单,我编写以下代码以在此登录表单加载时附加我的数据库(在 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# 发布)并安装 SQL Server 和我的项目,并将我的数据库复制到另一台 PC 的 d:\ 中。但是当我运行我的项目时,数据库不会附加!我不知道为什么会出现这个问题......但我想可能是因为我没有编写任何代码来定义 *.ldf 文件(但我将 mdf 和 ldf 文件都放在 d:\ 中)

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

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

(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

【问题讨论】:

  • 你在 catch 中遇到任何错误吗?
  • 嗯,是的,基本的调试技能真的很难掌握。首先捕获异常并查看 SQL Server 日志以了解发生了什么。我很确定这个电话不会神奇地什么都不做。
  • @DynamicVariable 问题已更新
  • @TomTom 是的,“。”将您连接到本地实例,您通常使用 SQL Server express 以以下形式看到它:.\MYINSTANCE
  • 请不要将标签直接放在标题中。有关详细信息,请参阅Should questions include tags in the title

标签: c# sql-server winforms


【解决方案1】:

我冒昧地猜测这是一个权限问题,通常新安装的 SQL Server 正在运行 NETWORK_SERVICE,这是一个权限非常低的帐户。它可能无法访问 G 驱动器的根目录(或它的任何部分)。

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

【讨论】:

  • 我如何“将登录使用更改回 NETWORK_SERVICE,然后将适当的权限应用于需要它的文件夹/文件”
  • 查看此链接,了解如何将服务配置为NETWORK SERVICE:technet.microsoft.com/en-us/library/cc755249.aspx。一旦你让它再次以NETWORK SERVICE 运行,那么你可以根据需要将该用户简单地添加到文件/文件夹权限中(我通常将其作为 NETWORK_SERVICE 添加到 ACL)。
  • 我怎样才能以编程方式做到这一点?!
  • 以编程方式做什么?
  • “将登录使用更改回 NETWORK_SERVICE,然后将适当的权限应用于需要它的文件夹/文件”我不希望用户执行此步骤...
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多