2016-02-29 3 views
1

У меня есть форма входа в моем проекте, и я напишу ниже кода, чтобы прикрепить свою базу данных (есть в 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 и свой проект и копирую свою базу данных в d: \ на другом ПК. но когда я запускаю свой проект, база данных не будет прикрепляться! Я не знаю, почему эта проблема возникает ... но я думаю, может быть, причина в том, что я не пишу никакого кода для определения файла * .ldf (но я помещаю как файлы mdf, так и ldf в d: \)

ERROR: A network-related or instance-specific error occurred while establishing a connection to SQL Server.

The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.

(provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

+0

У вас есть ошибка в catch? –

+0

Ну, да, основные навыки отладки действительно трудно получить. Начните с обнаружения исключения и просмотра журнала SQL Server, чтобы узнать, что произойдет. Я совершенно уверен, что призыв не волшебным образом ничего не делает. – TomTom

+0

@DynamicVariable вопрос обновлен – Ali

ответ

1

Я бы рискнул догадаться, что это проблема с разрешениями, обычно только что установленный SQL Server работает с NETWORK_SERVICE, который является учетной записью с очень низкой привилегией. Он , вероятно, не имеет доступа к корню вашего диска G (или любой его части, если на то пошло).

Вы можете проверить это очень быстро, заменив servie на LocalSystem. Как только вы подтвердите это как проблему, я бы рекомендовал изменить использование журнала на NETWORK_SERVICE, а затем применить соответствующие разрешения к папке/файлам, которые в ней нуждаются.

+0

Как я могу «изменить журнал на использование обратно в NETWORK_SERVICE, а затем применить соответствующие разрешения к папке/файлам, которые в ней нуждаются» – Ali

+0

См. эту ссылку о настройке службы для запуска как «NETWORK SERVICE»: https: // technet.microsoft.com/en-us/library/cc755249.aspx. После того, как вы снова запустите его как «NETWORK SERVICE», вы можете просто добавить этого пользователя к разрешениям файла/папки по мере необходимости (обычно я добавляю его в ACL как NETWORK_SERVICE). – CodingGorilla

+0

как я могу сделать это программно ?! – Ali

Смежные вопросы