2016-08-03 1 views
0

Я пишу программу, где у меня есть несколько большое количество файлов .mdb, и мне нужно иметь возможность подключаться к каждому файлу и выполнять поиск через них и проверять данные пользователя на значения в базе данных. Я не хочу жестко кодировать каждое соединение, потому что базы данных содержат информацию о брандмауэре и правила для определенных местоположений и сетевых администраторов здесь имеют тенденцию добавлять больше файлов доступа в папку, и было бы плохо, если бы нужно было пойти и изменить источник программы код каждый раз, когда это происходит. Особенно когда проект уже не в моих руках, и другой разработчик должен будет работать над ним.C# - Динамический доступ к списку файлов базы данных Microsft Access (.mdb) и открытие их для поиска данных

В настоящее время я создал функцию, которая создает список файлов (видов) файлов, которые заканчиваются расширениями .mdb или .ldb в текущем каталоге. У меня также есть строковый массив имен файлов и вывод их с помощью окна сообщений, чтобы подтвердить, что общая идея метода работает. Программа способна правильно перечислять имена каждого файла с расширением .mdb, поэтому я знаю, что он хотя бы работает, вытягивая каждый файл с этим расширением. Теперь я сталкиваюсь с проблемой прокрутки и открытия каждой базы данных, чтобы вытащить нужную мне информацию. Здесь я смущен. Вот эта функция до сих пор:

private void SelectDstIPTable() 
    { 
     //Write SQL code to select table 
     //Select the table and pull the info 
     //Do something? 
     //Sort? 

     //Does this need to be moved out of the method scope to the whole class? 
     string strQuery = "SELECT * FROM devices WHERE dst_IP like '% " + textBox1.Text + "%' OR src_ip Like '%" + textBox1.Text + "%'"; 

     //This will be the list of files that end in .mbd that the code will loop through looking for the IP 
     string currentDirectory = Directory.GetCurrentDirectory(); 
     var ext = new List<string> { "mdb", "ldb" }; 
     var myFiles = Directory.GetFiles(currentDirectory, "*.*", SearchOption.AllDirectories).Where(s => ext.Contains(Path.GetExtension(s))); 
     string[] fileArray = Directory.GetFiles(currentDirectory, "*.mdb", SearchOption.AllDirectories); 

     string allNames = ""; 

     //Just confirmation that this actually works 
     foreach (string name in fileArray) 
     { 
      allNames += name + "\n"; 
     } 

     MessageBox.Show(allNames); 

     //Now we actually need to do something 
    } 

У меня также есть еще одна функция, которая устанавливает соединение для конкретной базы данных, чтобы убедиться, что мой код для проверки инфо базы данных является действительным. К сожалению, это не так, как здесь, но соответствующий код в любом случае:

private string connParam = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=PathToDatabaseFile.mdb"; 
private void OpenConnection() 
    { 
     firewallConn.ConnectionString = connParam; 
     firewallConn.Open(); 
     successfulConnection = true; 
     MessageBox.Show("Connection successful!"); 
    } 

private void EstablishConnection() 
    { 
     //There's a slight delay in making the connection now that I wrapped it in exception handling 
     //TODO: Try to speed that up and figure out why it was slowed down by a noticable ammount 
     try 
     { 
      if (firewallConn != null && firewallConn.State == ConnectionState.Closed) 
       OpenConnection(); 
      else 
       MessageBox.Show("The connection has already been established.\nType ''Close me'' to close the connection."); 
     } 
     catch (Exception exception) 
     { 
      MessageBox.Show(exception.ToString()); 
     } 
    } 

Если больше деталей необходимо, просто дайте мне знать, и я обеспечу, что я могу.

+1

Забудьте о петле в течение минуты. Вы знаете, как открыть файл .mdb? – elyashiv

+1

не должно быть сложно сделать это более динамичным, просто измените строку подключения, попробуйте открыть, если не удастся, пропустите, если удастся сделать. – BugFinder

+0

@Elyashiv Да - я добавил соответствующий код. БрандмауэрConn.ConnectionString был случайно удален, когда я удалил некоторые комментарии для публикации. Я это исправил. Он успешно соединяется с одной базой данных. – Ryan

ответ

0

Что об этом:

// the loop 
foreach (string name in fileArray) 
{  
    EstablishConnection(name); // you might need a full path! 
    //do search... 
} 

// a little change in the EstablishConnection method 
private void EstablishConnection(String dbPath) 
{ 
    string connParamTemplate = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}"; 
    String conn = String.Format(connParamTemplate, dbPath); 

    //connect... notice the change in OpenConnection! 

// a little change in the OpenConnection method 
private void OpenConnection(String connParam) 

Я просто создать строку подключения в соответствии с именем БД, и передать в соответствующий метод.

+0

Спасибо, что сделал! Я не знаю, почему это не произошло со мной. Одна заметка для любого другого, кто смотрит на этот ответ - в методе CreateConnection() есть String.Format (connParamTemplate, name) - переменная 'name' является неправильной переменной, используйте переменную dbPath из параметра. «Имя» появилось из предыдущей функции. – Ryan

+0

oops ... исправлено. – elyashiv