2013-03-15 2 views
3
for (int i = 0; i < purchaseListView.Items.Count; i++) 
Connection con = new Connection(); 
       SqlCommand cmd = new SqlCommand(); 
       SqlCommand cmdFifo = new SqlCommand(); 
       con.OpenConnection(); 
       cmd.Connection = con.DataBaseConnection; 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.CommandText = "insertDetail"; 
       cmdFifo.Connection = con.DataBaseConnection; 
       cmdFifo.CommandType = CommandType.StoredProcedure; 
       cmdFifo.CommandText = "insertInToMain"; 

Это мой код, и я хочу знать, влияет ли цикл на производительность моего программного обеспечения, и если это правильный способ вызова хранимой процедуры в цикле.Сохраненная процедура в цикле

Я сохранил процедуру в классе, и я хочу вызвать ее из формы при нажатии кнопки сохранения и вставить 10 элементов в базу данных с помощью той же хранимой процедуры.

ответ

0

Вы создаете новый объект соединения для каждого элемента, который очень неэффективен.

Создайте один объект соединения и выполните хранимую процедуру n раз с информацией о товаре. Альтернативно создайте хранимую процедуру для приема 10 элементов и вставьте данные на этом уровне.

Переместить это вне цикла (Вы можете получить доступ к con и cmd внутри цикла без создания нового экземпляра:

Connection con = new Connection(); 
    SqlCommand cmd = new SqlCommand(); 
    con.OpenConnection(); 
    cmd.Connection = con.DataBaseConnection; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "insertDetail"; 

Внутри вашего цикла, вы можете добавить все параметры в cmd объекта

.
cmd.Parameters.Add("@Item", SqlDbType.Int); 
cmd.Parameters["@Item"].Value = purchaseListView.Items[i]; 
cmd.ExecuteNonQuery(); 
+0

может у вас, пожалуйста, назовите меня правильным способом? как я могу сделать его эффективным ??? – Bunzitop

+0

isit эффективно делать con.open() for (int i = 0; i Bunzitop

+0

@ пользователь2174542 - не очень. Основная неэффективность заключается в том, что вы находитесь в цикле и создаете много избыточных объектов (т. Е. Используя новый SQLCommand() внутри цикла). Вы можете повторно использовать объекты, как я показал вам в своем ответе. –

0

Ну, вы открываете 10 соединений, и кажется, что вы их не закрываете, поэтому у вас могут закончиться соединения, но я предполагаю, что это не весь код, можете ли вы опубликовать все за?

0

Вы должны настроить соединение и хранимую процедуру перед циклом и только обновить значения параметров команды и exec в цикле. Как это:.

Connection con = new Connection(); 
SqlCommand cmd = new SqlCommand(); 
SqlCommand cmdFifo = new SqlCommand(); 
con.OpenConnection(); 
cmd.Connection = con.DataBaseConnection; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "insertDetail"; 
cmd.Parameters.Add("@Item", SqlDbType.Int); 
cmdFifo.Connection = con.DataBaseConnection; 
cmdFifo.CommandType = CommandType.StoredProcedure; 
cmdFifo.CommandText = "insertInToMain"; 
//now that your connections & commands are set up, you can reuse them within the loop 
for (int i = 0; i < purchaseListView.Items.Count; i++) 
{ 
    //ToDo:assign any SP parameter values 
    cmd.Parameters["@Item"].Value = purchaseListView.Items[i]; 
    // ... 

    //then exec within the loop 
    cmd.ExecuteNonQuery(); 
    cmdFifo.ExecuteNonQuery(); 
} 
+0

Я хочу сохранить код для передачи параметра в классе и вызвать хранимую процедуру при нажатии кнопки сохранения. Я хочу открыть соединение только один раз и вызвать хранимую процедуру. пожалуйста, дайте мне демо-код, пожалуйста! – Bunzitop

+0

Лучше всего, если вы назначаете SP-параметры и запускаете SP в одном классе. Это делает дизайн OO более атомарным. Это также помогает избежать утечек соединений, как отметил @jcarlos. (до тех пор, как вы закрываете и располагаете в своем классе должным образом). – tgolisch

+0

если соединение и sqlcommand() и следующий код находятся в некотором блоке функции в классе, как я могу позвонить только 'cmd.Parameters.Add("@Item", SqlDbType.Int); cmd.Parameters["@Item"].Value = purchaseListView.Items[i]; cmd.ExecuteNonQuery();' Bunzitop

0

Я хотел бы предложить вам создать таблицу и вставить все данные в нее перебирая все входы т.е. попытаться создать единую хранимую процедуру. Запуск многопильного времени цикла for неэффективен, а также база данных будет генерировать количество результирующих множеств, которое также повлияет на вашу производительность из-за сетевых издержек.

Смежные вопросы