2010-06-06 3 views
0

У меня есть программа, которая хранит пользовательские проекты в качестве баз данных. Естественно, программа должна позволять пользователю создавать и удалять базы данных по мере необходимости. Когда программа загружается, она ищет все базы данных в конкретном экземпляре SQLServer, у которых есть структура, которую ожидает программа. Затем эти базы данных загружаются в список, поэтому пользователь может выбрать один для открытия в качестве проекта для работы.Почему соединения открыты для моих баз данных?

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

Вот все соответствующие функции. После вызова BuildProjectList запуск «DROAP DATABASE database_name» из ExecuteSQL завершается с сообщением: «Не удается удалить базу данных, поскольку она в настоящее время используется». Я использую SQLServer 2005.

private SqlConnection databaseConnection; 
private string connectionString; 
private ArrayList databases; 

public ArrayList BuildProjectList() 
{ 
    //databases is an ArrayList of all the databases in an instance 
    if (databases.Count <= 0) 
    { 
     return null; 
    } 
    ArrayList databaseNames = new ArrayList(); 
    for (int i = 0; i < databases.Count; i++) 
    { 
     string db = databases[i].ToString(); 
     connectionString = "Server=localhost\\SQLExpress;Trusted_Connection=True;Database=" + db + ";"; 
     //Check if the database has the table required for the project 
     string sql = "select * from TableExpectedToExist"; 
     if (ExecuteSQL(sql)) { 
     databaseNames.Add(db); 
     } 
    } 
    return databaseNames; 
} 

private bool ExecuteSQL(string sql) 
{ 
    bool success = false; 
    openConnection(); 
    SqlCommand cmd = new SqlCommand(sql, databaseConnection); 
    try 
    { 
     cmd.ExecuteNonQuery(); 
     success = true; 
    } 
    catch (SqlException ae) 
    { 
     MessageBox.Show(ae.Message.ToString()); 
    } 
    closeConnection(); 
    return success; 
} 

public void openConnection() 
{ 
    databaseConnection = new SqlConnection(connectionString); 
    try 
    { 
     databaseConnection.Open(); 
    } 
    catch(Exception e) 
    { 
     MessageBox.Show(e.ToString(), "Error", 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

public void closeConnection() 
{ 
    if (databaseConnection != null) 
    { 
     try 
     { 
     databaseConnection.Close(); 
     } 
     catch (Exception e) 
     { 
     MessageBox.Show(e.ToString(), "Error", 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 
} 

ответ

2

Класс SqlConnection опроса действительно подключен к базе данных. Если вы закроете SqlConnection, соединение будет возвращено в пул соединений. Чтобы предотвратить это поведение, установите SqlConnection.Pooling = false;.

редактировать

Джон, кажется, что более важно здесь. Но вам, возможно, придется помнить об этом.

+0

Я не смог найти свойство SQLConnection.Pooling, но я попытался вызвать SQLConnection.ClearAllPools() перед удалением базы данных, и это сделало трюк. Благодаря! – Everett

2

Два комментария. Во-первых, вы должны использовать инструкцию using, и ваша возможность будет намного чище.

Еще по теме вы подключаетесь к базе данных, когда пытаетесь ее сбросить! Вместо этого подключитесь к основной базе данных.

+0

Я не в этом проблема. Я попытался подключиться к мастеру db перед тем, как удалить его, и ничего не исправить. Он работает, если не вызывать BuildProjectList. – Everett

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