Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# и базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 73, средняя оценка - 4.95
the MIKron
1 / 1 / 2
Регистрация: 13.07.2011
Сообщений: 44
#1

Таблица не может быть заблокирована ядром базы данных. Она уже используется другим пользователем или процессом. - C#

07.09.2011, 06:22. Просмотров 10255. Ответов 0
Метки нет (Все метки)

Доброго времени суток!

Есть следующий код. Он выполняет проверку на независимость образов таблиц, но проблема не в этом. Это и неважно по сути. Код выполняется на 1 раз, а затем что-то в нем привязывается таблицам и в блоке выделенном красным возникает исключение, например, "Таблица 'PP3' не может быть заблокирована ядром базы данных. Она уже используется другим пользователем или процессом.". Что очень странно, потому что все объекты, которые хоть как-то могут иметь к ней отношение, я зануляю.

Еще что интересно то, что, допустим программа создала таблицы PP0, PP1, ... , PP4, NP0, ... , NP4, а доступа не имеет только к первым тройкам.

Вопрос: почему так происходит и что я делаю не так?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
        ////////////////////////////
        // Проверка независимости //
        ////////////////////////////
 
        void CheckIndependence(object sender, EventArgs e)
        {
            if ((Sendings == "") || (Parameters == ""))
            {
                Common.Message(Common.HypothesisEditor, Common.ErrorNoEnterData, true, "");
                return;
            }
 
            GetUniverse();
            Indep = "Не установлена";
            connect = null;
            connect = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source = '" + cDB + "'");
            connect.Open();
            if (reader!= null)
                reader = null;
            command = null;
 
            // удаляем временные таблицы                        
            for (int i = 0; i <= Parameters.Split(',').Length - 1; i++)
            {
                [COLOR="Red"]try
                {
                    command = new OleDbCommand("DROP TABLE `PP" + i + "`", connect);
                    command.ExecuteNonQuery();
                }
                catch (OleDbException exp1) {}
                try
                {
                    command = new OleDbCommand("DROP TABLE `NP" + i + "`", connect);
                    command.ExecuteNonQuery();
                }
                catch (OleDbException exp2) {}[/COLOR]
            }
                        
            for (int i = 0; i <= Parameters.Split(',').Length - 1; i++)
            {
                command = new OleDbCommand("SELECT * FROM `" + Parameters.Split(',')[i] + "`", connect);
                reader = command.ExecuteReader();
                reader.Read();
                string Value = reader.GetString(0);
                string Field = ((Table)WorkTree.Nodes[0].Nodes[cProblem].Nodes[Common.Tables].Nodes[Parameters.Split(',')[i]].Tag).TableStructureArray[0].Field;
 
                // получаем образ
                command = new OleDbCommand("SELECT * INTO `PP" + i + "` FROM `" + UniverseName + "` WHERE [" + Field + "] = '" + Value + "'", connect);                    
                command.ExecuteNonQuery();
 
                // получаем отрицание
                command = new OleDbCommand("SELECT * INTO `NP" + i + "` FROM `" + UniverseName + "` WHERE [" + Field + "] <> '" + Value + "'", connect);
                command.ExecuteNonQuery();
            }
 
            VerifyChains("PP", 0, Parameters.Split(',').Length - 1);
            VerifyChains("NP", 0, Parameters.Split(',').Length - 1);
 
            if (Indep != "Зависима") Indep = "Независима";
            Form.IndepBox.Text = Indep;            
        }
 
        void VerifyChains(string prv, int step, int max)
        {
            if (step == max - 1)
            {                
                return;
            }
            int n_step = step + 1;
            
            command = new OleDbCommand(GetSQLInterselection(connect, prv + step, "PP" + n_step), connect);
            reader = command.ExecuteReader();
            if (!reader.Read())
            {
                Indep = "Зависима";                
                return;
            }
            reader = null;
 
            command = new OleDbCommand(GetSQLInterselection(connect, prv + step, "NP" + n_step), connect);
            reader = command.ExecuteReader();
            if (!reader.Read())
            {
                Indep = "Зависима";                
                return;
            }
            reader = null;
 
            VerifyChains("PP", n_step, max);
            VerifyChains("NP", n_step, max);
        }
 
        public static string GetSQLInterselection(OleDbConnection connect, string T1, string T2)
        {
            OleDbCommand command = new OleDbCommand("SELECT * FROM `" + T1 + "`", connect);
            OleDbDataAdapter adapter = new OleDbDataAdapter(command);
            DataSet dataSet = new DataSet();
            adapter.Fill(dataSet);
 
            string Fields = "";
            for (int i = 0; i <= dataSet.Tables[0].Columns.Count - 1; i++)
            {
                Fields += dataSet.Tables[0].Columns[i].ColumnName + ",";
            }
            Fields = Fields.Remove(Fields.Length - 1);
            string[] FieldsArray = Fields.Split(',');
 
            string scheme = "([" + T2 + "]." + FieldsArray[0] + " = [" + T1 + "]." + FieldsArray[0] + ")";
            for (int i = 1; i <= FieldsArray.Length - 1; i++)
            {
                scheme += " AND ([" + T2 + "]." + FieldsArray[i] + " = [" + T1 + "]." + FieldsArray[i] + ")";
            }
            adapter = null;
            dataSet = null;
            command = null;
            connect = null;
            return "SELECT " + Fields + " FROM `" + T1 + "` WHERE EXISTS (SELECT * FROM `" + T2 + "` WHERE " + scheme + ")";
        }
 Комментарий модератора 
