Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / проблемы при удалении из datatable / 9 сообщений из 9, страница 1 из 1
07.02.2007, 14:48
    #34312778
krot-s
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы при удалении из datatable
Есть такая проблема:
при удалении из строк из datatable, если этот datatable является datasource для datagridview поток виснет. Если не указывать его как datasource, все работает нормально.
Вот пример кода:
Эта процедура выполняется в отдельном потоке. Перед запуском потока получаем ссылку на основной поток приложения и сохраняем ее в mainThread.

Код: plaintext
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.
        // процедура, выполняемая потоком подгрузки изминений
        private void load_updates()
        {
                while (true)
                {
                    try
                    {
                        // получить список назначеных нам обновлений
                        OracleCommand cmd = new OracleCommand("select tbl_name, action, rowid_, to_char(created) from changes where u_id = " + Program.mny_id +
                            "order by created", dbConn_updates);
                        OracleDataReader rd = cmd.ExecuteReader();

                        // за время получения обновлений могли появиться новые, поэтому надо удалить только полученные
                        List<string> pCreateList = null;

                        if (rd.HasRows)
                        {
                            // остановить гланый поток программы, чтобы можно было менять dataset
                            mainThread.Suspend();
                            pCreateList = new List<string>( 256 );
                        }

                        // каждая строка - одно обновление
                        while (rd.Read())
                        {
                            string strTableName = rd.GetString( 0 );
                            string strAction = rd.GetString( 1 );
                            string strRowID = rd.GetString( 2 );
                            string strCreated = rd.GetString( 3 );

                            // добавить строку к числу удаляемых
                            pCreateList.Add("'" + strCreated + "'");

                                {
                                    // при удалении найти  эту позицию в датасэте и удалить нах!
                                    // при удалении в поле rowid_ заносится не rowid строки, а ee id
                                    // если primary key состоит не только из id, но и еще какой-то колонки, то
                                    // в rowid заносится текст для select из datatable
                                    // проверяется поиском слова AND в строке rowid
                                    Match mat = Regex.Match(strRowID, @" AND ");
                                    if (mat.Success)
                                    {
                                         if (Program.dbConn.ds.Tables[strTableName].Select(strRowID).Length >  0 )
                                            Program.dbConn.ds.Tables[strTableName].Rows.Remove(
                                                Program.dbConn.ds.Tables[strTableName].Select(strRowID)[ 0 ]);
                                    }
                                    else
                                    {
                                        // в зависимости от типа столбца ID надо менять select из datatable
                                        string strSelect = "";
                                        if (Program.dbConn.ds.Tables[strTableName].Columns["ID"].DataType.ToString() == "System.String")
                                            strSelect  = "ID='" + strRowID + "'";
                                        else
                                            strSelect = "ID = " + strRowID;

                                        // вот здесь виснет.
                                        // при этом в гриде выбран удаляемый заказ
                                        // запущен не из под студии
                                        if (Program.dbConn.ds.Tables[strTableName].Select(strSelect).Length >  0 )
                                            Program.dbConn.ds.Tables[strTableName].Rows.Remove(
                                                Program.dbConn.ds.Tables[strTableName].Select(strSelect)[ 0 ]);
                                    }
                                }
                            }
                        }
                        // запустить основной поток
                        if (mainThread.ThreadState == ThreadState.Suspended)
                        {
                            mainThread.Resume();
                        }
                        
                        
                        
                        if (rd.HasRows)
                        {
                            // продолжить выполенение основного потока
                            // сформировать список удаляемых сообщений 
                            string created_list = pCreateList[ 0 ];
                            for (int i =  1 ; i < pCreateList.Count; i++)
                            {
                                created_list += "," + pCreateList[i];
                            }
                            // удалить сообщения о полученых изминениях
                            // начать и сразу закрыть транзакцию. иначе будет висеть блокировка.
                            transaction_updates = dbConn_updates.BeginTransaction();
                            cmd.CommandText = "delete from changes where u_id = " + Program.mny_id
                                + "and to_char(created) in ( " + created_list + " )";
                            cmd.ExecuteNonQuery();
                            transaction_updates.Commit();
                        }

                        rd.Close();
                        // ждать :)
                        Thread.Sleep( 3000 );
                    }
                    catch (OracleException ex)
                    {
                        if(Program.bDebug)
                            MessageBox.Show(ex.Message);
                        MessageBox.Show("Произошла ошибка при получение данных с сервера. Рекомендуется перезапустить программу.");
                    }
                    finally
                    {
                        if (mainThread.ThreadState == ThreadState.Suspended)
                        {
                            mainThread.Resume();
                        }
                    }
                }
        }




