none
關於UpdateCommand 的疑問 RRS feed

  • 問題


  • 疑問一:

    想請問各位, da.UpdateCommand = cmd;

    當我使用這串指令時,db會連接,並執行這串碼嗎?

    還是還需要跟他說些什麼事情,才能完整的執行更新的動作

    疑問二:

    當update執行完成,我是需要先更新datarow 還是 datatable 阿?

    謝謝各位 ~

    private string connStr = ConfigurationManager.ConnectionStrings["ConnSQL"].ToString(); private SqlDataAdapter da;

    DataSet ds = new DataSet("BoradDS");

    DataTable dt = new DataTable("BoradDT");

    void UpdateItem_Click(object sender, EventArgs e)

    { using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); string updateCmd = "update board set PArea=@PArea,PLength=@PLength,PWidth=@PWidth where PartNo='@PartNo'"; SqlCommand cmd = new SqlCommand(updateCmd, conn); cmd.Parameters.Add(new SqlParameter("@PartNo", SqlDbType.NVarChar)); cmd.Parameters.Add(new SqlParameter("@PArea", SqlDbType.Float)); cmd.Parameters.Add(new SqlParameter("@PLength", SqlDbType.Float)); cmd.Parameters.Add(new SqlParameter("@PWidth", SqlDbType.Float)); cmd.Parameters["@PartNo"].Value = txt_PartNo.Text; cmd.Parameters["@PArea"].Value = float.Parse(lb_Show_PArea.Text); cmd.Parameters["@PLength"].Value = txt_Length.Text; cmd.Parameters["@PWidth"].Value = txt_width.Text; da.UpdateCommand = cmd; DataRow dr = ds.Tables["BoradDT"].Rows.Find(txt_PartNo.Text); dr[1] = cmd.Parameters["@PArea"].Value; dr[2] = cmd.Parameters["@PLength"].Value; dr[3] = cmd.Parameters["@PWidth"].Value; } MessageBox.Show("儲存成功"); CloseUpdateItem(); DefaultString(); textEnableOpen(); }


    2012年7月16日 上午 07:10

解答

  • 1. 你不用特別用 GetChanges(),因為 DataAdapter 自己會做這件事。

    2. 請檢查你的 UpdateCommand 的 SQL 有沒有寫錯,以及值是否有確實給定。

    3. 注音文沒事最好不要用。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 Louis Seven 2012年7月18日 上午 03:23
    2012年7月18日 上午 02:38
    版主