Внитри тэгов кода не поддерживаются bb-коды.


Добавлено через 16 часов 43 минуты
Проблема решена. Как оказалось ни парадоксально, но надо закрывать каждый ридер, который использовался. Т.е. если, допустим, я в одной процедуре дважды использовал один и тот же ридер к разным таблицам (имеется ввиду созданный через одну и ту же переменную) и в конце написал один раз reader.Close(), то ридер все так же продолжит "держать" первую таблицу. Поэтому перед созданием ридера во второй раз было необходимо закрыть его, чего я собственно не знал. Вот так вот.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2011, 06:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Таблица не может быть заблокирована ядром базы данных. Она уже используется другим пользователем или процессом. (C#):

Процесс не может получить доступ к файлу, так как этот файл используется другим процессом
Моя программа сначала открывает картинку, а потом её удаляет(должна). Вылезает...

Процесс не может получить доступ к файлу, так как этот файл используется другим процессом
Вот такой код using (FileStream sw = new FileStream(fileName,...

Как узнать, используется ли файл другим процессом
Снова здравствуйте. У меня вопрос: как можно проверить или узнать, используется...

StreamReader не может открыть файл, открытый на запись другим процессом
Сабж. Как обойти? :help:

Как удалить или очистить файл, используемый другим процессом?
Есть приложение, которое 3 раза в минуту записывает данные в текстовый файл....

Ошибка Файл не может быть открыт ядром базы данных microsoft jet. Файл уже открыт другим пользователем для монопольного доступа или
После написания программы, записал исходник на диск. При запуске экзешника с...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2011, 06:22
Привет! Вот еще темы с решениями:

Файл уже используется другим процессом
FileInfo newFile = new FileInfo(&quot;new.txt&quot;); newFile.Create(); StreamWriter...

Исключение: файл уже используется другим процессом
using System; using System.Collections.Generic; using System.Linq; using...

Файл `filename.mdb` не может быть открыт ядром базы данных Microsoft Jet.
У меня на компе всё в порядке. БД создаётся программно. Принёс на другой комп и...

Файл `filename.mdb` не может быть открыт ядром базы данных Microsoft Jet
Добрый день! Столкнулся с такой вот проблемой: Имеются 2 пк соединенных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru