Почему мои базы данных открыты? - PullRequest
0 голосов
/ 06 июня 2010

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

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

Вот все соответствующие функции. После вызова BuildProjectList при запуске «DROP 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 ]

2 голосов
/ 06 июня 2010

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

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

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

2 голосов
/ 06 июня 2010

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

Подробнее по теме: вы подключаетесь к базе данных, когда пытаетесь ее удалить! Вместо этого подключитесь к базе данных master.

...