还有另一种有效的方法将数据更新到gridview内的数据库吗?

问题描述 投票:0回答:1

所以我在这里所做的是将gridview内的数据插入和更新到数据库的过程。我在更新时遇到了一些问题。当我将数据插入到gridview的多行中时,它只会更新gridview的最后一行。如果 TDR_CODE 已经存在于数据库中并且假设它在表中有 3 行,那么所有 3 行将具有与 gridview 的最后一行相同的值。下面是相关的代码,它的作用是检查表中 TDR_CODE 是否存在。如果不存在,则计数将为 0,但如果存在,则计数将 >0。

以下是代码

protected void GLType()
        {
            string QueryCheckExistingTDRCode = "SELECT COUNT(*) FROM table WHERE TDR_CODE = :TDR_CODE";

            using (OracleCommand CheckExistingTDRCodeCmd = new OracleCommand(QueryCheckExistingTDRCode, con))
            {
                CheckExistingTDRCodeCmd.Parameters.Add("TDR_CODE", OracleDbType.Varchar2).Value = TextBoxTDRCode.Text;
                

                int count = Convert.ToInt32(CheckExistingTDRCodeCmd.ExecuteScalar());

                if (count == 0)
                {
                    InsertDataGLType();
                }
                else
                {
                    UpdateDataGLType();
                }
            }
        }

protected void InsertDataGLType()
        {
            string insertQuery = "INSERT INTO table (TDR_CODE, GL_TYPE, GL_ACCNO) VALUES (:TDR_CODE, :GL_TYPE, :GL_ACCNO)";

            try
            {
                List<UpdateDataItem> updateItems = new List<UpdateDataItem>();

                foreach (GridViewRow row in GridViewSelection.Rows)
                {
                    DropDownList ddlGLType = (DropDownList)row.FindControl("DropDownListGLType");
                    TextBox txtGLAccNo = (TextBox)row.FindControl("TextBoxGLAccNo");

                    if (!string.IsNullOrEmpty(ddlGLType.SelectedValue) && !string.IsNullOrEmpty(txtGLAccNo.Text))
                    {
                        // Add data to the list
                        updateItems.Add(new UpdateDataItem
                        {
                            TDRCode = TextBoxTDRCode.Text,
                            GLType = ddlGLType.SelectedValue,
                            GLAccNo = txtGLAccNo.Text
                        });

                    }
                }

                // Now, update the database with the data from the list
                using (OracleCommand InsertNewDataCmd = new OracleCommand(insertQuery, con))
                {
                    InsertNewDataCmd.Parameters.Add("TDR_CODE", OracleDbType.Varchar2);
                    InsertNewDataCmd.Parameters.Add("GL_TYPE", OracleDbType.Varchar2);
                    InsertNewDataCmd.Parameters.Add("GL_ACCNO", OracleDbType.Varchar2);

                    foreach (var item in updateItems)
                    {
                        InsertNewDataCmd.Parameters["TDR_CODE"].Value = item.TDRCode;
                        InsertNewDataCmd.Parameters["GL_TYPE"].Value = item.GLType;
                        InsertNewDataCmd.Parameters["GL_ACCNO"].Value = item.GLAccNo;

                        InsertNewDataCmd.ExecuteNonQuery();
                    }
                }
            }
            catch (OracleException oracleEx)
            {
                LabelWarning.Text = "Oracle Error: " + oracleEx.Message;
            }
            catch (FormatException formatEx)
            {
                LabelWarning.Text = "Format Error: " + formatEx.Message;
            }
            catch (Exception ex)
            {
                LabelWarning.Text = "Error: " + ex.Message;
            }
            finally
            {
                if (string.IsNullOrEmpty(LabelWarning.Text))
                {
                    LabelWarning.Text = "Operation successful!";
                }
            }
        }

以下是有问题的更新代码

