Gary Heath Ответов: 5

Моя база данных используется другим процессом, но каким процессом ?!?


Хорошо, после работы над моим кодом относительно моего первоначального вопроса (ниже курсивом), я думаю, что у меня есть (немного !) лучшее понимание того, как это работает, и я думать У меня есть код получше ... однако он все еще не работает, и я в замешательстве !!!

Я внес поправки в свой кодекс, чтобы использовать "С ПОМОЩЬЮ"заявление, как я убедился из того, что я прочитал, что он освободит ресурсы, когда я закончу с ними, даже если это будет сбой программы, но, похоже, он не делает этого для меня ...

Вот временная шкала, ведущая к моей проблеме :

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]

5 Ответов

Рейтинг:
20

Gary Heath

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

Теперь я решил эту проблему, используя новую базу данных, созданную в MS SQL Server Management Studio, и добавил ее в проект VS2010 C# как существующий элемент, а не новый, и она работает просто отлично ... фу, наконец-то !!!


Рейтинг:
2

zyck

попробуйте убить процесс на SQL Server

смотрите эту ссылку ниже

http://www.kodyaz.com/articles/kill-all-processes-of-a-database.aspx[^]


Примите или проголосуйте, если это вам поможет
спасибо


Рейтинг:
2

Gary Heath

Мне пришлось зайти в сервис & amp; найти MSSQLSERVER, изменить опцию запуска на ручную, а затем физически остановить ее ... чем и только тогда я смог удалить файлы в папке bin\debug !!! Я изменил опцию запуска обратно на автоматический и запустил службу, и, наконец, все это снова работает !!! Теперь я должен выяснить, почему это происходит, и предотвратить это снова ...


Рейтинг:
0

Christian Graus

Другой процесс почти наверняка является вашей программой, какая другая программа будет его использовать ? Почему вы вообще используете файлы базы данных стиля доступа ? Если вы должны использовать плоские файлы, я рекомендую SQLite, который допускает несколько подключений. В любом случае, этот[^] расширение оболочки позволит вам узнать, кто блокирует ваш файл, и освободить его.


Gary Heath

Прости, Кристиан, я не понимаю ... что вы подразумеваете под" файлами базы данных стиля доступа"? Все, что я здесь делаю, создается внутри VS2010 & с сайтов C# & SQL Server, которые я нашел в интернете. Где я использую "плоские файлы"?!?

Кроме того, WhoLockMe терпит крах, возможно, он не работает в Vista : - (!!!

Christian Graus

Когда у вас есть mdb-файл и когда другой процесс может его заблокировать, вы используете плоский файл. Да, я думаю, что WhoLockMe перестал работать в Vista. В любом случае, используйте средство просмотра процессов, это должна быть ваша программа, Я подозреваю, что если ваша программа выйдет из строя, она, вероятно, оставит БД в этом состоянии. Поместите в свое приложение обработчик сбоев верхнего уровня, который закрывает БД.

Gary Heath

@Christian, не могли бы вы объяснить (или указать мне на пример), что вы подразумеваете под "помещением обработчика сбоев верхнего уровня в ваше приложение, которое закрывает БД"...

Christian Graus

Если вы поставите блок try/catch в самом верху своего кода и выставите соединение с БД так, чтобы убедиться, что оно закрыто, это лучшее, что вы можете сделать.

Рейтинг:
0

Member 13395445

CLSBasicFunctionality.objCreateDB.Con.Close();
           GC.Collect();
           GC.WaitForPendingFinalizers();




использовать ГК.в ожидании завершения после ГК.собирать


Graeme_Grant

Почему вы отвечаете на вопрос 5-летней давности, который уже принял ответ? Пожалуйста, не делайте этого, вместо этого сосредоточьтесь только на текущем вопросе - всегда есть много ожидающих помощи.