Для тех кому лень читать код:
сначала останавливаем основной поток программы:
mainThread.Suspend();
потом получаем из базы id строки в strSelect, которую надо удалить. и удаляем вот так:
if (Program.dbConn.ds.Tables[strTableName].Select(strSelect).Length > 0)
Program.dbConn.ds.Tables[strTableName].Rows.Remove(
Program.dbConn.ds.Tables[strTableName].Select(strSelect)[0]);
возобнавляем выполнение основного потока:
mainThread.Resume();

Почему при "привязаном" datatable прога виснет на методе Remove ?

Подскажите, в чем может быть дело...
...
Рейтинг: 0 / 0
07.02.2007, 20:51
    #34314083
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы при удалении из datatable
krot-s
Почему при "привязаном" datatable прога виснет на методе Remove ?

все не прочитал )
а в чем необходимость использования метода Remove ?

Код: plaintext
 uid  =  S a

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
07.02.2007, 22:04
    #34314196
krot-s
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы при удалении из datatable
Sa
krot-s
Почему при "привязаном" datatable прога виснет на методе Remove ?

все не прочитал )
а в чем необходимость использования метода Remove ?

Код: plaintext
 uid  =  S a
Posted via ActualForum NNTP Server 1.3

Один из пользователей удалил строку из таблицы. Всем остальным доходит сообщение о удалении с id этой строки. Соответственно ее надо удалить из datatable. Чем кроме Remove или Delete это еще можно сделать (разницы между этими методами практически нету; Remove - это тот же Delete, только без вызова AcceptChanges) ?

Тут наверняка что-то с тредами, тока я в них не силен... :(
...
Рейтинг: 0 / 0
07.02.2007, 22:26
    #34314219
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы при удалении из datatable
krot-s
Remove - это тот же Delete, только без вызова AcceptChanges)

нет не тоже самое. Метод Delete применять не пробовали?
Вообще код выше довольно таки путанный, вопрос NW какой версии?

Код: plaintext
 uid  =  S a

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
07.02.2007, 23:05
    #34314272
krot-s
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы при удалении из datatable
Sa
krot-s
Remove - это тот же Delete, только без вызова AcceptChanges)

нет не тоже самое. Метод Delete применять не пробовали?
Вообще код выше довольно таки путанный, вопрос NW какой версии?

Код: plaintext
 uid  =  S a
Posted via ActualForum NNTP Server 1.3

А в чем разница между Remove и Delete? В msdn написано, что Remove отличается от Delete только тем, что AcceptChanges не вызывается, а Delete вызывает его неявно.

Может вопрос и глупый, но чтотакое NW ?
...
Рейтинг: 0 / 0
08.02.2007, 22:40
    #34317557
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы при удалении из datatable
krot-s
А в чем разница между Remove и Delete? В msdn написано, что Remove отличается от Delete только тем, что AcceptChanges не вызывается, а Delete вызывает его неявно.

тем и отличаются :-). Remove включает в себе вызов Delete и здесь наоборот: Remove вызывает AcceptChanges, а не Delete. Мне интересно пробовали ли вы использовать Delete и какие результаты.


krot-s
чтотакое NW ?

NW - это NetFramework. Судя по всему у вас NW 1.1.

P.S. старайтесь не злоупотреблять оверквоттингом.


Код: plaintext
 uid  =  S a

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
10.02.2007, 15:17
    #34321126
krot-s
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы при удалении из datatable
NW - 2.0
через delete надо попробовать...
...
Рейтинг: 0 / 0
10.02.2007, 19:08
    #34321342
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы при удалении из datatable
krot-s
NW - 2.0

а вы разве не получаете варнинг компилятора о том что метод Suspend()
obsolete?

Код: plaintext
 uid  =  S a

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
13.02.2007, 16:54
    #34327799
krot-s
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы при удалении из datatable
Sa
krot-s
NW - 2.0

а вы разве не получаете варнинг компилятора о том что метод Suspend()
obsolete?

Код: plaintext
 uid  =  S a
Posted via ActualForum NNTP Server 1.3

Получал, но по безмозглости не обратил внимания.
Переделал все по-другому:
второй поток получает только факт изминения в базе и данные, что это за изминение. Потом через Invoke вызывает метод из основного потока, которые и скачивает изминения. Пока кажись работает...

p.s. если кому вдруг надо код - обращайтесь.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / проблемы при удалении из datatable / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]