Обеспечьте ограничение строки без блокировки считывателей [дубликат]

Есть ли способ заставить TextBox управлять полем вашего класса вместо переменной внутри вашего метода генератора

public class MyWindow : Window
{
    private TextBox txtNumber;

    public void Window_Loaded()
    {
        GenerateControls();
    }

    public void GenerateControls()
    {
        Button btnClickMe = new Button();
        btnClickMe.Content = "Click Me";
        btnClickMe.Name = "btnClickMe";
        btnClickMe.Click += new RoutedEventHandler(this.CallMeClick);
        someStackPanel.Childern.Add(btnClickMe);
        txtNumber = new TextBox();
        txtNumber.Name = "txtNumber";
        txtNumber.Text = "1776";
        someStackPanel.Childern.Add(txtNumber);
    }

    protected void ClickMeClick(object sender, RoutedEventArgs e)
    {    
        // Find the phone number    
        string message = string.Format("The number is {0}", txtNumber.Text);        
        MessageBox.Show(message);
    }
}
1
задан elpddev 16 May 2015 в 08:53
поделиться

1 ответ

Существует способ реализовать это в SQL без триггеров. Это немного сложно, но вы можете это сделать.

Он начинается с добавления другой таблицы. Позвольте мне называть это RoleNumbers. Эта таблица будет состоять из одной строки для каждой возможной роли для пользователя. Таким образом, вы устанавливаете его с помощью 1, 2 или сколько угодно.

Затем для таблицы переходов:

create table UserRoles ( UserRoleId int not null auto_increment primary key, UserId int not null references users(user_id), RoleId int not null references roles(role_id), RoleNumber int not null references RoleNumbers(Number), unique (UserId, RoleId), unique (UserId, RoleNumber) );

В этом используются мои соглашения об именах. У меня нет проблем с синтетическим ключом в таблице соединений.

Когда вы вставляете новую запись, вам нужно будет присвоить значение RoleNumber, которое еще не используется. Следовательно, вы получаете предел. Самый эффективный способ сделать это через триггеры, но это не является абсолютно необходимым. Вы можете сделать вставку:

insert into UserRoles(UserId, RoleId, RoleNumber) select $UserId, $RoleId, coalesce(max(RoleNumber), 0) + 1 from UserRoles where UserId = $UserId;

delete потребует отдельный запрос для поддержания схемы нумерации.

2
ответ дан Gordon Linoff 15 August 2018 в 14:01
поделиться
  • 1
    Это инновационный подход. Если я правильно понимаю вас, столбцы RoleNumber и UserId в UserRoles должны быть уникальными вместе, а таблица RoleNumber - абстрактными возможностями роли пользователя. Количество строк представляет собой максимальное количество требуемых ролей. Это верно ? – elpddev 16 May 2015 в 15:48
  • 2
    Исходя из этого, могу ли я отказаться от таблицы RoleNumber и использовать столбец RoleNumber enum в таблице UserRoles, который будет проверяться с помощью проверочного ограничения ex. & quot; ПРОВЕРИТЬ (номер роли & lt; 2) & quot; ? – elpddev 16 May 2015 в 15:54
  • 3
    RoleNumber int not null distinct references RoleNumbers(Number), Я никогда не видел этот синтаксис distinct, как он работает и какие СУБД его поддерживают? Конечно, вы также можете сделать RoleNumber int not null check (RoleNumber between 1 and 2) и добавить еще unique (UserId, RoleId,RoleNumber). Но техническое обслуживание будет ужасным. – dnoeth 16 May 2015 в 16:43
  • 4
    @dnoeth. , , Это должно было быть unique. Что касается ограничения check, это хорошая идея, но MySQL фактически не выполняет проверку. – Gordon Linoff 16 May 2015 в 17:14
  • 5
    Но unique - это ограничение, которое не позволяет нескольким строкам с одинаковым значением, так как это должно работать здесь? Или mysql (опять же) не соответствует стандартным SQL? – dnoeth 16 May 2015 в 17:19
Другие вопросы по тегам:

Похожие вопросы: