【问题标题】:sqlCommandBuilder update not working as expectedsqlCommandBuilder 更新未按预期工作
【发布时间】:2014-04-05 09:40:40
【问题描述】:

我正在尝试使用 CommandBuilder 进行更新。当通过按钮命令检索获取数据的代码时,该代码运行良好,但是当我从 page_load 获取数据时,更新失败。

该程序只是从数据库中获取数据,然后使用 sqlCommandBuilder 对特定表进行更新。

我不知道发生了什么。

这是失败的代码。

  private Users users;

protected void Page_Load(object sender, EventArgs e)
{
    users = (Users)Session["Users"];

    string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
    SqlConnection connection = new SqlConnection(connectionString);
    string selectQuery = "Select * from Candidate where Candidate_ID = " + users.Candidate_ID;
    SqlDataAdapter dataAdapter = new SqlDataAdapter(selectQuery, connection);

    DataSet dataSet = new DataSet();
    dataAdapter.Fill(dataSet, "Candidates");
    ViewState["DATASET"] = dataSet;
    ViewState["SELECT_QUERY"] = selectQuery;

    if (dataSet.Tables["Candidates"].Rows.Count > 0)
    {
        DataRow dataRow = dataSet.Tables["Candidates"].Rows[0];


        txtLastName.Text = dataRow["LastName"].ToString();
        txtCity.Text = dataRow["City"].ToString();
        ddlGender.SelectedValue = dataRow["Gender"].ToString();
        lblStatus.Text = "";
    }
    else
    {
        lblStatus.ForeColor = System.Drawing.Color.Red;
        lblStatus.Text = "No record with ID = " + txtCandidateID.Text;
    }


}


protected void btnUpdate_Click(object sender, EventArgs e)
{
    string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);

    SqlDataAdapter dataAdapter = new SqlDataAdapter();
    dataAdapter.SelectCommand = new SqlCommand((string)ViewState["SELECT_QUERY"], con);
    SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter);

    DataSet ds = (DataSet)ViewState["DATASET"];

    DataRow dr = ds.Tables["Candidates"].Rows[0];

    dr["LastName"] = txtLastName.Text;
    dr["Gender"] = ddlGender.SelectedValue;
    dr["City"] = txtCity.Text;

    int rowsUpdated = dataAdapter.Update(ds, "Candidates");
    if (rowsUpdated == 0)
    {
        lblStatus.ForeColor = System.Drawing.Color.Red;
        lblStatus.Text = "No rows updated";
    }
    else
    {
        lblStatus.ForeColor = System.Drawing.Color.Green;
        lblStatus.Text = rowsUpdated.ToString() + " row(s) updated";
    }
}

这是完美运行的代码。

 protected void Page_Load(object sender, EventArgs e)
{


}


protected void btnUpdate_Click(object sender, EventArgs e)
{
    string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);

    SqlDataAdapter dataAdapter = new SqlDataAdapter();
    dataAdapter.SelectCommand = new SqlCommand((string)ViewState["SELECT_QUERY"], con);
    SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter);

    DataSet ds = (DataSet)ViewState["DATASET"];

    DataRow dr = ds.Tables["Candidates"].Rows[0];

    dr["LastName"] = txtLastName.Text;
    dr["Gender"] = ddlGender.SelectedValue;
    dr["City"] = txtCity.Text;

    int rowsUpdated = dataAdapter.Update(ds, "Candidates");
    if (rowsUpdated == 0)
    {
        lblStatus.ForeColor = System.Drawing.Color.Red;
        lblStatus.Text = "No rows updated";
    }
    else
    {
        lblStatus.ForeColor = System.Drawing.Color.Green;
        lblStatus.Text = rowsUpdated.ToString() + " row(s) updated";
    }
}




protected void btnFetchData_Click(object sender, EventArgs e)
{
    users = (Users)Session["Users"];

    string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
    SqlConnection connection = new SqlConnection(connectionString);
    string selectQuery = "Select * from Candidate where Candidate_ID = " + users.Candidate_ID;
    SqlDataAdapter dataAdapter = new SqlDataAdapter(selectQuery, connection);

    DataSet dataSet = new DataSet();
    dataAdapter.Fill(dataSet, "Candidates");
    ViewState["DATASET"] = dataSet;
    ViewState["SELECT_QUERY"] = selectQuery;

    if (dataSet.Tables["Candidates"].Rows.Count > 0)
    {
        DataRow dataRow = dataSet.Tables["Candidates"].Rows[0];


        txtLastName.Text = dataRow["LastName"].ToString();
        txtCity.Text = dataRow["City"].ToString();
        ddlGender.SelectedValue = dataRow["Gender"].ToString();
        lblStatus.Text = "";
    }
    else
    {
        lblStatus.ForeColor = System.Drawing.Color.Red;
        lblStatus.Text = "No record with ID = " + txtCandidateID.Text;
    }
}

【问题讨论】:

  • 什么不完全有效?你调试过你的代码吗?您收到任何异常或错误消息?请更具体。您可以阅读FAQHow to Askhelp center 并请使用参数化查询。这种字符串连接对 SQL 注入攻击开放。

标签: c# asp.net insert sqlcommandbuilder


【解决方案1】:

您是否错过了Page.IsPostBack 的支票?

请记住,在 ASP.NET 中,当您单击服务器按钮时,Page_Load 中的代码在按钮单击事件中的代码之前被调用。

没有

protected void Page_Load(object sender, EventArgs e)
{ 
     if(!Page.IsPostBack)
     {
         // load data
     }

}

重新加载 DATASET 的代码再次执行,当您在按钮单击事件中收到控件时,您的更改将丢失。

【讨论】:

  • 是的,我做了史蒂夫。我不敢相信我错过了。我显然是在想这个。非常感谢。
  • 很高兴能提供帮助。我希望记住您(作为新用户),如果您发现以下一个或多个有用的答案,您可以投票并选择一个作为接受的答案。见meta.stackexchange.com/questions/5234/…
【解决方案2】:

首先调试您的源代码。

在每一行上创建断点并检查哪些值存储在变量中。

还可以在 try catch 块中进行调试。

当您可以了解错误发生在哪里时,您可以检查以解决问题。

您收到哪种类型的错误?

您假设用户始终处于会话中的另一件事。注意 aspnet 使用自定义方法来回收会话,并且您可以让会话为空,因为重新启动 iis 应用程序池已达到“限制”

在进行强制转换之前检查会话(值)是否为空是一个很好的做法

【讨论】:

    猜你喜欢
    • 2019-05-28
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2016-11-17
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多