Более эффективный и быстрый способ генерирования чисел и вставки в БД - PullRequest
0 голосов
/ 01 сентября 2011

Привет всем, у меня есть следующий бит кода, который используется для генерации телефонных номеров и вставки их в таблицу в базе данных. Для генерации кодов он просматривает таблицу в базе данных, чтобы увидеть, какие цифры «F» нужно генерировать для диапазона. Так, например, диапазон Лидса «01132 21», нуждается в создании чисел для 1,3,4 и 6. Таким образом, сгенерированные числа будут выглядеть как 01132211000-01132211999, 01132213000-01132213999 и т. Д.

Это работает, как я хотел и как ожидалось. Однако это занимает довольно много времени (12 часов, чтобы сгенерировать 120 000 записей, и я предполагаю, что мы могли бы создать примерно миллион записей. Просто интересно, есть ли более быстрый способ сделать то, что я хочу. Я все еще очень " зеленый "разработчик, так что пока не знаю, как лучше это сделать!

private TelephoneNumberManagementEntities context = new TelephoneNumberManagementEntities();

public ActionResult Index()
{
    var list = context.TempNumberImports.ToList();
    foreach (var item in list)
    {
        string range = item.Range.ToString().Trim().Replace(" ","");

        if (item.C0 == "Y")
        {
            GenerateNumbers(range, 0, 999, item.ID);
        }
        if (item.C1 == "Y")
        {
            GenerateNumbers(range, 1000, 1999, item.ID);
        }
        if (item.C2 == "Y")
        {
            GenerateNumbers(range, 2000, 2999, item.ID);
        }
        if (item.C3 == "Y")
        {
            GenerateNumbers(range, 3000, 3999, item.ID);
        }
        if (item.C4 == "Y")
        {
            GenerateNumbers(range, 4000, 4999, item.ID);
        }
        if (item.C5 == "Y")
        {
            GenerateNumbers(range, 5000, 5999, item.ID);
        }
        if (item.C6 == "Y")
        {
            GenerateNumbers(range, 6000, 6999, item.ID);
        }
        if (item.C7 == "Y")
        {
            GenerateNumbers(range, 7000, 7999, item.ID);
        }
        if (item.C8 == "Y")
        {
            GenerateNumbers(range, 8000, 8999, item.ID);
        }
        if (item.C9 == "Y")
        {
            GenerateNumbers(range, 9000, 9999, item.ID);
        }
    }
    return View();
}

public void GenerateNumbers(string range, int startNo, int endNo, int rangeID)
{
    Number num = new Number();
    for (int i = startNo; i <= endNo; i++)
    {
        if (startNo == 0)
        {
            string tempNum = range + i.ToString("D4");
            var record = context.Numbers.FirstOrDefault(m => m.Number1 == tempNum);
            if (record == null)
            {
                num.Number1 = tempNum;
                num.RangeID = rangeID;
                num.StatusID = 1;
                num.ImportDate = DateTime.Now;
                num.ImportSource = "Number Ranges 250811.xlsx";
                context.Numbers.Add(num);
                context.SaveChanges();
            }
        }
        else
        {
            string tempNum = range + i;
            var record = context.Numbers.FirstOrDefault(m => m.Number1 == tempNum);
            if (record == null)
            {
                num.Number1 = tempNum;
                num.RangeID = rangeID;
                num.StatusID = 1;
                num.ImportDate = DateTime.Now;
                num.ImportSource = "Number Ranges 250811.xlsx";
                context.Numbers.Add(num);
                context.SaveChanges();
            }
        }
    }
}

1 Ответ

1 голос
/ 01 сентября 2011

Простой ответ: ИСПОЛЬЗОВАНИЕ ХРАНЕННОЙ ПРОЦЕДУРЫ

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

Вы можетеТакже рассмотрите возможность подготовки данных в пакетном режиме и используйте SqlBulkCopy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...