Установить строку подключения на путь базы данных динамически [дублировать]

Чтобы понять, что mod_rewrite вам сначала нужно понять, как работает веб-сервер. Веб-сервер отвечает на HTTP-запросы . HTTP-запрос на самом базовом уровне выглядит следующим образом:

GET /foo/bar.html HTTP/1.1

Это простой запрос браузера на веб-сервер с запросом URL /foo/bar.html. Важно подчеркнуть, что он не запрашивает файл , он запрашивает только некоторые произвольные URL-адреса. Запрос также может выглядеть так:

GET /foo/bar?baz=42 HTTP/1.1

Это так же верно, как и запрос на URL-адрес, и он явно не имеет ничего общего с файлами.

Веб-сервер это приложение, прослушивающее порт, прием HTTP-запросов, поступающих на этот порт, и возвращение ответа. Веб-сервер полностью может отвечать на любой запрос любым способом, который он считает нужным / каким-либо образом вы настроили его для ответа. Этот ответ не является файлом, это HTTP-ответ , который может или не может иметь ничего общего с физическими файлами на любом диске. Веб-сервер не обязательно должен быть Apache, есть много других веб-серверов, которые являются всего лишь программами, которые работают постоянно и привязаны к порту, который отвечает на HTTP-запросы. Вы можете написать его самостоятельно. Этот параграф был предназначен для развода с любым понятием, что URL-адреса напрямую равны файлам, что действительно важно для понимания. :)

Конфигурация по умолчанию для большинства веб-серверов - это поиск файла, который соответствует URL-адресу на жестком диске. Если document root сервера установлен, скажем, /var/www, он может посмотреть, существует ли файл /var/www/foo/bar.html и обслуживать его, если это так. Если файл заканчивается на «.php», он вызовет интерпретатор PHP и , после чего вернет результат. Вся эта ассоциация полностью настраивается; файл не должен заканчиваться на «.php» для веб-сервера для запуска его через интерпретатор PHP, и URL-адрес не должен соответствовать конкретному файлу на диске, чтобы что-то произошло.

mod_rewrite - это способ переписать внутреннюю обработку запросов. Когда веб-сервер получает запрос на URL /foo/bar, вы можете переписать этот URL-адрес на что-то еще, прежде чем веб-сервер будет искать файл на диске в соответствии с ним. Простой пример:

RewriteEngine On
RewriteRule   /foo/bar /foo/baz

Это правило говорит всякий раз, когда запрос соответствует «/ foo / bar», перепишите его на «/foo/baz". Затем запрос будет обработан как если бы /foo/baz был запрошен. Это может быть использовано для различных эффектов, например:

RewriteRule (.*) $1.html

Это правило соответствует чему-либо (.*), а захватывает it ((..)), а затем перезаписывает его добавьте «.html». Другими словами, если /foo/bar был запрошенным URL-адресом, он будет обрабатываться так, как будто запрошено /foo/bar.html. См. http://regular-expressions.info для получения дополнительной информации о сопоставлении регулярных выражений, захвате и замене.

Другое часто встречающееся правило:

RewriteRule (.*) index.php?url=$1

Это опять-таки сопоставляет что-либо и переписывает его в файл index.php с первоначально запрошенным URL-адресом, добавленным в параметр запроса url. Т.е. для любых входящих и входящих запросов файл index.php выполняется, и этот файл будет иметь доступ к исходному запросу в $_GET['url'], поэтому он может делать с ним что угодно.

В первую очередь вы помещаете эти правила перезаписи в свой конфигурационный файл веб-сервера .

* Если разрешено первичным Apache, то вы можете поместить их в файл с именем .htaccess в корне вашего документа (т. Е. Рядом с вашими файлами .php). Файл конфигурации; это необязательно, но часто разрешено.

Что mod_rewrite делает not do

mod_rewrite не волшебным образом делает все ваши URL «хорошенькими». Это распространенное недоразумение. Если у вас есть эта ссылка на вашем веб-сайте:


нет ничего, что мог бы сделать mod_rewrite, чтобы сделать это красиво. Чтобы сделать это красивой ссылкой, вы должны:

  1. Измените ссылку на красивую ссылку:
    
    
  2. Используйте mod_rewrite на сервере для обработки запроса к URL /my/pretty/link, используя любой из описанных выше методов.

(Можно использовать mod_substitute для преобразования исходящих HTML-страниц

Существует много возможностей mod_rewrite и очень сложные правила соответствия, которые вы можете создать, включая цепочку нескольких переписываний, проксирование запросов на совершенно другую услугу или машину, возврат определенных кодов статуса HTTP в виде ответов, перенаправление запросов и т. д. Это очень мощный и может быть использован для хорошего использования, если вы понимаете основной механизм запроса HTTP-ответа. Он не автоматически делает ваши ссылки симпатичными.

См. Официальную документацию для всех возможных флагов и опций.

43
задан Jeroen 14 May 2015 в 14:35
поделиться

7 ответов

Спасибо всем, я использовал комбинацию ваших ответов.

В моем файле app.config моя строка подключения определяется следующим образом

<add name="MyConnectionString"
    connectionString="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" />

В моем модульном тестовом классе I установите свойство DataDirectory, используя следующий

[TestInitialize]
public void TestInitialize()
{
    AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Databases"));

    // rest of initialize implementation ...
}
58
ответ дан Adam Jenkin 21 August 2018 в 01:48
поделиться

Я сделал следующее. Надеюсь, это кому-то поможет.

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));
0
ответ дан cgatian 21 August 2018 в 01:48
поделиться

