2014-04-05 85 views
0

我正在尝试使用CommandBuilder进行更新。当获取数据的代码被按钮命令获取时,代码完美工作,但是当我从page_load获取数据时,更新失败。sqlCommandBuilder更新不能按预期工作

该程序只是从数据库中提取数据,然后使用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; 
    } 
} 
+0

什么不正确?你调试了你的代码吗?你得到任何异常或错误信息? Plesae更具体..你可以阅读[FAQ],[问]和[帮助]并请使用参数化查询。这种字符串连接对于SQL注入攻击是开放的。 –

回答

0

你错过了一个检查Page.IsPostBack

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

没有

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

} 

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

+0

是的,我做过史蒂夫。我不能相信我错过了这一点。我显然是在想这个。非常感谢。 – user3479022

+0

很高兴能有所帮助。我希望记住你(作为新用户),如果你发现下面的一个或多个答案有用,你可以对他们进行提拔,并选择一个作为接受的答案。请参阅http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Steve

0

fisrt的所有调试你的源代码。

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

也可以将它用于try catch块中的调试purpouse。

当您可以了解错误发生的位置时,您可以检查并解决问题。

您收到哪种类型的错误?

您认为用户总是在session.Take小心,ASPNET使用自定义的方法来回收会话,因为IIS应用程序池重新启动已达到可以让会议空的另一种东西是“限制”

是一个很好的做法检查会话(值)是否为零之前是空的