2015-05-29 2 views
2

Я работаю над проектом Asp .Net. Поэтому у меня есть страница, где я генерирую случайные купонные ключи. Таким образом, пользователь вводит количество и генерирует.Вставить запрос внутри цикла for не работает правильно

Так что я сделал, я поставил цикл цикла в соответствии с количеством и внутри цикла for. Я создал случайный ключ и искал ключ в БД (ключ уникален), а затем вставлял данные в БД.

Код:

for (int i = 0; i < quantity; i++) 
{ 
    do 
    { 
    couponKey = generateKey(); 
    } while (!SearchEpinKey(couponKey)); 

    conn = new SqlConnection(connString); 
    conn.Open(); 

    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.Text; 
     string query = "INSERT INTO CouponStock (coupon_key, status, created_on)"; 
     query += "VALUES('" + couponKey + "','Unused', GETDATE())"; 
     cmd.CommandText = query; 
     cmd.ExecuteNonQuery(); 

    } 
    conn.Close(); 
} 

Внутри цикла, поток, как:

-Genrate random key 
-Search if random key exists or not in db 
-If found similar then again generate random key 
-Insert the data in DB 

Так что, когда я запускаю эту страницу для небольших количеств, как 10 или 15, его рабочего штраф. Но когда я иду на 50 или 100, он вставляет случайное число строк, например, когда-то 24, иногда 48. И приложение становится зависающим после этого. Я думаю, что сервер Sql поражает много времени в короткий промежуток времени. Любые рекомендации относительно того, как справиться с этим, будут полезны.

+0

Что логика используется для генерации вашего случайного ключа? Возможно, вы сможете переместить весь этот процесс в хранимую процедуру. Это было бы намного проще, быстрее и точнее. –

+0

@SeanLange Спасибо за идею, я поместил все данные в коллекцию и затем выполнил запрос. Я не знаю о параметре таблицы, но я буду искать в Интернете. – sumit

+0

@SeanLange Если я использую ту же логику внутри процедуры, она будет работать правильно? – sumit

ответ

0

Единственная причина, которую я смог найти из-за этого

do 
{ 
    couponKey = generateKey(); 
} while (!SearchEpinKey(epinKey)); 

Если вы используете couponKey в вашем INSERT запросе, почему вы используете SearchEpinKey(epinKey)? где вы ищете couponKey в БД?

Вы назначены generateKey() к couponKey переменной, и ваш проверяете против epinKey, я считаю, что, когда epinKey уже хранится в БД он висит (бесконечный цикл), потому что epinKey всегда одинаково, даже если вы Ассинг новое значение к couponKey

просто изменить эту строку

} while (!SearchEpinKey(epinKey)); 

этому

} while (!SearchEpinKey(couponKey)); 
+0

Спасибо за редактирование. Я сделал редактирование. но проблема остается прежней. – sumit

+0

Каков код функции generateKey()? Отправьте его, пожалуйста, –

+0

его просто возвращающее случайное число из 25 символов, ничего особенного. – sumit

0

Прежде всего, я думаю, нам следует избегать открытия нового соединения для каждой вставки, также мы всегда должны использовать функцию ASP.Net для функции для параметра (например, AddWithValue), так как они помогают избежать SQL Injection

var couponList = new System.Collections.Generic.List<String>(); 
    var query = "INSERT INTO CouponStock(coupon_key, status, created_on) VALUES(@coupon_key, @status, GETUTCDATE());"; 

    using (SqlConnection conn = new SqlConnection(connString)) 
    { 
     try 
     { 
      conn.Open(); 

      do{ 
       var couponKey = generateKey(); 

       //return early for readability 
       if(!SearchEpinKey(couponKey)) continue; 
       if(couponList.Contains(couponKey)) continue; 

       //add to coupon list to ensure newly generated key does not duplicate 
       couponList.Add(couponKey); 

       SqlCommand cmd = conn.CreateCommand(query); 
       cmd.Parameters.AddWithValue("@coupon_key", couponKey); 
       cmd.Parameters.AddWithValue("@status", "Unused"); 

       cmd.ExecuteNonQuery(); 
      } 
      while (couponList.Count < quantity); 
     } 
     catch (Exception e) 
     { 
      // handle exceptions or re-throw them... 
     } 
     finally 
     { 
      conn.Close(); 
     } 
    } 
Смежные вопросы