Member 13771716 Ответов: 1

Вставка данных из gridview одним нажатием кнопки


Я пытаюсь вставить каждую строку из gridview в базу данных одним нажатием кнопки. Код работает без ошибок, но на самом деле ничего не вставляется в базу данных, может ли кто-нибудь заметить, что я сделал не так? Вот код c# из моего события button.

protected void btnSubmit_Click(object sender, EventArgs e)
  {
     int index = 0;
     foreach (GridViewRow row in gvStockTake.Rows)
     {
      if (row.RowType == DataControlRowType.DataRow)
        {
         Label ID = gvStockTake.Rows[index].FindControl("itemId")as Label;
         TextBox BAR = gvStockTake.Rows[index].FindControl("txtBar") as TextBox;
         TextBox STORAGE = gvStockTake.Rows[index].FindControl("txtStorage") as TextBox;

                   SqlConnection con = new SqlConnection(connectionString);
                   SqlCommand cmd = new SqlCommand();
                   cmd.CommandType = CommandType.Text;
                   cmd.CommandText =
                        "insert into Stock_Take_Item(ItemID, BarQuantity, StorageQuantity) values(@ID, @BAR, @STORAGE) ";
                            

                   cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID.Text;
                   cmd.Parameters.Add("@BAR", SqlDbType.Int).Value = BAR.Text;
                   cmd.Parameters.Add("@STORAGE", SqlDbType.Int).Value = STORAGE.Text;

                        
                    }

                    index++;
                }

                Response.Write("Successfully inserted stock take items.");
            }



Вот код для заполнения моего Gridview:
void PopulateGridview()
      {
          DataTable dtbl = new DataTable();
          using (SqlConnection sqlCon = new SqlConnection(connectionString))
          {
              sqlCon.Open();
              SqlDataAdapter sqlDa = new SqlDataAdapter("SELECT Item.ItemID, Item.ItemDesc, Stock_Take_Item.BarQuantity, Stock_Take_Item.StorageQuantity FROM Item LEFT JOIN Stock_Take_Item ON Item.ItemID = Stock_Take_Item.ItemID", sqlCon);
              sqlDa.Fill(dtbl);
          }
          gvStockTake.DataSource = dtbl;
          gvStockTake.DataBind();
      }


Вот код для моего Gridview (я удалил все свойства стиля для сокращения целей)
<pre><asp:GridView ID="gvStockTake" runat="server" AutoGenerateColumns="false" ShowHeaderWhenEmpty="true"



                <Columns>
                <asp:TemplateField HeaderText="Item ID">
                    <ItemTemplate>
                        <asp:Label id="itemId" Text='<%# Eval("ItemID")%>' runat="server" />
                </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Item Description">
                    <ItemTemplate>
                        <asp:Label Text='<%# Eval("ItemDesc")%>' runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
                 
                <asp:TemplateField HeaderText="Bar Quantity">
                    <ItemTemplate>
                        <asp:TextBox ID="txtBar" runat="server"></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                 
                <asp:TemplateField HeaderText="Storage Quantity">
                    <ItemTemplate>
                        <asp:TextBox ID="txtStorage" runat="server"></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>

                </Columns>
            </asp:GridView>

Я все еще учусь, как иду, так что любые рекомендации будут очень признательны!

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

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

j snooze

к счастью для вас, исправить это легко. У вас есть инструкция insert и заполненные параметры...но вы никогда не говорили команде, чтобы она выполнялась :)
cmd.ExecuteNonQuery(); должен сделать трюк, предполагая, что ваш синтаксис SQL верен. (Прямо перед индексом++)

Member 13771716

Эй, Спасибо за быстрый ответ!

Я добавил Это в свой метод btnSubmit_Click и получил эту ошибку -
"Система.InvalidOperationException: 'ExecuteNonQuery: свойство соединения не было инициализировано.'"

j snooze

Конечно же, посмотрите в своем populategridview, где вы открываете свой sqlconn. Кроме того, вы должны сообщить команде SQL, какое соединение sql вы используете.
УМК.Подключение = кон.

итак, 1. Не забудьте открыть sql-соединение с вашим сервером и 2. Убедитесь, что ваша sql-команда знает, какое соединение ей нужно использовать для выполнения инструкции.

1 Ответов

Рейтинг:
0

Wendelius

Вы пропускаете как открытие соединения, так и выполнение инструкции.

Возможно, что-то вроде

int index = 0;
foreach (GridViewRow row in gvStockTake.Rows) {
   if (row.RowType == DataControlRowType.DataRow) {
      Label ID = gvStockTake.Rows[index].FindControl("itemId") as Label;
      TextBox BAR = gvStockTake.Rows[index].FindControl("txtBar") as TextBox;
      TextBox STORAGE = gvStockTake.Rows[index].FindControl("txtStorage") as TextBox;

      using (SqlConnection con = new SqlConnection(connectionString)) {
         using (SqlCommand cmd = new SqlCommand()) {
            try {
               cmd.CommandType = CommandType.Text;
               cmd.CommandText =
              "insert into Stock_Take_Item(ItemID, BarQuantity, StorageQuantity) values(@ID, @BAR, @STORAGE) ";
               cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID.Text;
               cmd.Parameters.Add("@BAR", SqlDbType.Int).Value = BAR.Text;
               cmd.Parameters.Add("@STORAGE", SqlDbType.Int).Value = STORAGE.Text;
               con.Open();
               cmd.EndExecuteNonQuery();
            } catch (System.Exception) {
               // In here properly inform about the exception
            }
         }
      }
   }

   index++;
}

Response.Write("Successfully inserted stock take items.");

Мало что стоит отметить:
- Использование использования для правильной утилизации объектов
- Попробуй..поймай, чтобы справиться с проблемами