2012-06-14 2 views
4

Я создаю приложения для форм Windows C#, работа может быть скомпонована, поскольку пользователи заполняют какую-либо форму, а данные сохраняются в базе данных Access. Теперь проблема, с которой я сталкиваюсь, заключается в том, что я должен предоставить это как файл установки кому-то. Я думаю, что код, однажды установленный на других компьютерах и выполненный, даст ошибки из-за строки подключения Access db, поскольку он не будет соответствовать этому компьютеру. Я знаю, что если распределять проекты, я могу установить строку подключения в app.config, и каждый пользователь может изменить ее в соответствии с его/ее машиной. Но поскольку я даю файл установки, как решить эту проблему.Изменение строки подключения после создания файла установки на C# .NET

+0

Это хоть один ... Я пробовал это раньше, но не смог его выполнить. Попробуйте [** этот пользовательский создатель диалога **] (http://www.codeproject.com/Articles/18834/Create -custom-dialogs-for-use-in-your-Visual-Studi), возможно, отправная точка. Удачи и, пожалуйста, отправьте ответ, как только вы его получите. –

+0

Можете ли вы показать конфигурационный файл приложения с настройкой в ​​начале> Все программы? – Sunny

ответ

0

Вы можете построить ConnectionString во время выполнения с помощью SqlConnectionStringBuilder

// Create a new SqlConnectionStringBuilder and 
    // initialize it with a few name/value pairs. 
    SqlConnectionStringBuilder builder = 
     new SqlConnectionStringBuilder(GetConnectionString()); 

    // The input connection string used the 
    // Server key, but the new connection string uses 
    // the well-known Data Source key instead. 
    Console.WriteLine(builder.ConnectionString); 

    // Pass the SqlConnectionStringBuilder an existing 
    // connection string, and you can retrieve and 
    // modify any of the elements. 
    builder.ConnectionString = "server=(local);user id=ab;" + 
     "password= a!Pass113;initial catalog=AdventureWorks"; 

    // Now that the connection string has been parsed, 
    // you can work with individual items. 
    Console.WriteLine(builder.Password); 
    builder.Password = "[email protected]"; 
    builder.AsynchronousProcessing = true; 

    // You can refer to connection keys using strings, 
    // as well. When you use this technique (the default 
    // Item property in Visual Basic, or the indexer in C#), 
    // you can specify any synonym for the connection string key 
    // name. 
    builder["Server"] = "."; 
    builder["Connect Timeout"] = 1000; 
    builder["Trusted_Connection"] = true; 
    Console.WriteLine(builder.ConnectionString); 

    Console.WriteLine("Press Enter to finish."); 
    Console.ReadLine(); 

Edit: вы можете использовать это: Finding SQL Servers on the Network

+0

Это база данных Access, к которой они подключаются, а не SQL Server. – cjk

+0

MS Access DB - это ODBC/OLEDB. Тогда выше будет работать, просто измените строку подключения. –

0

Я встретил эту проблему раньше. Я решаю его таким образом.
(1) в файле app.config, поместите заполнитель в строку соединения. строка подключения будет содержать путь к файлу доступа db. замените путь специальной строкой.

<connectionStrings> 
    <!-- original connection string , change it to the below line --> 
    <!-- <add name="test" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\test\test.mdb "/> --> 
    <add name="test" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=##path##\test.mdb "/> 
    </connectionStrings> 

(2) Когда приложение запускается, используйте Directory.GetCurrentDirectory, чтобы получить путь к приложению. , прежде чем создать соединение, замените ## путь ## на фактический путь на клиентском компьютере.

static void test() 
{ 
    string s = ConfigurationManager.ConnectionStrings["test"].ConnectionString; 
    s.Replace("##path##", Directory.GetCurrentDirectory()); 
    OleDbConnection conn = new OleDbConnection(s); 
} 
+0

Могу ли я объяснить это небольшим кодом. Заранее спасибо! – Imran

+0

Я вставил код, он работает хорошо. Но я думаю, что ответ Стива более гибкий. Вы можете попробовать это, как сказал Стив. – Jerry

3

Предположим, что вы развернуть app.config с этим ConnectionString

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\yourFile.accdb;" 

В приложении WinForms |DataDirectory| ярлык представлять вашу рабочую папку приложения, но вы можете изменить во время выполнения, когда он указывает на использование этого код.

// appdomain setup information 
AppDomain currentDomain = AppDomain.CurrentDomain; 
//Create or update a value pair for the appdomain 
currentDomain.SetData("DataDirectory", "Your user choosen path"); 

Это устраняет необходимость в жестком коде полный путь, который имеет вы обнаружили, приводит к ряду проблем для решения во время установки. Конечно, ваша настройка должна доставить вашу базу данных в выбранном вами пользователем пути.

+0

но что, когда у нас есть SQL-сервер? Он содержит имя экземпляра в соответствии с именем компьютера. – Freelancer

+0

Если вы распространяете файл MDF самостоятельно, вы должны попробовать с атрибутом AttachDbFileName как [объяснено здесь] (http://msdn.microsoft.com/en-us/library/ms247257 (v = VS.80) .aspx), но если у вас уже установлена ​​база данных, вы можете попробовать с помощью настраиваемой процедуры настройки, которая запрашивает хост-источник данных. С другой стороны, вы можете добавить параметр конфигурации в свою программу, который запрашивает после установки этой информации вашему пользователю и перенастроить строку подключения. – Steve

+0

. Я прикрепляю DB только с помощью приложения db. Но если на моей машине экземпляр./ SQLExpress, а на других иногда может отличаться в зависимости от имени компьютера, такого как steve/SQLExpress или любого другого. Это полностью зависит от имени экземпляра [имя сервера в строке подключения] в этом случае, что нам делать? – Freelancer

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