none
Access資料載入到DataGridView後修改回存至Access RRS feed

  • 問題

  •   //Access資料載入到DataGridView後修改回存至Access
      OleDbDataAdapter openODA;
      DataSet openDS;
      OleDbConnection openConn;
      OleDbCommandBuilder cmdBuilder;
      private void Form1_Load(object sender, EventArgs e)
      {
        openConn = new OleDbConnection(connectString);
        openConn.Open();
        openODA = new OleDbDataAdapter("select * from company", openConn);
        openDS = new DataSet();
        cmdBuilder = new OleDbCommandBuilder(openODA);
        openODA.Fill(openDS, "mydata");
        dgv1.DataSource = openDS.Tables["mydata"];
        dgv1.ShowRowErrors = true;
      }
      private void button2_Click(object sender, EventArgs e)
      {
        openODA.Update(openDS.Tables["mydata"]);
      }
        載入欄位一共有5個
        第一個為自動編號我把它隱藏起來
        第二個為bool/false
        第三,四個為文字
        第五個為數字
       
        只要我修改第二,三,四欄的資料按button2_Click,Access就會自動更新資料庫
        但只要我修改第五欄資料或是新增一筆記錄的話,按button2_Click即會報錯說INSERT INTO陣述式的語法錯誤
        是否是我原始的Access欄位為數字,而他自動產生的INSERT INTO(UPDATE)語法用文字型態插入,所以報錯?
        請問該如何處理?
       
        還有就是在dgv1_CellValidating事件中有做驗証其中有一句語法
        dgv1.Rows[e.RowIndex].ErrorText = "規格不符合";
        //但是無效果出現請教該如處理
    2010年5月16日 下午 12:49

解答

  • INSERT INTO company (Account, ID_Name, cmt_flag, count) VALUES (?, ?, ?, ?)

    先換個欄名試試。

    Count 是保留字,應該要用 [count] 才不會誤判。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 kuoma 2010年5月17日 上午 10:58
    2010年5月16日 下午 03:42
  • Hi,

    參閱

    DataGridViewRow.ErrorText Property

    http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewrow.errortext.aspx

    裡面有提到可用的平台,摘錄如下:

      Platforms

    Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

     

    另外我試驗以下程式是可以有效果的,不知您是怎樣使用,焦點有移開該儲存格嗎?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          DataTable dt = new DataTable();
          dt.Columns.Add("C1");
          dt.Rows.Add(dt.NewRow());
          dataGridView1.DataSource = dt;
        }
    
    
        private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
          dataGridView1.Rows[e.RowIndex].ErrorText = "規格不符合";
        }
      }
    }


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 kuoma 2010年5月17日 上午 10:58
    2010年5月17日 上午 04:37

所有回覆

  • Hi,

    自動產生的INSERT INTO(UPDATE)語法可以貼出來看看嗎?


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年5月16日 下午 01:15
  • DELETE FROM company WHERE ((number = ?) AND ((? = 1 AND Account IS NULL) OR (Account = ?)) AND ((? = 1 AND ID_Name IS NULL) OR (ID_Name = ?)) AND ((? = 1 AND cmt_flag IS NULL) OR (cmt_flag = ?)) AND ((? = 1 AND count IS NULL) OR (count = ?)))


    UPDATE company SET Account = ?, ID_Name = ?, cmt_flag = ?, count = ? WHERE ((number = ?) AND ((? = 1 AND Account IS NULL) OR (Account = ?)) AND ((? = 1 AND ID_Name IS NULL) OR (ID_Name = ?)) AND ((? = 1 AND cmt_flag IS NULL) OR (cmt_flag = ?)) AND ((? = 1 AND count IS NULL) OR (count = ?)))


    INSERT INTO company (Account, ID_Name, cmt_flag, count) VALUES (?, ?, ?, ?)

    以上三句程式自動產生的。

    Console.WriteLine(cmdBuilder.GetDeleteCommand().CommandText);
    Console.WriteLine(cmdBuilder.GetUpdateCommand().CommandText);
    Console.WriteLine(cmdBuilder.GetInsertCommand().CommandText);

    2010年5月16日 下午 01:26
  • 跟你確認一下,該資料表有沒有設定PK呢?在使用像是command builder這類自動產生SQL語法的東西時,要記得幫資料表設定PK


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    2010年5月16日 下午 03:05
  • 看看這篇是不是相同原因:

    http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1752.entry


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年5月16日 下午 03:25
  • 該資料表有沒有設定PK呢

    是指原始mdb檔案是否有主鍵是嗎(有的)?或是在c#程式碼裡面指定?

    我傳一個範本好了,跟我目前大致的情況差不多,就是修改數字會出錯。

    http://www.mediafire.com/download.php?ymzlyionmm5

     

    心冷熱情熄 大大:看起來不像這問題。

    2010年5月16日 下午 03:30
  • INSERT INTO company (Account, ID_Name, cmt_flag, count) VALUES (?, ?, ?, ?)

    先換個欄名試試。

    Count 是保留字,應該要用 [count] 才不會誤判。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 kuoma 2010年5月17日 上午 10:58
    2010年5月16日 下午 03:42
  • 竟然出在一個基本的問題,忘了保留字!!

    那再請教此句為何不起作用?我的系統是xp有差嗎?

    dgv1.Rows[e.RowIndex].ErrorText = "規格不符合";

    2010年5月16日 下午 04:06
  • Hi,

    參閱

    DataGridViewRow.ErrorText Property

    http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewrow.errortext.aspx

    裡面有提到可用的平台,摘錄如下:

      Platforms

    Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

     

    另外我試驗以下程式是可以有效果的,不知您是怎樣使用,焦點有移開該儲存格嗎?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          DataTable dt = new DataTable();
          dt.Columns.Add("C1");
          dt.Rows.Add(dt.NewRow());
          dataGridView1.DataSource = dt;
        }
    
    
        private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
          dataGridView1.Rows[e.RowIndex].ErrorText = "規格不符合";
        }
      }
    }


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 kuoma 2010年5月17日 上午 10:58
    2010年5月17日 上午 04:37
  • 感謝各位大大問題解決了,較晚回應抱歉了。

    2010年5月17日 上午 10:59
  • 可否再請教問題?

    private void btnUpdate_Click(object sender, EventArgs e)
    {
         openODA.Update(openDS.Tables["company"]);//更新畫面資料回存至access
    }
    //拉了個鍵,但新增資料的時候是ok的,但想在新增資料上再修改再次點擊即會發生例外

    DBConCurrencyException
    並行違規: UpdateCommand 已經影響必須是 1 記錄的 0。
    請教這個問題怎解決呢?

    載入欄位一共有5個
        第一個為自動編號我把它隱藏起來//主鎖引鍵
        第二個為bool/false
        第三,四個為文字
        第五個為數字

     

    2010年5月18日 上午 03:04
  • Hi,

    參閱既有討論

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/d40cf28d-3f0d-4300-b21e-acb174bfd10e


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年5月18日 上午 04:59