2014-03-18 30 views
2

出於某種原因,我無法打開有問題的MS Access表的設計視圖;我可以看數據但不是設計,具體而言,列的長度。我可以以編程方式確定(OLEDB)哪個列長度被超出?

當我嘗試插入記錄,說表驗證碼:

using (var conn = new OleDbConnection(connStr)) 
{ 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = 
      @"INSERT INTO tx_header (tx, site_no, xmlfile, collect_dttm, ccr_user, tx_memo, file_beg, file_end) 
       VALUES(@txval, @siteNum, @xmlfileName, Now(), @ccrUser, @TXMemo, @strfile_beg, @strfile_end)"; 
     cmd.CommandType = CommandType.Text; 
     cmd.Parameters.AddWithValue("@txval", tx); 
     cmd.Parameters.AddWithValue("@siteNum", site_no); 
     cmd.Parameters.AddWithValue("@xmlfileName", xmlfile); 
     cmd.Parameters.AddWithValue("@ccrUser", ccr_user); 
     cmd.Parameters.AddWithValue("@TXMemo", tx_memo); 
     cmd.Parameters.AddWithValue("@strfile_beg", file_beg); 
     cmd.Parameters.AddWithValue("@strfile_end", file_end); 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
} 

...我得到的,「System.Data.OleDb.OleDbException是由用戶代碼未處理 的HResult = -2147217833 消息=該字段是太小,無法接受數據的你試圖添加量。嘗試插入或粘貼更少的數據。 源= Microsoft Office Access數據庫引擎

而不是必須猜測其列有太多數據,它會b如果我能以編程方式確定哪一列是有問題的,那麼很好。我可以嗎?怎麼樣?

+1

您是否研究過通過標準ADO.NET路徑獲取模式信息?像IDataReader.GetSchemaTable方法一樣? – Crono

+0

我還必須問:爲什麼你必須動態獲取數據庫規範才能開始?如果您從一開始就知道數據庫字段類型,長度和約束條件,那麼您的代碼將更加健壯! :p – Crono

+0

@Crono:你說得對,但是,如前所述,當我用Access打開MDB文件時,它不允許我看到設計視圖;我不知道爲什麼。 –

回答

1

對於如何在MSDN中查詢底層架構信息有一個非常詳細的解釋,從Retrieving Database Schema Information開始。

聲明:我從來沒有嘗試過使用Access數據庫。

+0

謝謝;我會嘗試的時候喝一些滋補水。 –

1

在閱讀上面的註釋之後,我很清楚你的Access文件只是鎖定了它的設計器視圖。通常情況下,只需按住Shift鍵,雙擊該文件並保持Shift直到Access啓動並運行即可解鎖。

從此,您將擁有對錶,查詢等的完全訪問權限,並且可以隨時訪問數據庫規範。這將比試圖動態訪問更好。

+0

謝謝;這是有效的(儘管我也出於某種原因,必須右鍵單擊文件名並選擇Access,而不是通過XP模式訪問)。所以這解決了我的問題,但是,正如Tonic Water先生回答了實際問題... –

+1

Edmund * did *回答了實際問題,因此值得點。儘管如此,您在這裏的正確呼籲應該*不*動態獲取數據庫細節,而是根據已知的規範在您的代碼中執行驗證規則。 ;) – Crono

相關問題