public static CheckConnectionAlive ( ) : void | ||
return | void |
void UpdateUsers() { if (!QSMain.TestConnection()) { return; } QSMain.CheckConnectionAlive(); logger.Info("Получаем таблицу пользователей..."); string sql = "SELECT * FROM users "; if (!chkShowInactive.Active) { sql += " WHERE deactivated = 0"; } MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); MySqlDataReader rdr = cmd.ExecuteReader(); UsersListStore.Clear(); while (rdr.Read()) { bool deactivated = false; try { deactivated = DBWorks.GetBoolean(rdr, "deactivated", false); } catch { logger.Warn("В базе отсутствует поле deactivated!"); } UsersListStore.AppendValues(int.Parse(rdr ["id"].ToString()), rdr ["login"].ToString(), rdr ["name"].ToString(), (bool)rdr ["admin"], deactivated, deactivated ? "grey" : "black"); } rdr.Close(); logger.Info("Ok"); OnTreeviewUsersCursorChanged(null, null); }
protected void UpdateList() { logger.Info("Получаем таблицу справочника " + nameRef + "..."); entryFilter.Text = ""; QSMain.CheckConnectionAlive(); try { string sql = SqlSelect.Replace("@tablename", TableRef); DbCommand cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; using (DbDataReader rdr = cmd.ExecuteReader()) { RefListStore.Clear(); object[] Values = new object[RefListStore.NColumns]; while (rdr.Read()) { Values[0] = rdr.GetInt32(0); object[] Fields = new object[rdr.FieldCount]; rdr.GetValues(Fields); for (int i = 1; i < Columns.Count; i++) { Values[i] = String.Format(Columns[i].DisplayFormat, Fields); } if (_OrdinalField != "") { Values[OrdinalColumn] = rdr.GetInt32(rdr.GetOrdinal(_OrdinalField)); } RefListStore.AppendValues(Values); } } logger.Info("Ok"); } catch (Exception ex) { logger.Error(ex, "Ошибка получения таблицы!"); QSMain.ErrorMessage(this, ex); } OnTreeviewrefCursorChanged((object)treeviewref, EventArgs.Empty); TestOrdinalChanged(); }
public void UserFill(int UserId) { NewUser = false; logger.Info("Запрос пользователя №{0}...", UserId); string sql = "SELECT * FROM users WHERE users.id = @id"; try { QSMain.CheckConnectionAlive(); MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@id", UserId); MySqlDataReader rdr = cmd.ExecuteReader(); rdr.Read(); bool deactivated = false; string email = String.Empty; try { deactivated = DBWorks.GetBoolean(rdr, "deactivated", false); email = DBWorks.GetString(rdr, "email", String.Empty); } catch { } entryID.Text = rdr["id"].ToString(); entryLogin.Text = rdr["login"].ToString(); //Если SaaS - запретить редактировать логин. entryLogin.Sensitive = !Session.IsSaasConnection; OriginLogin = rdr["login"].ToString(); entryName.Text = rdr["name"].ToString(); entryPassword.Text = passFill; entryEmail.Text = email; checkDeactivated.Active = deactivated; checkDeactivated.Sensitive = QSMain.User.Login != OriginLogin; checkAdmin.Active = rdr.GetBoolean(QSMain.AdminFieldName); if (deactivated && Session.IsSaasConnection) //FIXME Очень странное условие. Нужно разобраться. Что делает этот блок и зачем? { entryName.Sensitive = entryPassword.Sensitive = entryEmail.Sensitive = false; checkDeactivated.Sensitive = checkAdmin.Sensitive = false; } foreach (KeyValuePair <string, CheckButton> Pair in RightCheckButtons) { Pair.Value.Active = rdr.GetBoolean(QSMain.ProjectPermission[Pair.Key].DataBaseName); } if (permissionViews != null) { foreach (var view in permissionViews) { view.DBFieldValue = DBWorks.GetString(rdr, view.DBFieldName); } } textviewComments.Buffer.Text = rdr["description"].ToString(); rdr.Close(); this.Title = entryName.Text; logger.Info("Ok"); } catch (Exception ex) { logger.Error(ex, "Ошибка получения информации о пользователе!"); QSMain.ErrorMessage(this, ex); } }
void UpdatePrivileges() { logger.Info("Устанавливаем права..."); try { string privileges; if (checkAdmin.Active) { privileges = "ALL"; } else { privileges = "SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW"; } string sql = $"GRANT {privileges} ON `{QSMain.connectionDB.Database}`.* TO @login, @login @'localhost'"; QSMain.CheckConnectionAlive(); MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); cmd.ExecuteNonQuery(); if (checkAdmin.Active) { cmd.CommandText = "GRANT CREATE USER, GRANT OPTION ON *.* TO @login, @login @'localhost'"; } else { cmd.CommandText = "REVOKE CREATE USER, GRANT OPTION ON *.* FROM @login, @login @'localhost'"; } cmd.ExecuteNonQuery(); bool GrantMake = false; if (checkAdmin.Active) { sql = "GRANT SELECT, UPDATE ON mysql.* TO @login, @login @'localhost'"; GrantMake = true; } else { sql = "SHOW GRANTS FOR @login"; cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); using (MySqlDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { if (rdr[0].ToString().IndexOf("mysql") > 0) { GrantMake = true; } } } sql = "REVOKE SELECT, UPDATE ON mysql.* FROM @login, @login @'localhost'"; } if (GrantMake) { cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); cmd.ExecuteNonQuery(); } logger.Info("Права установлены. Ok"); } catch (MySqlException ex) when(ex.Number == 1044) { logger.Error(ex, "Ошибка установки прав!"); MessageDialogWorks.RunErrorDialog("У вас не достаточно прав на сервере MySQL для установки полномочий другим пользователям. Возможно некоторые права не были установлены."); } catch (Exception ex) { logger.Error(ex, "Ошибка установки прав!"); QSMain.ErrorMessage(this, ex); } }
bool CreateLogin() { logger.Info("Создание учетной записи на сервере..."); try { //Проверка существует ли логин string sql = "SELECT COUNT(*) FROM users WHERE login = @login"; QSMain.CheckConnectionAlive(); MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); if (Convert.ToInt32(cmd.ExecuteScalar()) > 0) { string Message = "Пользователь с логином " + entryLogin.Text + " уже существует в базе. " + "Создание второго пользователя с таким же логином невозможно."; MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok, Message); md.Run(); md.Destroy(); return(false); } sql = "SELECT COUNT(*) from mysql.user WHERE USER = @login"; cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); try { if (Convert.ToInt32(cmd.ExecuteScalar()) > 0) { string Message = "Пользователь с логином " + entryLogin.Text + " уже существует на сервере. " + "Если он использовался для доступа к другим базам, может возникнуть путаница. " + "Использовать этот логин?"; MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.YesNo, Message); bool result = (ResponseType)md.Run() == ResponseType.Yes; md.Destroy(); return(result); } } catch (MySqlException ex) { if (ex.Number == 1045) { logger.Warn(ex, "Нет доступа к таблице пользователей, пробую создать пользователя в слепую."); } else { return(false); } } //Создание пользователя. sql = "CREATE USER @login IDENTIFIED BY @password"; cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); cmd.Parameters.AddWithValue("@password", entryPassword.Text); cmd.ExecuteNonQuery(); cmd.CommandText = "CREATE USER @login @'localhost' IDENTIFIED BY @password"; cmd.ExecuteNonQuery(); logger.Info("Ok"); return(true); } catch (Exception ex) { logger.Error(ex, "Ошибка создания пользователя!"); QSMain.ErrorMessage(this, ex); return(false); } }
protected void OnButtonOkClicked(object sender, EventArgs e) { string sql; ISaaSService svc = null; if (entryLogin.Text == "root") { string Message = "Операции с пользователем root запрещены."; MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok, Message); md.Run(); md.Destroy(); return; } if (Session.IsSaasConnection) { int dlgRes; svc = Session.GetSaaSService(); if (NewUser) { //Проверка существует ли логин sql = "SELECT COUNT(*) FROM users WHERE login = @login"; QSMain.CheckConnectionAlive(); MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); if (Convert.ToInt32(cmd.ExecuteScalar()) > 0) { string Message = "Пользователь с логином " + entryLogin.Text + " уже существует в базе. " + "Создание второго пользователя с таким же логином невозможно."; MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok, Message); md.Run(); md.Destroy(); return; } //Регистрируем пользователя в SaaS Result result = svc.registerUserV3(entryLogin.Text, entryPassword.Text, Session.SessionId, entryName.Text, entryEmail.Text); if (!result.Success) { if (result.Error == ErrorType.UserExists) { MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.YesNo, "Пользователь с таким логином уже существует. Предоставить ему доступ к базе?\n" + "ВНИМАНИЕ: Если вы указали новый пароль для пользователя, то он применен не будет."); dlgRes = md.Run(); md.Destroy(); if ((ResponseType)dlgRes == ResponseType.No) { return; } } else { MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Close, result.Description); md.Run(); md.Destroy(); return; } } //Создаем запись в Users. sql = "INSERT INTO users (name, login, deactivated, email, " + QSMain.AdminFieldName + ", description" + QSMain.GetPermissionFieldsForSelect() + GetExtraFieldsForSelect() + ") " + "VALUES (@name, @login, @deactivated, @email, @admin, @description" + QSMain.GetPermissionFieldsForInsert() + GetExtraFieldsForInsert() + ")"; } else { if (entryPassword.Text != passFill) { MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.YesNo, "Изменение пароля произойдет во всех базах, к которым пользователь имеет доступ.\nПродолжить?"); dlgRes = md.Run(); md.Destroy(); if ((ResponseType)dlgRes == ResponseType.Yes && !svc.changeUserPasswordByLogin(entryLogin.Text, Session.Account, entryPassword.Text)) { MessageDialog md1 = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Close, "Ошибка изменения пароля пользователя."); md1.Run(); md1.Destroy(); return; } else if ((ResponseType)dlgRes != ResponseType.Yes) { return; } } sql = "UPDATE users SET name = @name, deactivated = @deactivated, email = @email, " + QSMain.AdminFieldName + " = @admin," + "description = @description " + QSMain.GetPermissionFieldsForUpdate() + GetExtraFieldsForUpdate() + " WHERE id = @id"; } } else { if (NewUser) { if (!CreateLogin()) { return; } sql = "INSERT INTO users (name, login, deactivated, email, " + QSMain.AdminFieldName + ", description" + QSMain.GetPermissionFieldsForSelect() + GetExtraFieldsForSelect() + ") " + "VALUES (@name, @login, @deactivated, @email, @admin, @description" + QSMain.GetPermissionFieldsForInsert() + GetExtraFieldsForInsert() + ")"; } else { if (OriginLogin != entryLogin.Text && !RenameLogin()) { return; } if (entryPassword.Text != passFill) { ChangePassword(); } sql = "UPDATE users SET name = @name, deactivated = @deactivated, email = @email, login = @login, " + QSMain.AdminFieldName + " = @admin," + "description = @description " + QSMain.GetPermissionFieldsForUpdate() + GetExtraFieldsForUpdate() + " WHERE id = @id"; } UpdatePrivileges(); logger.Info("Запись пользователя..."); } try { QSMain.CheckConnectionAlive(); MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@id", entryID.Text); cmd.Parameters.AddWithValue("@name", entryName.Text); cmd.Parameters.AddWithValue("@login", entryLogin.Text); cmd.Parameters.AddWithValue("@admin", checkAdmin.Active); cmd.Parameters.AddWithValue("@deactivated", checkDeactivated.Active); cmd.Parameters.AddWithValue("@email", entryEmail.Text); foreach (KeyValuePair <string, CheckButton> Pair in RightCheckButtons) { cmd.Parameters.AddWithValue("@" + QSMain.ProjectPermission[Pair.Key].DataBaseName, Pair.Value.Active); } if (permissionViews != null) { foreach (var view in permissionViews) { cmd.Parameters.AddWithValue(view.DBFieldName, view.DBFieldValue); } } if (textviewComments.Buffer.Text == "") { cmd.Parameters.AddWithValue("@description", DBNull.Value); } else { cmd.Parameters.AddWithValue("@description", textviewComments.Buffer.Text); } cmd.ExecuteNonQuery(); if (QSMain.User.Login == entryLogin.Text) { QSMain.User.LoadUserInfo(); } logger.Info("Ok"); Respond(ResponseType.Ok); } catch (Exception ex) { logger.Error(ex, "Ошибка записи пользователя!"); QSMain.ErrorMessage(this, ex); } //Предоставляем пользователю доступ к базе if (Session.IsSaasConnection) { if (!svc.changeBaseAccessFromProgram(Session.SessionId, entryLogin.Text, Session.SaasBaseName, !checkDeactivated.Active, checkAdmin.Active)) { MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Close, "Ошибка предоставления доступа к базе данных."); md.Run(); md.Destroy(); return; } } }
/// <summary>Заполняет комбобокс любыми данными из базы. /// <param name="listmode">Режимы списка: /// 0 - Только элементы; /// 1 - Есть пункт "Все" с кодом 0; /// 2 - Есть пункт "Нет" с кодом -1;</param> </summary> public static void ComboFillUniversal(ComboBox combo, string SqlSelect, string DisplayString, System.Data.IDataParameter[] Parameters, int KeyField, ListMode listmode, bool WithDBValues = false) { combo.Clear(); CellRendererText text = new CellRendererText(); ListStore store; if (WithDBValues) { store = new ListStore(typeof(string), typeof(int), typeof(object[])); } else { store = new ListStore(typeof(string), typeof(int)); } combo.Model = store; combo.PackStart(text, false); combo.AddAttribute(text, "text", 0); logger.Info("Запрос элементов комбобокс..."); try { QSMain.CheckConnectionAlive(); int count = 0; DbCommand cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = SqlSelect; if (Parameters != null) { cmd.Parameters.AddRange(Parameters); } using (DbDataReader rdr = cmd.ExecuteReader()) { switch (listmode) { case ListMode.WithAll: //Все store.AppendValues("Все", 0); break; case ListMode.WithNo: //Нет store.AppendValues("нет", -1); break; default: break; } while (rdr.Read()) { object[] Fields = new object[rdr.FieldCount]; rdr.GetValues(Fields); if (WithDBValues) { store.AppendValues(String.Format(DisplayString, Fields), Convert.ToInt32(Fields[KeyField]), Fields); } else { store.AppendValues(String.Format(DisplayString, Fields), Convert.ToInt32(Fields[KeyField])); } count++; } } if (listmode == ListMode.WithNo && count == 1) { combo.Active = 1; } if (listmode == ListMode.OnlyItems && count == 1) { combo.Active = 0; } logger.Info("Ok"); } catch (Exception ex) { logger.Error(ex, "Ошибка получения данных для комбобокс!"); } }
/// <summary>Заполняет комбобокс элементами справочника. /// <param name="listmode">Режимы списка: /// 0 - Только элементы; /// 1 - Есть пункт "Все" с кодом 0; /// 2 - Есть пункт "Нет" с кодом -1;</param> </summary> public static void ComboFillReference(ComboBox combo, string TableRef, ListMode listmode, bool SetDefault = true, string OrderBy = "") { combo.Clear(); CellRendererText text = new CellRendererText(); ListStore store = new ListStore(typeof(string), typeof(int)); combo.Model = store; combo.PackStart(text, false); combo.AddAttribute(text, "text", 0); logger.Info("Запрос справочника " + TableRef + "..."); try { QSMain.CheckConnectionAlive(); int count = 0; string sql = String.Format("SELECT id, name FROM {0} ", TableRef); if (OrderBy != "") { sql += "ORDER BY " + OrderBy; } DbCommand cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; using (DbDataReader rdr = cmd.ExecuteReader()) { switch (listmode) { case ListMode.WithAll: //Все store.AppendValues("Все", 0); break; case ListMode.WithNo: //Нет store.AppendValues("нет", -1); break; default: break; } while (rdr.Read()) { store.AppendValues(rdr["name"].ToString(), int.Parse(rdr["id"].ToString())); count++; } } if (SetDefault && listmode != ListMode.OnlyItems) { combo.Active = 0; } if (SetDefault && listmode == ListMode.WithNo && count == 1) { combo.Active = 1; } if (SetDefault && listmode == ListMode.OnlyItems && count == 1) { combo.Active = 0; } logger.Info("Ok"); } catch (Exception ex) { logger.Error(ex, "Ошибка получения данных справочника!"); } }
protected void OnButtonDeleteClicked(object sender, EventArgs e) { TreeIter iter; treeviewUsers.Selection.GetSelected(out iter); int itemid = (int)UsersListStore.GetValue(iter, 0); string loginname = UsersListStore.GetValue(iter, 1).ToString(); bool result; if (QSMain.IsOrmDeletionConfigered) { result = QSMain.OnOrmDeletion("users", itemid); } else { Delete winDel = new Delete(); result = winDel.RunDeletion("users", itemid); winDel.Destroy(); } if (result) { if (QSSaaS.Session.IsSaasConnection) { logger.Info("Удаляем пользователя в облаке..."); QSSaaS.ISaaSService svc = QSSaaS.Session.GetSaaSService(); if (!svc.changeBaseAccessFromProgram(QSSaaS.Session.SessionId, loginname, QSSaaS.Session.SaasBaseName, false)) { logger.Error("Ошибка удаления доступа к базе на сервере SaaS."); } if (svc.UserAccessBaseCount(QSSaaS.Session.SessionId, QSSaaS.Session.Account, loginname) == 0) { if (MessageDialogWorks.RunQuestionDialog($"У пользователя '{loginname}' на сервисе QS:Облако больше не осталось баз данных, к которым он имеет доступ. Удалить пользователя с QS:Облако тоже?")) { if (!svc.DeleteCloudUser(QSSaaS.Session.SessionId, QSSaaS.Session.Account, loginname)) { var text = "Удаления пользователя с QS:Облако не произошло."; logger.Error(text); MessageDialogWorks.RunErrorDialog(text); } } } } else { logger.Info("Удаляем пользователя MySQL..."); string sql; sql = "DROP USER @login, @login @'localhost'"; try { QSMain.CheckConnectionAlive(); MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", loginname); cmd.ExecuteNonQuery(); logger.Info("Пользователь удалён. Ok"); if (QSMain.User.Id == itemid) { MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Close, "Был удален пользователь, под которым Вы подключились к базе данных, чтобы недопустить некорректных операций программа закроется. Зайдите в программу от имени другого пользователя."); md.Run(); md.Destroy(); Environment.Exit(0); } } catch (Exception ex) { logger.Error(ex, "Ошибка удаления пользователя!"); QSMain.ErrorMessage(this, ex); } } } UpdateUsers(); }
void on_editnode_response(object obj, ResponseArgs args) { if (args.ResponseId == ResponseType.Ok) { logger.Info("Запись " + nameNode + "..."); string sql, InsertDescriptString, UpdateDescriptString; if (DescriptionField) { if (ParentFieldName == "") { InsertDescriptString = " (name, description) VALUES (@name, @descript)"; } else { InsertDescriptString = " (name, description, " + ParentFieldName + ") VALUES (@name, @descript, @parent)"; } UpdateDescriptString = ", description = @descript "; } else { if (ParentFieldName == "") { InsertDescriptString = " (name) VALUES (@name)"; } else { InsertDescriptString = " (name, " + ParentFieldName + ") VALUES (@name, @parent)"; } UpdateDescriptString = ""; } if (NewNode) { sql = "INSERT INTO " + TableRef + InsertDescriptString; } else { sql = "UPDATE " + TableRef + " SET name = @name " + UpdateDescriptString + "WHERE id = @id"; } QSMain.CheckConnectionAlive(); try { DbCommand cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; DbParameter param = cmd.CreateParameter(); param.ParameterName = "@id"; param.Value = SelectedID; cmd.Parameters.Add(param); param = cmd.CreateParameter(); param.ParameterName = "@name"; param.Value = inputNameEntry.Text; cmd.Parameters.Add(param); if (DescriptionField) { param = cmd.CreateParameter(); param.ParameterName = "@descript"; param.Value = inputDiscriptionEntry.Text; cmd.Parameters.Add(param); } if (ParentFieldName != "") { param = cmd.CreateParameter(); param.ParameterName = "@parent"; param.Value = ParentId; cmd.Parameters.Add(param); } cmd.ExecuteNonQuery(); if (NewNode && OrdinalField != "") { cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = @"select last_insert_rowid()"; int ItemId = Convert.ToInt32(cmd.ExecuteScalar()); cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = String.Format("UPDATE {0} SET {1} = @id WHERE id = @id", TableRef, OrdinalField); param = cmd.CreateParameter(); param.ParameterName = "@id"; param.Value = ItemId; cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); } logger.Info("Ok"); } catch (Exception ex) { logger.Error(ex, "Ошибка записи {0}!", nameNode); QSMain.ErrorMessage(this, ex); } } }
private void DeleteObjects(string Table, TableInfo.Params ParametersIn) { DbCommand cmd; DbDataReader rdr; string sql; if (!QSMain.ProjectTables.ContainsKey(Table)) { ErrorString = "Нет описания для таблицы " + Table; logger.Error(ErrorString); ErrorHappens = true; return; } QSMain.CheckConnectionAlive(); if (QSMain.ProjectTables[Table].DeleteItems.Count > 0) { foreach (KeyValuePair <string, TableInfo.DeleteDependenceItem> pair in QSMain.ProjectTables[Table].DeleteItems) { if (QSMain.ProjectTables[pair.Key].DeleteItems.Count > 0 || QSMain.ProjectTables[pair.Key].ClearItems.Count > 0) { sql = "SELECT * FROM " + pair.Key + " " + pair.Value.sqlwhere; cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; AddParameters(cmd, pair.Value.SqlParam, ParametersIn); rdr = cmd.ExecuteReader(); List <TableInfo.Params> ReadedData = new List <TableInfo.Params>(); string IntFieldName = QSMain.ProjectTables[pair.Key].PrimaryKey.ParamInt; string StrFieldName = QSMain.ProjectTables[pair.Key].PrimaryKey.ParamStr; while (rdr.Read()) { TableInfo.Params OutParam = new TableInfo.Params(); if (IntFieldName != "") { OutParam.ParamInt = rdr.GetInt32(rdr.GetOrdinal(IntFieldName)); } if (StrFieldName != "") { OutParam.ParamStr = rdr.GetString(rdr.GetOrdinal(StrFieldName)); } ReadedData.Add(OutParam); } rdr.Close(); foreach (TableInfo.Params row in ReadedData) { DeleteObjects(pair.Key, row); } } sql = "DELETE FROM " + pair.Key + " " + pair.Value.sqlwhere; cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; AddParameters(cmd, pair.Value.SqlParam, ParametersIn); cmd.ExecuteNonQuery(); } } if (QSMain.ProjectTables[Table].ClearItems.Count > 0) { foreach (KeyValuePair <string, TableInfo.ClearDependenceItem> pair in QSMain.ProjectTables[Table].ClearItems) { sql = "UPDATE " + pair.Key + " SET "; bool first = true; foreach (string FieldName in pair.Value.ClearFields) { if (!first) { sql += ", "; } sql += FieldName + " = NULL "; first = false; } sql += pair.Value.sqlwhere; cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; AddParameters(cmd, pair.Value.SqlParam, ParametersIn); cmd.ExecuteNonQuery(); } } sql = "DELETE FROM " + Table + " WHERE "; bool FirstKey = true; if (QSMain.ProjectTables[Table].PrimaryKey.ParamInt != "") { sql += QSMain.ProjectTables[Table].PrimaryKey.ParamInt + " = @IntParam "; FirstKey = false; } if (QSMain.ProjectTables[Table].PrimaryKey.ParamStr != "") { if (!FirstKey) { sql += "AND "; } sql += QSMain.ProjectTables[Table].PrimaryKey.ParamStr + " = @StrParam "; FirstKey = false; } cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; TableInfo.PrimaryKeys TempParams = new TableInfo.PrimaryKeys( QSMain.ProjectTables[Table].PrimaryKey.ParamInt != "" ? "@IntParam" : "", QSMain.ProjectTables[Table].PrimaryKey.ParamStr != "" ? "@StrParam" : "" ); AddParameters(cmd, TempParams, ParametersIn); cmd.ExecuteNonQuery(); }
int FillObjects(string Table, TreeIter root, TableInfo.Params ParametersIn) { TreeIter DeleteIter, ClearIter, GroupIter, ItemIter; int Totalcount = 0; int DelCount = 0; int ClearCount = 0; int GroupCount; DbCommand cmd; DbDataReader rdr; QSMain.CheckConnectionAlive(); logger.Debug("Поиск зависимостей для таблицы {0}", Table); if (!QSMain.ProjectTables.ContainsKey(Table)) { ErrorString = "Нет описания для таблицы " + Table; logger.Error(ErrorString); ErrorHappens = true; return(0); } if (QSMain.ProjectTables[Table].DeleteItems.Count > 0) { if (!ObjectsTreeStore.IterIsValid(root)) { DeleteIter = ObjectsTreeStore.AppendNode(); } else { DeleteIter = ObjectsTreeStore.AppendNode(root); } foreach (KeyValuePair <string, TableInfo.DeleteDependenceItem> pair in QSMain.ProjectTables[Table].DeleteItems) { GroupCount = 0; if (!QSMain.ProjectTables.ContainsKey(pair.Key)) { ErrorString = String.Format("Зависимость удаления у таблицы {1} ссылается на таблицу {0} описания для которой нет.", pair.Key, Table); logger.Error(ErrorString); ErrorHappens = true; return(0); } string sql = QSMain.ProjectTables[pair.Key].SqlSelect + pair.Value.sqlwhere; cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; AddParameters(cmd, pair.Value.SqlParam, ParametersIn); rdr = cmd.ExecuteReader(); if (!rdr.HasRows) { rdr.Close(); continue; } GroupIter = ObjectsTreeStore.AppendNode(DeleteIter); int IndexIntParam = 0; int IndexStrParam = 0; if (QSMain.ProjectTables[pair.Key].PrimaryKey.ParamInt != "") { IndexIntParam = rdr.GetOrdinal(QSMain.ProjectTables[pair.Key].PrimaryKey.ParamInt); } if (QSMain.ProjectTables[pair.Key].PrimaryKey.ParamStr != "") { IndexStrParam = rdr.GetOrdinal(QSMain.ProjectTables[pair.Key].PrimaryKey.ParamStr); } List <object[]> ReadedData = new List <object[]>(); while (rdr.Read()) { object[] Fields = new object[rdr.FieldCount]; rdr.GetValues(Fields); ReadedData.Add(Fields); } rdr.Close(); foreach (object[] row in ReadedData) { ItemIter = ObjectsTreeStore.AppendValues(GroupIter, String.Format(QSMain.ProjectTables[pair.Key].DisplayString, row)); if (QSMain.ProjectTables[pair.Key].DeleteItems.Count > 0 || QSMain.ProjectTables[pair.Key].ClearItems.Count > 0) { TableInfo.Params OutParam = new TableInfo.Params(); if (QSMain.ProjectTables[pair.Key].PrimaryKey.ParamInt != "") { OutParam.ParamInt = Convert.ToInt32(row[IndexIntParam]); } if (QSMain.ProjectTables[pair.Key].PrimaryKey.ParamStr != "") { OutParam.ParamStr = row[IndexStrParam].ToString(); } Totalcount += FillObjects(pair.Key, ItemIter, OutParam); } GroupCount++; Totalcount++; DelCount++; } ObjectsTreeStore.SetValues(GroupIter, QSMain.ProjectTables[pair.Key].ObjectsName + "(" + GroupCount.ToString() + ")"); } if (DelCount > 0) { ObjectsTreeStore.SetValues(DeleteIter, String.Format("Будет удалено ({0}/{1}) объектов:", DelCount, Totalcount)); } else { ObjectsTreeStore.Remove(ref DeleteIter); } } if (QSMain.ProjectTables[Table].ClearItems.Count > 0) { if (!ObjectsTreeStore.IterIsValid(root)) { ClearIter = ObjectsTreeStore.AppendNode(); } else { ClearIter = ObjectsTreeStore.AppendNode(root); } foreach (KeyValuePair <string, TableInfo.ClearDependenceItem> pair in QSMain.ProjectTables[Table].ClearItems) { GroupCount = 0; if (!QSMain.ProjectTables.ContainsKey(pair.Key)) { ErrorString = String.Format("Зависимость очистки у таблицы {1} ссылается на таблицу {0} описания для которой нет.", pair.Key, Table); logger.Error(ErrorString); ErrorHappens = true; return(0); } string sql = QSMain.ProjectTables[pair.Key].SqlSelect + pair.Value.sqlwhere; cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; AddParameters(cmd, pair.Value.SqlParam, ParametersIn); rdr = cmd.ExecuteReader(); if (!rdr.HasRows) { rdr.Close(); continue; } GroupIter = ObjectsTreeStore.AppendNode(ClearIter); while (rdr.Read()) { object[] Fields = new object[rdr.FieldCount]; rdr.GetValues(Fields); ItemIter = ObjectsTreeStore.AppendValues(GroupIter, String.Format(QSMain.ProjectTables[pair.Key].DisplayString, Fields)); GroupCount++; Totalcount++; ClearCount++; } ObjectsTreeStore.SetValues(GroupIter, QSMain.ProjectTables[pair.Key].ObjectsName + "(" + GroupCount.ToString() + ")"); rdr.Close(); } if (ClearCount > 0) { ObjectsTreeStore.SetValues(ClearIter, String.Format("Будет очищено ссылок у {0} объектов:", ClearCount)); } else { ObjectsTreeStore.Remove(ref ClearIter); } } return(Totalcount); }