powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / При сохранении объекта в базу сохраняются также ранее удаленные объекты
4 сообщений из 4, страница 1 из 1
При сохранении объекта в базу сохраняются также ранее удаленные объекты
    #34722249
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Помогите пожалуйста решить следующую проблему. Работаю с Cache 5.0 + C#.NET через сгенерированные proxy-классы. Есть два связанных по relationship класса AGroup и Account.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/// Группы безопасности пользователей
Class Security.AGroup Extends %Persistent [ ClassType = persistent, ProcedureBlock ]
{

/// Название группы
Property Name As %String;

Relationship UserAccessPermissions As Security.AccessPermission [ Cardinality = many, Inverse = AGroup ];

/// Ссылка на пользователей, принадлежащих этой группе
Relationship Users As Security.Account [ Cardinality = many, Inverse = AGroupID ];

Index NameIndex On Name [ Unique ];

}

Код: 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.
/// данные об акаунтах (логинах и паролях)
Class Security.Account Extends %Persistent [ ClassType = persistent, ProcedureBlock ]
{

/// Ссылка на группу пользователя
Relationship AGroupID As Security.AGroup [ Cardinality = one, Inverse = Users ];

/// Имя пользователя
Property Login As %String [ Required ];

/// Пароль пользователя
Property Password As %String [ Required ];

Index AGroupIDIndex On AGroupID;

Index LoginIndex On Login [ Unique ];

Index PasswordIndex On Password [ Unique ];

Query GetUsersByGroup(groupID As %Integer =  0 ) As %SQLQuery(CONTAINID =  1 )
{
SELECT %ID,Login,Password FROM Account
WHERE (AGroupID->ID = :groupID OR :groupID =  0 )
ORDER BY %ID
}

}

Потом в C# делаю два листбокса для Групп и Пользователей соответственно. Идея в том, что бы при выборе группы показывались все ее пользователи.

Проблема появляется при добавлении и удалении пользователей. Выглядит это следующим образом: удаляем несколько пользователей (все нормально вроде бы удаляеться), потом добавляем одного нового пользователя, а вместе с ним появляются ранее удаленные. Есть подозрение что, это связано как-то с объектами в памяти, которым уже нет соответствия в базе. И они по .Save() также сохраняются в базу. Помогите сделать правильно.

