所以我在这里所做的是将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 但问题仍然发生。
我认为问题出在下面的 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();
}
}