У меня есть программа, которая хранит пользовательские проекты в качестве баз данных. Естественно, программа должна позволять пользователю создавать и удалять базы данных по мере необходимости. Когда программа загружается, она ищет все базы данных в конкретном экземпляре 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);
}
}
}
Я не смог найти свойство SQLConnection.Pooling, но я попытался вызвать SQLConnection.ClearAllPools() перед удалением базы данных, и это сделало трюк. Благодаря! – Everett