1Future Ответов: 3

Как повторно сгенерировать случайную строку, если сгенерированная строка уже существует в базе данных


Я думаю, что у меня есть простая ситуация, которую я, кажется, не могу решить, и я надеюсь, что кто-то прольет некоторый свет на это:

в основном у меня есть метод, который генерирует случайное число, подобное этому:


п
Public static string Code()
            {
                var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                var c= new char[6];
                var random = new Random();
    
                for (int i = 0; i < c.Length; i++)
                {
                    c[i] = characters[random.Next(characters.Length)];
                }
    
                var code = new String(c);
                return code;
            }


У меня есть еще один метод, который проверяет, существует ли сгенерированный код в приведенном выше методе уже в базе данных. Если код существует, то повторно сгенерируйте другой код .

public void SetCode()
        {

           string _code = Code();
            using(var db = new Database())
                    {
                        var p = db.Codes.Where(pc => pc.Code.Equals(Code));

                        
                        if (p.Any())
                        {
                          // this is where i'm stuck, if the code exist i'll do i send it back to generate another code?
                        }
                      //if code doesn't exist in the db save it....
                    }
                   
        }


Как я могу идти вперед и достичь этого?
Спасибо

Что я уже пробовал:

Посмотрел на сделать, в то время как петли и

if (p.Any())
                        {
                          // this is where i'm stuck, if the code exist i'll do i send it back to generate another code?
                        }
                      //if code doesn't exist in the db save it....
                    }
                   
        }

Thanks7872

Какая база данных существует?

BillWoodruff

Вы знаете, как писать в базу данных ? Как изменить существующее значение в базе данных ? Если вы не знаете, как с вашей текущей базой данных создавать, читать, обновлять и удалять (CRUD), вы не добьетесь прогресса.

Вам нужно просмотреть документацию по вашей базе данных.

Richard Deeming

Либо а пока[^] или А делай...пока[^] сделает свое дело. В чем проблема?

string code;
using (var db = new Database())
{
    do
    {
        code = Code();
    }
    while (db.Codes.Any(pc => pc.Code == code))
}

string code = Code();
using (var db = new Database())
{
    while (db.Codes.Any(pc => pc.Code == code))
    {
        code = Code();
    }
}

BillWoodruff

Я бы проголосовал за это № 5, если бы это было опубликовано в качестве решения.

3 Ответов

Рейтинг:
7

Richard Deeming

Как я уже упоминал в комментариях, либо пока[^] или А делай...пока[^] сделает свое дело.

string code;
using (var db = new Database())
{
    do
    {
        code = Code();
    }
    while (db.Codes.Any(pc => pc.Code == code))
}
string code = Code();
using (var db = new Database())
{
    while (db.Codes.Any(pc => pc.Code == code))
    {
        code = Code();
    }
}


Рейтинг:
1

W∴ Balboos, GHB

Решение А:
1) Установите уникальное ограничение для этого поля в таблице
2) Проверьте наличие неисправности вставки
3) регенерируйте при отказе.

Раствор Б:
1) сгенерировать случайную строку
2) Используйте запрос, чтобы проверить его в поле
3) регенерировать, если он существует

Для A и B
4) Повторяйте по мере необходимости, но если ваши случайные строки короткие, я бы, возможно, ограничил повторные попытки в случае, если ваша таблица будет слишком плотно заполнена и она будет работать "вечно".

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


1Future

Привет, спасибо за ответ .. Я думаю, что решение B - это то, чего я пытаюсь достичь в приведенном выше коде . но я застрял на том, как я могу регенерировать, если код все еще существует ... может быть, это то, что может показать мне пример кода?

W∴ Balboos, GHB

Вы отметили это как вопрос C#, поэтому я ожидаю, что вы будете знакомы с условными циклами C#. Используйте прерывание цикла с успехом (как это сделал бы вход uid/pwd при входе в систему).

С 26^6 возможными комбинациями, если они не будут быстро сгенерированы машиной для какого-то теста, это произойдет не очень часто. Существует почти 40 миллиардов уникальных комбинаций.

Дополнительная подсказка: если вы используете решение B, в частности, я бы поставил индекс на это поле, если оно начнет заполняться.

Dave Kreskowiak

Это 36^6, и это всего лишь 2,176 миллиарда комбинаций. :)

Dave Kreskowiak

Вариант а-единственный, который осуществим.

Вариант Б имеет проблему проверки его наличия, а затем выполнения вставки в отдельной операции. Ну, а что, если во время проверки он не существует, но во время вставки он вдруг появляется из-за нескольких пользователей? Теперь вы должны справиться с тем случаем, когда проверка хороша, но вставка терпит неудачу. Конечно, вы могли бы обойти это с помощью тщательно разработанного SQL, но, учитывая уровень квалификации ОП,...

Рейтинг:
1

Graeme_Grant

Если вы должны использовать рандомизированные строки, то я бы рекомендовал следующее решение:

var random = Guid.NewGuid().ToString("N");


1Future

Как мне определить, сколько символов??... Я хотел бы иметь длину 6 символов

Graeme_Grant

6 символов? может быть, кодировка base32 поможет вам добраться туда: Кодер и декодер Base32 в C#[^] но вам было бы лучше увеличить размер поля только в том случае, если кодировка вызывает дупеликаты.