protected void UpdateDataGLType()
        {
            string updateQuery = "UPDATE table SET GL_TYPE = :GL_TYPE, GL_ACCNO = :GL_ACCNO WHERE TDR_CODE = :TDR_CODE";

            try
            {
                List<UpdateDataItem> updateItems = new List<UpdateDataItem>();

                foreach (GridViewRow row in GridViewSelection.Rows)
                {
                    DropDownList ddlGLType = (DropDownList)row.FindControl("DropDownListGLType");
                    TextBox txtGLAccNo = (TextBox)row.FindControl("TextBoxGLAccNo");

                    if (!string.IsNullOrEmpty(ddlGLType.SelectedValue) && !string.IsNullOrEmpty(txtGLAccNo.Text))
                    {
                        // Add data to the list
                        updateItems.Add(new UpdateDataItem
                        {
                            TDRCode = TextBoxTDRCode.Text,
                            GLType = ddlGLType.SelectedValue,
                            GLAccNo = txtGLAccNo.Text
                        });

                        // You can perform additional actions here if needed
                    }
                }

                // Now, update the database with the data from the list
                using (OracleCommand UpdateCmd = new OracleCommand(updateQuery, con))
                {
                    UpdateCmd.Parameters.Add("TDR_CODE", OracleDbType.Varchar2);
                    UpdateCmd.Parameters.Add("GL_TYPE", OracleDbType.Varchar2);
                    UpdateCmd.Parameters.Add("GL_ACCNO", OracleDbType.Varchar2);

                    foreach (var item in updateItems)
                    {
                        UpdateCmd.Parameters["TDR_CODE"].Value = item.TDRCode;
                        UpdateCmd.Parameters["GL_TYPE"].Value = item.GLType;
                        UpdateCmd.Parameters["GL_ACCNO"].Value = item.GLAccNo;

                        UpdateCmd.ExecuteNonQuery();
                    }
                }
            }
            catch (OracleException oracleEx)
            {
                LabelWarning.Text = "Oracle Error: " + oracleEx.Message;
            }
            catch (FormatException formatEx)
            {
                LabelWarning.Text = "Format Error: " + formatEx.Message;
            }
            catch (Exception ex)
            {
                LabelWarning.Text = "Error: " + ex.Message;
            }
            finally
            {
                if (string.IsNullOrEmpty(LabelWarning.Text))
                {
                    LabelWarning.Text = "Operation successful!";
                }
            }

        }

以下是没有问题的更新代码

protected void UpdateDataGLType()
        {
            string deleteQuery = "DELETE FROM table WHERE TDR_CODE = :TDR_CODE";

            using (OracleCommand deleteCmd = new OracleCommand(deleteQuery, con))
            {
                deleteCmd.Parameters.Add("TDR_CODE", OracleDbType.Varchar2).Value = TextBoxTDRCode.Text;

                try
                {
                    deleteCmd.ExecuteNonQuery();
                }
                catch (OracleException oracleEx)
                {
                    LabelWarning.Text = "Oracle Error: " + oracleEx.Message;
                }
                catch (FormatException formatEx)
                {
                    LabelWarning.Text = "Format Error: " + formatEx.Message;
                }
                catch (Exception ex)
                {
                    LabelWarning.Text = "Error: " + ex.Message;
                }
                finally
                {
                    InsertDataGLType();
                }
            }


        }

因此,为了遇到这个问题,我首先从数据库中删除现有数据,然后进行插入过程。我只是不明白为什么我不能只进行更新,即使我已经将修改的行放入列表中。我也尝试过 OracleBuckCopy 但问题仍然发生。

c# asp.net arraylist gridview aspxgridview
1个回答
0
投票

我认为问题出在下面的 foreach 循环

// Now, update the database with the data from the list
using (OracleCommand UpdateCmd = new OracleCommand(updateQuery, con))
{
    UpdateCmd.Parameters.Add("TDR_CODE", OracleDbType.Varchar2);
    UpdateCmd.Parameters.Add("GL_TYPE", OracleDbType.Varchar2);
    UpdateCmd.Parameters.Add("GL_ACCNO", OracleDbType.Varchar2);

    foreach (var item in updateItems)  //<= this is a problem
    {
        UpdateCmd.Parameters["TDR_CODE"].Value = item.TDRCode;
        UpdateCmd.Parameters["GL_TYPE"].Value = item.GLType;
        UpdateCmd.Parameters["GL_ACCNO"].Value = item.GLAccNo;

        UpdateCmd.ExecuteNonQuery();
    }
}

它有效地覆盖分配给给定参数的值。结果:仅将最后一个元素的值保存到数据库中。 试试这样:

// Now, update the database with the data from the list
foreach (var item in updateItems)
{
    using (OracleCommand UpdateCmd = new OracleCommand(updateQuery, con))
    {
        UpdateCmd.Parameters.Add("TDR_CODE", OracleDbType.Varchar2);
        UpdateCmd.Parameters.Add("GL_TYPE", OracleDbType.Varchar2);
        UpdateCmd.Parameters.Add("GL_ACCNO", OracleDbType.Varchar2);
        
        UpdateCmd.Parameters["TDR_CODE"].Value = item.TDRCode;
        UpdateCmd.Parameters["GL_TYPE"].Value = item.GLType;
        UpdateCmd.Parameters["GL_ACCNO"].Value = item.GLAccNo;

        UpdateCmd.ExecuteNonQuery();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.