2011-12-15 5 views
0

Я использую Environment.CurrentDirectory, чтобы получить текущий каталог, то есть «D: \ Chuttu \ Проекты \ ЛИК \ Bin \ Debug»Получение физического пути файла в каталоге проекта

Но я хочу, чтобы удалить " \ bin \ Debug "

Как я могу это сделать? Или есть способ, чтобы я мог получить каталог до «LIC»?

На самом деле это моя строка соединения:

Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\LIC.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True 

Но когда я использую это и попытаться вставить данные в БД, данные не вставлены. Когда я использую строку соединения с физическим путем он начинает работать:

Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Chuttu VB\Projects\LIC\LIC.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True 

Я пытаюсь получить физический путь к файлу mdf и использовать его в строке подключения.


EDIT:

Этот кусок кода работает отлично:

Private Sub save() 
     Dim con As New SqlClient.SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Chuttu VB\Projects\LIC\LIC.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True") 

     Dim sql As New SqlClient.SqlCommand("INSERT INTO ProposerDetails " & _ 
              "VALUES (" & Convert.ToInt32(PolicyNumberTextBox.Text) & ",'" & NameTextBox.Text & "','" & AgeTextBox.Text & "','" & PhoneTextBox.Text & "','" & AddressTextBox.Text & "','" _ 
              & NomineeTextBox.Text & "','" & NomineeRelationTextBox.Text & "'," & PlanID() & ",'" & PolicyTermTextBox.Text & "','" & PremiumAmountTextBox.Text & "','" _ 
              & PremiumTypeComboBox.Text & "','" & SumProposedTextBox.Text & "','Date')", con) 

     MsgBox(sql.CommandText) 
     con.Open() 

     MsgBox(con.State.ToString) 
     Dim i As Integer = sql.ExecuteNonQuery 
     MsgBox(i.ToString) 
     con.Close() 
     sql.Dispose() 
     con.Dispose() 
     ToolStripStatusLabelMessage.Text = "Saved" 
    End Sub 

Как только я изменить строку подключения к строке соединения с app.config это перестает работать (добавление данных DB):

Private Sub save() 
     Dim con As New SqlClient.SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\LIC.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True") 

     Dim sql As New SqlClient.SqlCommand("INSERT INTO ProposerDetails " & _ 
              "VALUES (" & Convert.ToInt32(PolicyNumberTextBox.Text) & ",'" & NameTextBox.Text & "','" & AgeTextBox.Text & "','" & PhoneTextBox.Text & "','" & AddressTextBox.Text & "','" _ 
              & NomineeTextBox.Text & "','" & NomineeRelationTextBox.Text & "'," & PlanID() & ",'" & PolicyTermTextBox.Text & "','" & PremiumAmountTextBox.Text & "','" _ 
              & PremiumTypeComboBox.Text & "','" & SumProposedTextBox.Text & "','Date')", con) 

     MsgBox(sql.CommandText) 
     con.Open() 

     MsgBox(con.State.ToString) 
     Dim i As Integer = sql.ExecuteNonQuery 
     MsgBox(i.ToString) 
     con.Close() 
     sql.Dispose() 
     con.Dispose() 
     ToolStripStatusLabelMessage.Text = "Saved" 
    End Sub 

ПРИМЕЧАНИЕ. У меня нет ошибок.

+1

Прежде всего пути, что вы показываете правильный .. потому что он всегда показывает путь, где приложение запускается из .. смысл ..? Я бы предложил помещать такие вещи, как SqlConnection String, в файл app.config или какой-либо файл .config, который вы используете. вот отличный сайт для того, как форматировать строки подключения. http://www.dofactory.com/Connect/Connect.aspx также перемещает путь/местоположение файла MDF. – MethodMan

+1

. После вашего обновления вы ввели новый набор " те-есть-действительно-плохие идеи "- прочность SQL-инъекции, встроенный SQL, стробированная строка соединения, отсутствие оператора' use'. Я думаю, вы пытаетесь исправить неправильную проблему. Небольшой рефакторинг может пройти долгий путь. –

+0

@Кори, когда я использую строку подключения app.config ... данные не сохраняются в БД. –

ответ

3

Вы можете попробовать:

string dataDirectory = AppDomain.CurrentDomain.BaseDirectory; 

Ссылка:

+0

это заводит меня в каталог отладки ... Мне нужен корневой каталог. –

+0

Но как только вы развернете приложение, путь будет правильным. Visual Studio запускает код из папки 'Debug' или' Release'; что * является * базовым каталогом. Вы можете включить «Скопировать в выходной каталог» в ваш .mdf-файл или создать параметр с указанием пути к базе данных и использовать его вместо жесткого кодирования, если вам нужно сохранить изменения базы данных во время тестирования. –

+0

любезно проверьте вопрос еще раз ... я его обновил. –

1

Перейти к свойствам на файл MDF в Visual Studio (если у вас есть она добавила как часть проект). Установите «Копировать в каталог вывода» на «Копировать, если новый». См. http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx для получения дополнительной информации.

EDIT: просто чтобы уточнить, что это не получает ваш базовый каталог, он просто гарантирует, что ваша база данных окажется в папке с вашим исполняемым файлом, поэтому будут действовать относительные пути.

+0

любезно проверьте вопрос еще раз ... я его обновил. –

2

Вы уверены, что хотите, чтобы ваш окончательный исполняемый файл перемещался по двум каталогам, чтобы найти свою базу данных? Кроме того, для более поздних версий Windows требуются административные права для написания вашей собственной папки приложений в каталоге c: \ Program Files. По-видимому, они хотят, чтобы вы хранили вещи в c: \ ProgramData или так.

+0

любезно проверьте вопрос еще раз ... я его обновил. –

+1

MsgBox() из ваших двух строк подключения и посмотреть, как они выглядят? Вы полагаетесь на свой механизм DB для декодирования | DataDirectory | ? Как это получается, и работает ли он правильно? Кстати, ребята, говорящие о SQL-инъекции, тоже правы. Это не поможет вам решить сегодняшнюю проблему, но это вызывает озабоченность (см. Http://xkcd.com/327/) –

0

У вас нет проблемы с вашей строкой соединения. Проблема в том, что каждый раз, когда вы запускаете приложение, оно использует новую копию вашего mdf, которая включена в ваш проект. Посмотрите на this blog post о проблеме.

+0

Я проверил сообщение ... попробовал ... еще не успел. –

0

Это ответ на ваш вопрос о текущем пути или каталоге вашего проекта.Вы можете использовать REPLACE функцию, чтобы удалить «\ Bin \ Debug \» часть, как это:

Dim path As String path = My.Application.Info.DirectoryPath Dim path1 As String = path.Replace("\bin\Debug", "\")

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