所有回覆

  • 1.

    DataAdapter.UpdateCommand 會在偵測到 DataRowState.Modified 時才觸發,所以如果 DataRow 的 State 都不是 Modified 的話,它就不會被叫用。

    但對程式來說,只要呼叫 DataAdapter.Update() 就可以了,剩下的 DataAdapter 會做掉。

    2. 

    Update 完成後所有改過的資料都會寫到資料庫,所以我不知道你問的是什麼 ...


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年7月16日 上午 07:33
    版主
  • 回覆小朱~

                           因為我直接使用 da.UpdateCommand = cmd; 這段時 ~ 資料庫並沒有更新,所以我想詢問我到底少了什麼?

    關於疑問二: ,因為我無法更新資料庫, 所以我並不知道,我更新後是否是產生新的DataRow而產生的疑問~

    2012年7月16日 上午 07:46
  • 1. da.UpdateCommand 只是指示 DataAdapter 使用指定的 UpdateCommand 來做 DataRowState.Modified 這一列的更新,你都沒呼叫 DataAdapter.Update(),會有用才有鬼啦 ...

    2. 呼叫 Update() 後,只會依照 DataRowState 的值來決定要呼叫哪個 Command (InsertCommand/UpdateCommand/DeleteCommand),不會新增,修改或刪除掉目前在 DataTable 中的 DataRow... 所以我還是不知道你問的是什麼。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年7月16日 上午 08:53
    版主
  • 好好把這讀一讀 [ADO.NET] , 我在不懂的時期也都是讀這個.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月16日 上午 09:13
    版主
  • DataAdapter.Update 要搭配 xxxCommandBuilder,例如你這篇應該要配 SqlCommandBuilder ... 你有配上去用嗎?

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月16日 下午 03:20
  • 抱歉.我並沒有使用你說的CommandBuilder , 我以為直接使用

    da.InsertCommand = cmd;

    就可以更新資料庫,而在使用

     da.Update(dt);

    去更新DataTable .....因為我新增是正常的,所以才會對update 有所疑問 ~~

    using (SqlConnection conn = new SqlConnection(connStr))
                    {
                        conn.Open();
                        string insertCmd = "insert into board(PartNo,PArea,PLength,PWidth)values(@PartNo,@PArea,@PLength,@PWidth)";
                        SqlCommand cmd = new SqlCommand(insertCmd, conn);
                        cmd.Parameters.Add(new SqlParameter("@PartNo", SqlDbType.NVarChar));
                        cmd.Parameters.Add(new SqlParameter("@PArea", SqlDbType.Float));
                        cmd.Parameters.Add(new SqlParameter("@PLength", SqlDbType.Float));
                        cmd.Parameters.Add(new SqlParameter("@PWidth", SqlDbType.Float));
                        cmd.Parameters["@PartNo"].Value = txt_PartNo.Text;
                        cmd.Parameters["@PArea"].Value = lb_Show_PArea.Text;
                        cmd.Parameters["@PLength"].Value = txt_Length.Text;
                        cmd.Parameters["@PWidth"].Value = txt_width.Text;
                       
                        da.InsertCommand = cmd;
    
                        DataRow dr = ds.Tables["BoradDT"].NewRow();
                        dr["PartNo"] = cmd.Parameters["@PartNo"].Value;
                        dr["PArea"] = cmd.Parameters["@PArea"].Value;
                        dr["PLength"] = cmd.Parameters["@PLength"].Value;
                        dr["PWidth"] = cmd.Parameters["@PWidth"].Value;
                        ds.Tables["BoradDT"].Rows.Add(dr);
                        da.Update(dt);
    
                    }

    2012年7月17日 上午 03:23
  • 我前面就講過了... DataRowState 是 Modified 時才會觸發 UpdateCommand 的動作...

    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年7月17日 上午 03:49
    版主
  • 你貼的程式碼沒有先 SELECT 任何東西給 da ,為啥 da 內會有 Tables ?

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月17日 下午 12:49
  • sorry ~ 心冷 

    這是一開始的select的動作 ~

            SqlDataAdapter da;
            DataSet ds = new DataSet("BoradDS");
            DataTable dt = new DataTable("BoradDT");
    
             private void ProductDB_Load(object sender, EventArgs e)
            {
                Navigator();
                mainDataGridView();
            }
            private void mainDataGridView()
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {                
                    string selectCmd = "select PartNo ,PArea ,PLength,PWidth,Create_Date  from board order by Create_Date desc ";
                    da = new SqlDataAdapter(selectCmd, conn);
    
                    ds.Tables.Add(dt);
                    DataColumn dcPartNo = dt.Columns.Add("PartNo", typeof(string));
                    DataColumn dcPArea = dt.Columns.Add("PArea", typeof(float));
                    dt.PrimaryKey = new DataColumn[] { dcPartNo };
                    da.Fill(dt);
                    dataGridView1.DataSource = dt;
    
    
                    dataGridView1.Columns[0].HeaderText = "物料名稱";
                    dataGridView1.Columns[1].HeaderText = "片面積";
                    dataGridView1.Columns[2].HeaderText = "長";
                    dataGridView1.Columns[3].HeaderText = "寬";
                    dataGridView1.Columns[4].HeaderText = "建立時間";
                   
                    dataGridView1.Columns[0].Width = 150;
                    dataGridView1.Columns[1].Width = 70;
                    dataGridView1.Columns[2].Width = 70;
                    dataGridView1.Columns[3].Width = 120;
                    dataGridView1.Columns[4].Width = 120;
    
                    //dataGridView1.Columns[4].Width = 60;
                    //dataGridView1.Columns[5].Width = 60;
                }
            }
            #endregion


    2012年7月18日 上午 01:52
  • 若是說 ~ 讓dataset知道改變了就會執行 ~ updateCommand 

    可是卻會發生 並行違規: UpdateCommand 已經影響必須是 1 記錄的 0。 ~ 是什麼原因ㄋ ???

        DataRow dr = ds.Tables["BoradDT"].Rows.Find(txt_PartNo.Text);
                    dr[1] = cmd.Parameters["@PArea"].Value;
                    dr[2] = cmd.Parameters["@PLength"].Value;
                    dr[3] = cmd.Parameters["@PWidth"].Value;
                    dr[4] = DateTime.Now;
    
                    ds= ds.GetChanges(DataRowState.Modified);
                    da.UpdateCommand = cmd;
                    da.Update(dt);


    2012年7月18日 上午 02:24
  • 1. 你不用特別用 GetChanges(),因為 DataAdapter 自己會做這件事。

    2. 請檢查你的 UpdateCommand 的 SQL 有沒有寫錯,以及值是否有確實給定。

    3. 注音文沒事最好不要用。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 Louis Seven 2012年7月18日 上午 03:23
    2012年7月18日 上午 02:38
    版主
  • 謝謝小朱的提示 ~

    1.我理解了你說的DataRowState 是 Modified 時才會觸發 UpdateCommand 的動作. 我見到DataRow改變時,State從原本的Unchanged變為Modified 

      才去執行了UpdateCommand

     DataRow dr = ds.Tables["BoradDT"].Rows.Find(txt_PartNo.Text);
                    dr[1] = cmd.Parameters["@PArea"].Value;
                    dr[2] = cmd.Parameters["@PLength"].Value;
                    dr[3] = cmd.Parameters["@PWidth"].Value;
                    dr[4] = DateTime.Now;
    
                    da.UpdateCommand = cmd;

    2.至於UpdateCommand 的 SQL 有沒有寫錯,我把原本PartNo = @PartNo的' ' 拿掉就可以了,不過不拿掉分號,我直接去sql測試去執行是沒問題的,真是....

    "update board set PArea=@PArea,PLength=@PLength,PWidth=@PWidth where PartNo=@PartNo";


     

    2012年7月18日 上午 03:23
  • 抱歉我想再請教一下 ~  當我改成讀取access的時候 ~

    以新增的指令來說,沒有任何反應,也沒有任何錯誤 ~

    想請教各位在access時候,有什麼東西需要注意的嗎???

            OleDbDataAdapter da;
            DataSet ds = new DataSet("BoradDS");
            DataTable dt = new DataTable("BoradDT");

    void AddItem_Click(object sender, EventArgs e) { using(OleDbConnection conn = new OleDbConnection(connStr)) {

    string insertCmd = "INSERT INTO board(PartNo,PArea,b_length,b_width)VALUES(@PartNo,@PArea,@b_length,@b_width)"; OleDbCommand cmd = new OleDbCommand(insertCmd, conn); cmd.Parameters.Add(new OleDbParameter("@PartNo", OleDbType.VarChar)); cmd.Parameters.Add(new OleDbParameter("@PArea", OleDbType.VarChar)); cmd.Parameters.Add(new OleDbParameter("@b_length", OleDbType.VarChar)); cmd.Parameters.Add(new OleDbParameter("@b_width", OleDbType.VarChar)); cmd.Parameters["@PartNo"].Value = txt_PartNo.Text; cmd.Parameters["@PArea"].Value = lb_Show_PArea.Text; cmd.Parameters["@b_length"].Value = txt_Length.Text; cmd.Parameters["@b_width"].Value = txt_width.Text; DataRow dr = ds.Tables["BoradDT"].NewRow(); dr["PartNo"] = cmd.Parameters["@PartNo"].Value; dr["PArea"] = cmd.Parameters["@PArea"].Value; dr["b_length"] = cmd.Parameters["@b_length"].Value; dr["b_width"] = cmd.Parameters["@b_width"].Value; ds.Tables["BoradDT"].Rows.Add(dr); da.InsertCommand = cmd; da.Update(dt); } }




    2012年7月18日 上午 07:05
  • 如果依你的寫法,只要呼叫 cmd.ExecuteNonQuery() 就好了,根本用不到 DataAdapter........

    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年7月18日 上午 07:23
    版主
  • 請問小朱~

            是哪邊的程式碼讓你覺得不須用到DataAdapter?  可否說明 ~

            還是哪邊的碼有多餘的部分,可否告知 讓我改進 ~ 謝謝 

    2012年7月18日 上午 08:10
  • 簡單的說就是,如果資料作業不需要用到 DataTable/DataSet 的話,可以不需要用到 DataAdapter...

    例如插入/更新單筆資料。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年7月18日 上午 08:39
    版主
  • 你是單指select的部分嗎? 如果是的話~

    的確使用DataAdapter是真的不需要了~~ 

    2012年7月18日 上午 08:46
  • 我在Access裡面測試  string insertCmd = "INSERT INTO board(PartNo,PArea,b_length,b_width)VALUES('test','111','22','23')"; 是沒有問題的

    好像是因為 ' ' 的關西 ~

    可是這樣的話 string insertCmd = "INSERT INTO board(PartNo,PArea,b_length,b_width)VALUES(@PartNo,@PArea,@b_length,@b_width)";

    我應該是要如何加?

    2012年7月18日 上午 09:13
  • Oledb 支援 ? ,不用 @

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月18日 下午 03:01
  • 不好意思,請問你的意思是改成這樣的方式嗎???

      string insertCmd = "INSERT INTO [board](PartNo,PArea,b_length,b_width)VALUES(?,?,?,?)";
                        OleDbCommand cmd = new OleDbCommand(insertCmd, conn);
                        cmd.Parameters.Add(new OleDbParameter("?PartNo", OleDbType.Char));
                        cmd.Parameters.Add(new OleDbParameter("?PArea", OleDbType.VarChar));
                        cmd.Parameters.Add(new OleDbParameter("?b_length", OleDbType.VarChar));
                        cmd.Parameters.Add(new OleDbParameter("?b_width", OleDbType.VarChar));
    
                        cmd.Parameters["?PartNo"].Value = txt_PartNo.Text;
                        cmd.Parameters["?PArea"].Value = lb_Show_PArea.Text;
                        cmd.Parameters["?b_length"].Value = txt_Length.Text;
                        cmd.Parameters["?b_width"].Value = txt_width.Text;
    
    
                        DataRow dr = ds.Tables["BoradDT"].NewRow();
                        dr["PartNo"] = cmd.Parameters["?PartNo"].Value;
                        dr["PArea"] = cmd.Parameters["?PArea"].Value;
                        dr["b_length"] = cmd.Parameters["?b_length"].Value;
                        dr["b_width"] = cmd.Parameters["?b_width"].Value;
    
                        ds.Tables["BoradDT"].Rows.Add(dr);
                        da.InsertCommand = cmd;
                        da.Update(dt);

    2012年7月19日 下午 12:52
  • 你看過線上手冊的備註嗎?

    備註

    CommandType 屬性設定為
    StoredProcedure 時,應將 CommandType
    屬性設定為預存程序的名稱。如果預存程序的名稱包含任何特殊字元,則使用者可能需要使用逸出字元語法。當您呼叫其中一個 Execute
    方法時,命令會執行這個預存程序。

    CommandType 設定為 TableDirect 時,則應該將 CommandType
    屬性設定為要存取之一個或多個資料表的名稱。如果任何具名的資料表包含任何的特殊字元,則使用者可能需要使用逸出字元語法。當您呼叫其中一個 Execute
    方法時,將傳回一個或多個具名資料表的所有資料列和資料行。

    如果目前的連接正在進行執行或擷取作業,則無法設定 ConnectionCommandTypeCommandText 屬性。

    CommandType 設定為 Text 時,OLE
    DB.NET Provider 不支援將參數傳遞至由 OleDbCommand 所呼叫之 SQL
    陳述式或預存程序的具名參數。在這種狀況下,必須使用問號 (?) 替代符號。例如:

    SELECT * FROM Customers WHERE CustomerID = ?

    因此,OleDbParameter 物件加入至
    OleDbParameterCollection
    的順序必須直接對應至參數之問號替代符號的位置。

    如需詳細資訊,請參閱<mshelp:link keywords="537d8a2c-d40b-4000-83eb-bc1fcc93f707" tabIndex="0">設定參數和參數資料型別
    (ADO.NET)</mshelp:link>


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月19日 下午 03:52
  • 原來如此 ~ 不過有個疑問 當我改變參數後 , DataRowState 則一直是Unchanged 而不會 Modified ,是因為什麼原因?

                        string insertCmd = "INSERT INTO [board](PartNo,PArea,b_length,b_width)VALUES(?,?,?,?)";
                        OleDbCommand cmd = new OleDbCommand(insertCmd, conn);
                        cmd.Parameters.Add(new OleDbParameter("PartNo", OleDbType.Char, 15));
                        cmd.Parameters.Add(new OleDbParameter("PArea", OleDbType.VarChar, 50));
                        cmd.Parameters.Add(new OleDbParameter("b_length", OleDbType.VarChar, 50));
                        cmd.Parameters.Add(new OleDbParameter("b_width", OleDbType.VarChar, 50));
                        cmd.Parameters[0].Value = txt_PartNo.Text;
                        cmd.Parameters[1].Value = lb_Show_PArea.Text;
                        cmd.Parameters[2].Value = txt_Length.Text;
                        cmd.Parameters[3].Value = txt_width.Text;
                       
                        DataRow dr = ds.Tables["BoradDT"].NewRow();
                        dr[0] = cmd.Parameters[0].Value;
                        dr[1] = cmd.Parameters[1].Value;
                        dr[4] = cmd.Parameters[2].Value;
                        dr[5] = cmd.Parameters[3].Value;
                        
                        ds.Tables["BoradDT"].Rows.Add(dr);
                        da.InsertCommand = cmd;
                        da.Update(dt);

    原本使用sql語法時,此行程式碼State會改變, 改成ole後state沒有動靜...原因是???

     DataRow dr = ds.Tables["BoradDT"].NewRow();

     

    2012年7月20日 上午 03:55
  • 請將下列文件讀完 ...

    http://msdn.microsoft.com/zh-tw/library/system.data.datarowstate(VS.80).aspx

    http://msdn.microsoft.com/zh-tw/library/system.data.common.dbdataadapter.insertcommand(VS.80).aspx

    http://msdn.microsoft.com/zh-tw/library/system.data.common.dbdataadapter.updatecommand(VS.80).aspx

    http://msdn.microsoft.com/zh-tw/library/system.data.common.dbdataadapter.deletecommand(VS.80).aspxhttp://www.dotblogs.com.tw/puma/archive/2008/06/19/4339.aspx

    http://www.cnblogs.com/super02/archive/2011/08/29/2157342.html


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年7月20日 上午 04:32
    版主
  • 我以前除了讀 MSDN 文件庫中所有關於 ADO.NET 的章節內容外, 另外還讀了這本書 [Programming Microsoft ADO.NET 2.0 Applications: Advanced Topics], 大概來來回回讀了幾次後, 大致上有點瞭解 ADO.NET.

    也許你可以去天瓏書局網站查查看有沒有專門討論 ADO.NET 的書籍, 找個一本回來讀幾遍, 輔以 MSDN 文件庫的 ADO.NET 章節, 應該會對原理的瞭解會更深入.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年7月20日 上午 04:46
    版主
  • 抱歉各位前輩 ~

                         是否可直接指正哪邊有觀念錯誤的地方? 讓我可以直接改善 ~ 謝謝

               

    2012年7月20日 上午 07:14
  • 您好,

    是不是因為您沒把dataRow加入到DataTable的Rows裡呢!

    請參考一下以下的Code及圖示。

    private void button1_Click(object sender, EventArgs e)
    {
    	DataSet ds = new DataSet();
    	DataTable dt = new DataTable("BoradDT");
    	ds.Tables.Add(dt);
    	dt.Columns.Add("c1", typeof(string));
    	DataRow dr = ds.Tables["BoradDT"].NewRow();
    	dt.Rows.Add(dr);
    }

    Other Info:http://social.msdn.microsoft.com/Forums/zh-TW/visualcshartzhchs/thread/8c92e923-72b7-48ad-9ee0-898712fffa7c#89119384-7cdc-4367-bc00-e937c03798f2

    http://msdn.microsoft.com/zh-tw/library/system.data.common.dataadapter.update(v=vs.80).aspx


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已編輯 亂馬客 2012年7月20日 上午 07:33
    2012年7月20日 上午 07:30
  • 回覆亂馬~

                  我的確有把dataRow加入到DataTable的Rows裡面 ~

                  首先: 我先使用select 建立我所要的Data Table,讓Data Table有存在資料

                   第二: 我在這個Data Table新增資料,但我實在不明白,在sql語法Try我這樣寫沒有問題

                         改成Ole後,反而不能使用,不知道是哪邊觀念錯誤,還是哪邊不應該這樣使用? 謝謝各位前輩的指導

                   

                              
      using (OleDbConnection conn = new OleDbConnection(connStr))
                {
                    string selectCmd = "select PartNo ,PArea ,User_Name,Data,b_length,b_width  from board order by Data desc ";
                    da = new OleDbDataAdapter(selectCmd, conn);
                    OleDbCommand cmd = new OleDbCommand("select PartNo ,PArea ,User_Name,Data,b_length,b_width  from board order by Data desc ",conn);
                    ds.Tables.Add(dt);
                    DataColumn dcPartNo = dt.Columns.Add("PartNo", typeof(string));
                    DataColumn dcPArea = dt.Columns.Add("PArea", typeof(string));
                    dt.PrimaryKey = new DataColumn[] { dcPartNo };
                    da.Fill(dt);
                    dataGridView1.DataSource = dt;
    
                    dataGridView1.Columns[0].HeaderText = "物料名稱";
                    dataGridView1.Columns[1].HeaderText = "片面積";
                    dataGridView1.Columns[2].HeaderText = "使用者";
                    dataGridView1.Columns[3].HeaderText = "建立時間";
                    dataGridView1.Columns[4].HeaderText = "長";
                    dataGridView1.Columns[5].HeaderText = "寬";
                    dataGridView1.Columns[0].Width = 150;
                    dataGridView1.Columns[1].Width = 70;
                    dataGridView1.Columns[2].Width = 70;
                    dataGridView1.Columns[3].Width = 120;
                    dataGridView1.Columns[4].Width = 60;
                    dataGridView1.Columns[5].Width = 60;
                }

    OleDbCommand cmd = new OleDbCommand("INSERT INTO [board](PartNo,PArea,b_length,b_width)VALUES(?,?,?,?)", conn); cmd.Parameters.Add(new OleDbParameter("PartNo", OleDbType.Char, 15, "PartNo")); cmd.Parameters.Add(new OleDbParameter("PArea", OleDbType.VarChar, 50, "PArea")); cmd.Parameters.Add(new OleDbParameter("b_length", OleDbType.VarChar, 50, "b_length")); cmd.Parameters.Add(new OleDbParameter("b_width", OleDbType.VarChar, 50, "b_width")); cmd.Parameters[0].Value = txt_PartNo.Text; cmd.Parameters[1].Value = lb_Show_PArea.Text; cmd.Parameters[2].Value = txt_Length.Text; cmd.Parameters[3].Value = txt_width.Text; da.InsertCommand = cmd; DataRow dr = ds.Tables["BoradDT"].NewRow(); dr["PartNo"] = cmd.Parameters[0].Value; dr["PArea"] = cmd.Parameters[1].Value; dr["b_length"] = cmd.Parameters[2].Value; dr["b_width"] = cmd.Parameters[3].Value; ds.Tables["BoradDT"].Rows.Add(dr);

                     dt.Rows.Add(dr); 上面應該是你所說的程式碼吧 ?

    da.Update(dt);


    2012年7月20日 上午 08:03
  • 您好,

    請問將dr加入dt後,dt中該筆資料的RowState是Added吧!

    如果您的Select SQL中有包含PK的話,那Insert的Script您就不用指定,使用OleDbCommandBuilder來幫您產生就可以了!
    請看一下,下面 OleDbCommandBuilder 的部份,謝謝!

    using (OleDbConnection conn = new OleDbConnection(connStr))
    {
    	string selectCmd = "select PartNo ,PArea ,User_Name,Data,b_length,b_width  from board order by Data desc ";
    	da = new OleDbDataAdapter(selectCmd, conn);
    	OleDbCommand cmd = new OleDbCommand("select PartNo ,PArea ,User_Name,Data,b_length,b_width  from board order by Data desc ",conn);
    	ds.Tables.Add(dt);
    	DataColumn dcPartNo = dt.Columns.Add("PartNo", typeof(string));
    	DataColumn dcPArea = dt.Columns.Add("PArea", typeof(string));
    	dt.PrimaryKey = new DataColumn[] { dcPartNo };
    	da.Fill(dt);
    	dataGridView1.DataSource = dt;
    
    	dataGridView1.Columns[0].HeaderText = "物料名稱";
    	dataGridView1.Columns[1].HeaderText = "片面積";
    	dataGridView1.Columns[2].HeaderText = "使用者";
    	dataGridView1.Columns[3].HeaderText = "建立時間";
    	dataGridView1.Columns[4].HeaderText = "長";
    	dataGridView1.Columns[5].HeaderText = "寬";
    	dataGridView1.Columns[0].Width = 150;
    	dataGridView1.Columns[1].Width = 70;
    	dataGridView1.Columns[2].Width = 70;
    	dataGridView1.Columns[3].Width = 120;
    	dataGridView1.Columns[4].Width = 60;
    	dataGridView1.Columns[5].Width = 60;
    }
    //請注意這裡..........................
    //如果您要使用DataAdapter去更新的話,不用指定Command,使用OleDbCommandBuilder來幫您產生就可以了
    cmdBuilder = new OleDbCommandBuilder(da);
    cmdBuilder.ConflictOption = ConflictOption.OverwriteChanges;
    
    DataRow dr = ds.Tables["BoradDT"].NewRow();
    dr["PartNo"] = txt_PartNo.Text;
    dr["PArea"] = lb_Show_PArea.Text;
    dr["b_length"] = txt_Length.Text;
    dr["b_width"] = txt_width.Text;
    ds.Tables["BoradDT"].Rows.Add(dr);
    da.Update(dt);	
    
    


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年7月20日 上午 08:54
  • 你的型別都是 varchar ?  長, 寬,  面積這些欄位在 Access 中建立時欄位型別是文字, 還是數字 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月20日 下午 12:18
    版主
  • 回應Bill ~

    是文字字串

    2012年7月20日 下午 12:26