Моя база данных используется другим процессом, но каким процессом ?!?
Хорошо, после работы над моим кодом относительно моего первоначального вопроса (ниже курсивом), я думаю, что у меня есть (немного !) лучшее понимание того, как это работает, и я думать У меня есть код получше ... однако он все еще не работает, и я в замешательстве !!!
Я внес поправки в свой кодекс, чтобы использовать "С ПОМОЩЬЮ"заявление, как я убедился из того, что я прочитал, что он освободит ресурсы, когда я закончу с ними, даже если это будет сбой программы, но, похоже, он не делает этого для меня ...
Вот временная шкала, ведущая к моей проблеме :
1) Откройте проект в рамках VS2010
2) Добавить новый пункт / Сведения / обслуживание базы данных / набора данных &амп; затем создать одну таблицу, так что база данных называется базе данных mytestdb, таблица MyTestTbl, &ампер; поля MyTestID (тип int, первичный ключ, IsIdentity правда, 1,1) &ампер; MyTestNum (Инт)
3) Сборка Прошла Успешно
4) запустите программу в режиме отладки, отобразится форма, Нажмите кнопку Вставить
5) MyCount = 1, сообщение говорит базы данных mydb.Состояние = открыто, обработки данных, сообщение говорит базы данных mydb.Государство =закрытая, форма выдает.
6) повторять, повторять, повторять и т. д... MyCount прогрессирует, как и ожидалось, никаких проблем, выход и завершение программы.
7) Теперь у нас есть проблема ... Во-первых, в базе данных до сих пор нет записей !!! Если я щелкну Правой Кнопкой Мыши на таблице MyTestTbl в Проводнике сервера и "покажу данные таблицы", она просто покажет заголовки & Null, Null. Вопрос 1 - Почему ? Должен ли я добавить еще одну строку кода, чтобы "зафиксировать" обновление или что-то в этом роде ?!?
8) Если я сейчас снова запущу программу в режиме отладки, она не будет работать, потому что у меня есть 2 ошибки, похожие на мою первоначальную проблему, что-то связанное с файлами в уже существующей папке \bin\debug ... "Не удается скопировать файл <путь&ГТ; \базе данных mytestdb.МДФ в bin\отладки\базе данных mytestdb.МДФ. Процесс не может получить доступ к файлу bin\Debug\MyTestDB.mdf, поскольку он используется другим процессом. (то же самое сообщение об ошибке для файла MyTestDB_log.ldf). Вопрос 2 : Опять же, почему ?!? Почему эти файлы блокируются или блокируются ?!?
Это мой код, конечно, это не должно быть так сложно !!!
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace MySqlTest { public partial class Form1 : Form { int myCount; string myDBlocation = @"Data Source=MEDESKTOP;AttachDbFilename=|DataDirectory|\MyTestDB.mdf;Integrated Security=True;User Instance=False"; public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { myCount++; MessageBox.Show("myCount = " + myCount.ToString()); //Insert Record Into SQL File myDB_Insert(); } private void button3_Click(object sender, EventArgs e) { //Read Record From SQL File } private void button4_Click(object sender, EventArgs e) { //Read All Records From SQL File } private void button5_Click(object sender, EventArgs e) { //Delete Record From SQL File } private void button7_Click(object sender, EventArgs e) { //Quit myDB_Close(); this.Close(); } private void Form1_Load(object sender, EventArgs e) { } private void Form1_Close(object sender, EventArgs e) { } void myDB_Insert() { using (SqlConnection myDB = new SqlConnection(myDBlocation)) using (SqlCommand mySqlCmd = myDB.CreateCommand()) { myDB.Open(); MessageBox.Show("State = " + myDB.State); mySqlCmd.CommandText = "INSERT INTO MyTestTbl(MyTestNum) VALUES(@MyTestNumValue)"; mySqlCmd.Parameters.AddWithValue("@MyTestNumValue", myCount); mySqlCmd.ExecuteNonQuery(); myDB.Close(); MessageBox.Show("State = " + myDB.State); } return; } void myDB_Close() { using (SqlConnection myDB = new SqlConnection(myDBlocation)) using (SqlCommand mySqlCmd = new SqlCommand()) { myDB.Close(); } return; } } }
Я написал очень маленькую программу на C#, которая использует очень маленькую базу данных SQL Server исключительно для некоторых целей обучения и тестирования. База данных используется в этом новом проекте и нигде больше. Тем не менее, я получаю проблемы во время выполнения отладки, где программа не будет работать, потому что база данных "используется другим процессом".
Если я перезагрузлю свою машину, она снова заработает, а затем после нескольких тестовых запусков я снова получу ту же проблему.
Я нашел много-много подобных проблем, о которых сообщалось по всему интернету, но не могу найти окончательного ответа о том, как решить эту проблему. Во-первых, как мне узнать, какой "другой процесс" использует мои файлы .mdf и .ldf ? Тогда как же мне освободить эти файлы и не удерживать их, чтобы это не происходило раз за разом?!?
Я новичок в VS2010, SQL Server и C#, поэтому, пожалуйста, будьте достаточно описательны в любых ответах, которые вы мне дадите !!!
Это мой код, как вы можете видеть, вы не могли бы получить ничего более простого, я, конечно, не должен был бы сталкиваться с этими постоянными проблемами !!!
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace MySqlTest { public partial class Form1 : Form { SqlConnection myDB = new SqlConnection(@"Data Source=MEDESKTOP;AttachDbFilename=|DataDirectory|\SqlTestDB.mdf;Initial Catalog=MySqlDB;Integrated Security=True"); SqlDataAdapter myDA = new SqlDataAdapter(); SqlCommand mySqlCmd = new SqlCommand(); string mySQLcmd; int myCount; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("myDB state = " + myDB.State.ToString()); //Open SQL File myDB.Open(); MessageBox.Show("myDB state = " + myDB.State.ToString()); } private void button2_Click(object sender, EventArgs e) { myCount++; MessageBox.Show("myCount = " + myCount.ToString()); //Insert Record Into SQL File mySqlCmd.Connection = myDB; mySqlCmd.CommandText = "INSERT INTO Parent(ParentName) Values(myCount)"; myDA = new SqlDataAdapter(mySqlCmd); mySqlCmd.ExecuteNonQuery(); } private void button3_Click(object sender, EventArgs e) { //Read Record From SQL File } private void button4_Click(object sender, EventArgs e) { //Read All Records From SQL File } private void button5_Click(object sender, EventArgs e) { //Delete Record From DQL File } private void button6_Click(object sender, EventArgs e) { MessageBox.Show("myDB state = " + myDB.State.ToString()); //Close SQL File myDB.Close(); MessageBox.Show("myDB state = " + myDB.State.ToString()); } private void button7_Click(object sender, EventArgs e) { //Quit this.Close(); } } } [/code]