2014-04-05 86 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應用程序池重新啓動已達到可以讓會議空的另一種東西是「限制」

是一個很好的做法檢查會話(值)是否爲零之前是空的