Код: 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.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
      /// <summary>
        /// Заполнить листбокс со списком групп пользователей
        /// </summary>
        private void FillGroupList()
        {
            DataTable data = new DataTable();
            lbGroups.BeginUpdate();
            lbGroups.Items.Clear();

            try
            {
                data.Clear();
                data = DBConnection.RunQuery("Security.AGroup", "Extent", null);
                
                foreach(DataRow row in data.Rows)
                {
                    int id = (int) row["ID"];
                    string name = "";
                    DB_Sec.AGroup group = DB_Sec.AGroup.OpenId(DBConnection.GetConnection(), row["ID"].ToString());
                    if(group.IsConnected)
                        name = group.Name;

                    lbGroups.Items.Add(new NamedValue(name, group));
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            lbGroups.EndUpdate();
        }

        /// <summary>
        /// Выбрали конкретную группу в списке групп
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lbGroups_SelectedIndexChanged(object sender, EventArgs e)
        {
            FillUsersList( ((DB_Sec.AGroup)((NamedValue)lbGroups.SelectedItem).Value).Id() );
        }

        /// <summary>
        /// Заполнить листбокс со списком пользователей группы
        /// </summary>
        /// <param name="group_ID">код группы, пользователей которой показать</param>
        private void FillUsersList(string group_ID)
        {
            DataTable data = new DataTable();
            lbUsers.BeginUpdate();
            lbUsers.Items.Clear();

            try
            {
                data.Clear();
                data = DBConnection.RunQuery("Security.Account", "GetUsersByGroup", new object[] {group_ID} );

                foreach(DataRow row in data.Rows)
                {
                    int id = (int)row["ID"];
                    string name = "";
                    DB_Sec.Account user = DB_Sec.Account.OpenId(DBConnection.GetConnection(), id.ToString());
                    if(user.IsConnected)
                        name = user.Login + " " + user.Password;

                    lbUsers.Items.Add(new NamedValue(name, user));
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            lbUsers.EndUpdate();
        }

        /// <summary>
        /// Добавить нового пользователя в группу
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAddUser_Click(object sender, EventArgs e)
        {
            if(txtLogin.Text == "")
            { 
                txtLogin.Focus();
                return;
            }
            if(txtPassword.Text == "")
            {
                txtPassword.Focus();
                return;
            }
            if(!DB_Sec.AGroup.ExistsId(DBConnection.GetConnection(),
                                       ((DB_Sec.AGroup)((NamedValue)lbGroups.SelectedItem).Value).Id()))
            {
                lbGroups.Focus();
                return; // нельзя добавить пользователя, если не выбрана группа
            }

            DB_Sec.Account user = new DB_Sec.Account(DBConnection.GetConnection());
            if(user.IsConnected)
            {
                user.Login = txtLogin.Text;
                user.Password = txtPassword.Text;
                user.AGroupID = (DB_Sec.AGroup)((NamedValue)lbGroups.SelectedItem).Value;

                CacheStatus status = user.Save();
                if(!status.IsOK)
                    MessageBox.Show("Ошибка при сохранении нового пользователя:");
                else
                {
                    txtLogin.Text = user.Id(); 
                    txtPassword.Text = "";
                    // обновить список пользователей группы
                    FillUsersList(((DB_Sec.AGroup)((NamedValue)lbGroups.SelectedItem).Value).Id());
                }
            }
        }

        /// <summary>
        /// Удалить пользователя
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDeleteUser_Click(object sender, EventArgs e)
        {
            if(!DB_Sec.Account.ExistsId(DBConnection.GetConnection(),
                                        ((DB_Sec.Account)((NamedValue)lbUsers.SelectedItem).Value).Id()))
            {
                lbUsers.Focus();
                return; 
            }

            DB_Sec.Account user = (DB_Sec.Account)((NamedValue)lbUsers.SelectedItem).Value;
            DB_Sec.Account.DeleteId(DBConnection.GetConnection(), user.Id());
            user.Close();
            user.Dispose();

            // обновить список пользователей группы
            FillUsersList(((DB_Sec.AGroup)((NamedValue)lbGroups.SelectedItem).Value).Id());
        }    

...
Рейтинг: 0 / 0
При сохранении объекта в базу сохраняются также ранее удаленные объекты
    #34724951
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не путаете версию Cache'?
В Cache' 5.0.20 был только объектный ActiveX-интерфейс, ODBC и Web-сервисы.
ADO.Net Managed Provider появился с версии Cache' 5.1 (был доступен как отдельный модуль для скачки).
В 5.2 вошел в стандартный дистрибутив.

Есть ли у Вас возможность использовать нормальную версию Cache'?
Например, последнюю - Cache' 2007.1?

Вадим
...
Рейтинг: 0 / 0
При сохранении объекта в базу сохраняются также ранее удаленные объекты
    #34725077
Andrey Bark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ.
VadimFВы не путаете версию Cache'?
В Cache' 5.0.20 был только объектный ActiveX-интерфейс, ODBC и Web-сервисы.
ADO.Net Managed Provider появился с версии Cache' 5.1 (был доступен как отдельный модуль для скачки).
В 5.2 вошел в стандартный дистрибутив.

Нет, не путаю. Версия если смотреть в Кэш Куб - О программе 5.0.15LB.5824.1
Понимаю что, старье но вроде бы хватает. Только начинаю изучать, поэтому пока больше интересуют сами возможности технологии.
Доступ осуществляется через Cache\Dev\dotnet\bin\CacheProvider.dll и с помощью
Cache\Dev\dotnet\bin\CacheNetWizard.exe генерируются прокси-классы в C#.NET.

VadimFЕсть ли у Вас возможность использовать нормальную версию Cache'?
Например, последнюю - Cache' 2007.1?

Такой возможности нет, т.к. проект уже начали на версии упомянутой выше. Т.к. проект достаточно простой, то я думаю что функционала 5.0 нам должно хватить. А суть проблемы насколько я понимаю в неправильной работе с Cache-объектами в C#. Но вот где ошибка я так пока и не понял :(
...
Рейтинг: 0 / 0
При сохранении объекта в базу сохраняются также ранее удаленные объекты
    #34726238
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey BarkСпасибо за ответ.
VadimFВы не путаете версию Cache'?
В Cache' 5.0.20 был только объектный ActiveX-интерфейс, ODBC и Web-сервисы.
ADO.Net Managed Provider появился с версии Cache' 5.1 (был доступен как отдельный модуль для скачки).
В 5.2 вошел в стандартный дистрибутив.

Нет, не путаю. Версия если смотреть в Кэш Куб - О программе 5.0.15LB.5824.1
Понимаю что, старье но вроде бы хватает. Только начинаю изучать, поэтому пока больше интересуют сами возможности технологии.
Доступ осуществляется через Cache\Dev\dotnet\bin\CacheProvider.dll и с помощью
Cache\Dev\dotnet\bin\CacheNetWizard.exe генерируются прокси-классы в C#.NET.


LB - это Language Binding была такая специальная beta-версия для использования ранней версии .Net-интерфейса.
Не очень понятно, зачем изучать beta-версию 3-годичной давности.
Используемый Вами интерфейс .Net с тех пор был оптимизирован.
Сделано очень много изменений ...

Разбираться сейчас в том, что было когда-то очень давно, по-моему, не имеет смысла.

Andrey Bark
VadimFЕсть ли у Вас возможность использовать нормальную версию Cache'?
Например, последнюю - Cache' 2007.1?

Такой возможности нет, т.к. проект уже начали на версии упомянутой выше. Т.к. проект достаточно простой, то я думаю что функционала 5.0 нам должно хватить. А суть проблемы насколько я понимаю в неправильной работе с Cache-объектами в C#. Но вот где ошибка я так пока и не понял :(

Советую Вам установить нормальную версию, выгрузить классы из Cache' 5.0, загрузить их в Cache' 2007.1., потратить определенное время на адаптацию Вашего кода к Cache' 2007.1.
Придется конечно потратить какое-то время на такую работу, но усилия окупятся...

Разработка нового проекта на очень старой beta-версии тупиковый путь...
Возникнут проблемы с поддержкой такой версии Cache' и у технической поддержки InterSystems.

Если это не секрет напишите мне, пожалуйста, в форум или почтой, что это за проект.

Вадим
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / При сохранении объекта в базу сохраняются также ранее удаленные объекты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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