2014-09-19 89 views
0

我正在用文本框中的新數據更新數據集行,然後嘗試將其更新到我的數據庫。我不斷收到此錯誤:更新命令和C#

Update requires a valid UpdateCommand when passed DataRow collection with modified rows.

我該如何解決這個錯誤?

這裏是我的代碼:

protected void Save_Butt_Click(object sender, EventArgs e) { 
    OleDbConnection connect = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/PizzaOrders.mdb;Persist Security Info=True"); 
    //set up connection string 
    OleDbCommand command = new OleDbCommand("SELECT [title], [gname], [sname], [address], [suburb], [postcode], [dayphone], [email] FROM [users] WHERE ([username] = @username)", connect); 
    OleDbParameter param0 = new OleDbParameter("@username", OleDbType.VarChar); 

    param0.Value = HttpContext.Current.User.Identity.Name; 
    command.Parameters.Add(param0); 

    connect.Open(); 

    OleDbDataAdapter da = new OleDbDataAdapter(command); 
    DataSet dset = new DataSet(); 

    da.Fill(dset); 

    dset.Tables[0].Rows[0]["title"] = Title_DDL.Text; 
    dset.Tables[0].Rows[0]["gname"] = Fname_txt.Text; 
    dset.Tables[0].Rows[0]["sname"] = LN_txt.Text; 
    dset.Tables[0].Rows[0]["address"] = Address_txt.Text; 
    dset.Tables[0].Rows[0]["suburb"] = suburb_txt.Text; 
    dset.Tables[0].Rows[0]["postcode"] = Postcode_txt.Text; 
    dset.Tables[0].Rows[0]["dayphone"] = Phone_txt.Text; 
    dset.Tables[0].Rows[0]["email"] = Email_txt.Text; 

    da.Update(dset); 
} 
+3

DataAdapter doens't不生成SQL命令來操縱您的數據庫。您必須使用CommandBuilder來生成這些命令:http://msdn.microsoft.com/en-us/library/tf579hcz(v=vs.110).aspx – 2014-09-19 15:51:57

+0

更好的教程:http://csharp.net-informations .com/dataadapter/commandbuilder-sqlserver.htm – 2014-09-19 15:54:22

回答

0
OleDbConnection connect = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/PizzaOrders.mdb;Persist Security Info=True"); 

    connect.Open(); 
    //set up connection string 
    OleDbCommand command = new OleDbCommand("SELECT [ID], [title], [gname], [sname], [address], [suburb], [postcode], [dayphone], [email] FROM [users] WHERE ([username] = @username)", connect); 
    OleDbParameter param0 = new OleDbParameter("@username", OleDbType.VarChar); 

    param0.Value = HttpContext.Current.User.Identity.Name; 
    command.Parameters.Add(param0); 



    OleDbDataAdapter da = new OleDbDataAdapter(command); 
    DataSet dset = new DataSet(); 

    da.Fill(dset); 

    dset.Tables[0].Rows[0]["title"] = Title_DDL.Text; 
    dset.Tables[0].Rows[0]["gname"] = Fname_txt.Text; 
    dset.Tables[0].Rows[0]["sname"] = LN_txt.Text; 
    dset.Tables[0].Rows[0]["address"] = Address_txt.Text; 
    dset.Tables[0].Rows[0]["suburb"] = suburb_txt.Text; 
    dset.Tables[0].Rows[0]["postcode"] = Postcode_txt.Text; 
    dset.Tables[0].Rows[0]["dayphone"] = Phone_txt.Text; 
    dset.Tables[0].Rows[0]["email"] = Email_txt.Text; 

    OleDbCommandBuilder builder = new OleDbCommandBuilder(ad); 
      builder.QuotePrefix = "["; 
      builder.QuoteSuffix = "]"; 

    da.Update(dset); 

    connect.Close(); 

異常意味着你試圖更新沒有主鍵的表,因爲我在你的OleDbCommand中添加了字段[ÏD]。如果其他字段是您的主鍵更改ID與主鍵。 使用修改的行傳遞DataRow集合時,Update需要有效的UpdateCommand。

+0

你能解釋這是如何工作的嗎?我似乎無法得到這個工作... – user3684557 2014-09-19 16:16:43

+0

@ user3684557試試這個嗎? – mybirthname 2014-09-19 16:26:07

+0

對不起...還沒有工作。 http://pastebin.com/m2QqiwH0 – user3684557 2014-09-19 16:40:42

2

使用的OleDbcommandBuilder生成UpdateCommnand

OleDbDataAdapter da = new OleDbDataAdapter(command); 
OleDbCommandBuilder cb = new OleDbCommandBuilder(da); 

但是,你需要包括在SELECT命令的主鍵,以便更新命令的行更新。

+0

現在我得到...「OleDbCommand.Prepare方法要求所有可變長度參數都有明確設置的非零大小。」 – user3684557 2014-09-19 15:56:52

+0

因此,請將'@ username'參數的大小設置爲'username'列的大小。 – 2014-09-19 16:02:45

+0

OleDbParameter param0 = new OleDbParameter(「@ username」,OleDbType.VarChar,255);對?現在我沒有得到任何錯誤,但數據沒有在數據庫中更新。 – user3684557 2014-09-19 16:07:04

0

所以我找出了問題所在......一個小時後,我發現在按鈕單擊事件運行之前頁面正在被重新加載。因此,頁面會更新屏幕上的數據庫中未修改的文本,然後當它試圖對行進行更新時...它發現沒有任何字段被更改,因此它不修改數據。

URRRGH!太令人沮喪了...我知道這將是一個簡單的問題...我通過在頁面上放置「獲取詳細信息」按鈕來修復頁面,所以page_load事件不會覆蓋用戶輸入。 嘆息