Да, | DataDirectory | Веб-приложение для выбора каталога App_Data веб-приложения.

В не веб-приложении, в зависимости от .NET Framework, его можно было бы использовать а также изменено с помощью AppDomain.SetData

Но у вас есть другие две возможности для создания соединения:

1.- Использовать относительный путь:

String con ="... AttachDbFilename=Databases\MyUnitTestDB.mdf ... ";

2.- получить путь приложения и добавить в строку. В c # приложении Windows вы можете использовать Application.StartupPath

 String con= " ... AttachDbFilename=" + Application.StartupPath + "\Databases\MyUnitTestDB.mdf ... ";

В зависимости от типа приложения или режима запуска вы получили разные свойства. Пример:

  • Application.StartupPath - начальный путь приложения exe, запускающего приложение
  • Application.ExecutablePath - начальный путь имени приложения exe, который stats the application Но для использования приложения вам необходимо включить System.Windows.Forms, который не включен, например, в консольные приложения.
  • System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly () .GetName () CodeBase) - Это получает путь от текущей сборки «dll, exe, ...» Не влияет тип приложения, изменения пути, ... Всегда возвращайте каталог, когда находится Assemby.
  • Environment.CurrentDirectory - текущий каталог. Это можно изменить, например, если вы перейдете в папки.

Здесь вы можете найти больше о различных параметрах строки подключения http://www.connectionstrings.com/sql-server -2005

12
ответ дан Dubas 21 August 2018 в 01:48
поделиться
  • 1
    Спасибо Dubas, вариант 1 - это то, что я хочу использовать, но я не могу заставить это работать. – Adam Jenkin 17 August 2010 в 11:25
  • 2
    Вариант 1 зависит от пути выполнения. Если ваш тест UInit выполняется с другим путем, что ваше приложение, вероятно, использует относительный путь, дает вам другой путь, ожидающий путь. – Dubas 17 August 2010 в 12:53
  • 3
    +1 Отличный ответ – sohaiby 21 July 2014 в 12:57
  • 4
    @Dubas | DataDirectory | переменная не только для веб-приложений, вы можете ее использовать в любом месте – Anton Kalcik 1 September 2016 в 20:39

Динамический путь в соединении SQL Server

SqlConnection  con="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ;
0
ответ дан Gwenc37 21 August 2018 в 01:48
поделиться

У меня здесь нет Visual Studio, но как насчет:

using System.IO;
using System.Windows.Forms;

string appPath = Path.GetDirectoryName(Application.ExecutablePath);
AttachDBFilme = appPath + "\\MyUnitTestDB.mdf"
2
ответ дан João Pereira 21 August 2018 в 01:48
поделиться
  • 1
    Я бы предложил что-то по этой линии, возможно, используя вместе с сборщиками строк для сборки ADO.NET , чтобы собрать окончательную строку соединения. – stakx 17 August 2010 в 10:12

Я потратил целый день на поиски работы и, наконец, получил ключ от этого

Вот мое решение: 1. Использовать | DataDirectory | в строке соединения

<add name="NorthwindConnectionString" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDbFilename=|DataDirectory|\Northwind.mdf;User Instance=True" providerName="System.Data.SqlClient" />

2.Set DataDirectory в ClassInitialize

[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext)
{
    string baseDir = AppDomain.CurrentDomain.BaseDirectory;
    int index = baseDir.IndexOf("TestResults");
    string dataDir = baseDir.Substring(0, index) + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
    AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
}

enter image description here [/g1]

7
ответ дан nonetaku 21 August 2018 в 01:48
поделиться

Я создаю простое приложение Windows Forms с VS2010 с C # 3.0. Также, используя SQL Express 2008 RC2.

Я могу использовать: |DataDirectory|MyDb.mdf в строке соединения самостоятельно, ничего не меняя. |DataDirectory| указывает на расположение моего .exe-файла.

Я подумаю, что это будет первое, что вы все попробуете, поэтому я указываю свою версию VS и SQL , Или, может быть, это новичок в C # 3.0.

Моя полная строка подключения:

"Server=.\SQLExpress;AttachDbFilename=|DataDirectory|App_Data\ThumbsUpPlayer.mdf;Database=ThumbsUpPlayer;Trusted_Connection=Yes;"

Заметьте, что я добавил в приложение папку «App_Data», потому что я используемый для Db в этой папке, папка не распознается VS.

3
ответ дан Wasted_Coder 21 August 2018 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: