1. 程式人生 > >C# 用資料庫讀取Excel出現“定義了過多欄位”錯誤的解決方法

C# 用資料庫讀取Excel出現“定義了過多欄位”錯誤的解決方法

       在寫一段讀excel的程式時經常出現“定義了過多欄位”的錯誤提示。找了好久原因終於知道是怎麼回事了,記錄下來以作備忘。

 下面是提示錯誤的程式程式碼:      

         #region //ReferenceTable窗體FormLoad事件
        private void ReferenceTable_Load(object sender, EventArgs e)
        {
            try
            {
                string strODBCCon = @"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=.\ReferenceTable\K_ReferenceTable.xls;Extended Properties=Excel 8.0";
                OleDbConnection OleDB = new OleDbConnection(strODBCCon);
                OleDbDataAdapter OleDat = new OleDbDataAdapter("select * from 

[K_rt$]", OleDB);
                DataTable dt = new DataTable();
                OleDat.Fill(dt);
                this._rtDataGridView.DataSource = dt.DefaultView;
            }
            catch (System.Exception ey)
            {
             MessageBox.Show(ey.Message);
            }
        }
        #endregion

標紅的行是指定讀取excel檔案的“K_rt”表格,這個表格用excel編輯時可能插入過列。

原因:

Excel總列數是A-IV (255個單位長度),建立Excel時候,執行了插入操作,會使Excel長度超過255(但列數還是顯示A-IV),從而導致讀取時提示“定義了過多欄位”。用上面的查詢語句沒有限制K_rt$ 這張表的列數(程式在構造OleDbDataAdapter會載入所有的列數,包括空白列),這樣就超過了Excel長度域。

解決方法:

我的K_rt$表有效資料列最長只有10列(其他的是空白列),所以查詢條件我就限定在A-K列,如:

OleDbDataAdapter OleDat = new OleDbDataAdapter("select * from[K_rt$A:K

]", OleDB);
,這樣就不會報”定義了過多的欄位”出錯。

插入行也應該會出現同樣的問題(目前我沒遇到過,純粹猜想,if(不慎猜對){純屬巧合;買彩票去;}),那麼限定行數和列數就可以避免此類問題