2015-06-08 2 views
0

Мне нужно сохранить несколько строк в gridview в базе данных. Однако мой текущий код сохраняет только первую строку. Я блуждаю, почему это не зацикливание моей линии foreach. Что мне не хватает кода для выполнения намеченной задачи. Благодаря!Сохранение только первой строки сетки в DB

Мое событие

protected void btnSaveAll_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection conn = DB_Connect.GetConn()) 
    { 
     SqlCommand newCmd = conn.CreateCommand(); 
     newCmd.Connection = conn; 
     newCmd.CommandType = CommandType.StoredProcedure; 

     foreach (GridViewRow row in grdStyle.Rows) 
     { 

        if (Convert.ToString((row.FindControl("txtStyle") as TextBox).Text.Trim()) == string.Empty) 
        { 
         WebMsgBox.Show("Style cannot be empty."); 
         return; 
        } 
        if (Convert.ToString((row.FindControl("txtMSMV") as TextBox).Text.Trim()) == string.Empty) 
        { 
         WebMsgBox.Show("MSMV cannot be empty."); 
         return; 
        } 
        if (Convert.ToString((row.FindControl("txtTSMV") as TextBox).Text.Trim()) == string.Empty) 
        { 
         WebMsgBox.Show("TSMV cannot be empty."); 
         return; 
        } 
        string TeamID = Convert.ToString((row.FindControl("TeamID") as Label).Text.Trim()); 
        string Style = Convert.ToString((row.FindControl("txtStyle") as TextBox).Text.Trim()); 
        string MSMV = Convert.ToString((row.FindControl("txtMSMV") as TextBox).Text.Trim()); 
        string TSMV = Convert.ToString((row.FindControl("txtTSMV") as TextBox).Text.Trim()); 

        newCmd.CommandText = "[DailyProductionOutput].[dbo].[sp_InsertTeamStyle]"; 
        newCmd.Parameters.Add("@TeamID", SqlDbType.Int).Value = TeamID; 
        newCmd.Parameters.Add("@CompanyID", SqlDbType.Int).Value = companyID;//global variable 
        newCmd.Parameters.Add("@Style", SqlDbType.NVarChar).Value = Style; 
        newCmd.Parameters.Add("@MSMV", SqlDbType.Decimal).Value = MSMV; 
        newCmd.Parameters.Add("@TSMV", SqlDbType.Decimal).Value = TSMV; 

        try 
        { 
         if (conn.State.ToString() == "Closed") 
         { 
          conn.Open(); 
         } 
         newCmd.ExecuteNonQuery(); 

        } 
        catch (Exception ex) 
        { 
         WebMsgBox.Show("Saving failed." + ex); 
        } 

        conn.Close(); 

        ((TextBox)(row.FindControl("txtStyle"))).Text = string.Empty; 
        ((TextBox)(row.FindControl("txtMSMV"))).Text = string.Empty; 
        ((TextBox)(row.FindControl("txtTSMV"))).Text = string.Empty; 

      } 

     } 
    } 
} 
+0

Я уверен, что вы должны получать исключение здесь. Если да, то что и где в вашем коде? –

+0

Сетки привязаны к источнику данных - данных, набора данных, списка объектов. Вы сохраняете объекты источника данных, а не строки сетки. Проверьте учебник по ADO.NET и привязке данных, потому что, даже если вы исправляете много мест, где ваш код разбивается, он слишком сложный и подвержен ошибкам. –

+0

@HarveySpecter Нет, ошибок нет. – Prosper

ответ

0

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

Не заставляйте их ясно и проверьте еще раз ..

((TextBox)(row.FindControl("txtStyle"))).Text = string.Empty; 
((TextBox)(row.FindControl("txtMSMV"))).Text = string.Empty; 
((TextBox)(row.FindControl("txtTSMV"))).Text = string.Empty; 
+0

Прошу прощения. Это не проблема. У меня есть ярлык, который не будет очищен, поэтому я ожидаю, что foeach зациклится. – Prosper

1

Может быть, вы можете обратиться к this link

И основанный на этот пост, вы можете:

  1. Открыт только одно соединение за одну транзакцию (не на строку)
  2. Закрыть соединение Afte r вы выполните все строки

Ваш код сохраняет только последнюю строку для каждого btnSaveAll, нажав, так как вы не соблюдаете это условие.

Было бы так:

SqlConnection conn = DB_Connect.GetConn(); 
conn.Open(); 
.... 

using(SqlCommand ....) 
{ 
    foreach (GridViewRow row in GridView1.Rows) 
    { 
     ..... 
     your transaction here 
     ..... 
     newCmd.Parameters.Clear(); 
     ...filling parameter 
     newCmd.ExecuteNonQuery(); 
    } 
} 
conn.Close(); 
+0

Спасибо, я попробую и дам вам знать. – Prosper

+0

Очистка списка параметров сделала трюк, т.е. newCmd.Parameters.Clear(); – Prosper