偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C#徹底解決Oledb連接Excel數(shù)據(jù)類型不統(tǒng)一的問題

移動開發(fā) Android
在使用Microsoft.Jet.OLEDB.4.0連接Excel,進行讀取數(shù)據(jù),相對使用傳統(tǒng)的COM來讀取數(shù)據(jù),效率是很高的。但相對傳統(tǒng)COM操作Excel來說,及存在數(shù)據(jù)類型轉(zhuǎn)換的問題。因為使用OLEDB連接Excel讀取數(shù)據(jù)時,需要確定數(shù)據(jù)的類型。默認情況使用連接字符串:

在使用Microsoft.Jet.OLEDB.4.0連接Excel,進行讀取數(shù)據(jù),相對使用傳統(tǒng)的COM來讀取數(shù)據(jù),效率是很高的。但相對傳統(tǒng)COM操作Excel來說,及存在數(shù)據(jù)類型轉(zhuǎn)換的問題。

因為使用OLEDB連接Excel讀取數(shù)據(jù)時,需要確定數(shù)據(jù)的類型。默認情況使用連接字符串:

 

view source

 

print ?

 

1. string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties='Excel 8.0;'";

 

使用上面的連接字符串連接Excel時,可能會遇到數(shù)據(jù)類型不一致的問題。所謂數(shù)據(jù)類型不一致,是指同一列里面數(shù)據(jù)類型可能出現(xiàn)多種,如浮點數(shù)、字符串、日期等;當出現(xiàn)此類情況時,讀取出來的數(shù)據(jù)就為空,甚至會報錯,如“非法的日期格式”等異常。出現(xiàn)這種問題,我們大家都會想到把數(shù)據(jù)全部都按字符數(shù)據(jù)來讀取,但是按什么數(shù)據(jù)類型來讀取不是我們能控制的,是OLEDB控制的,至少暫時我還沒有找到能控制輸出數(shù)據(jù)類型的方法。因為我當初也嘗試使用convert,cast函數(shù)對輸出的列進行類型轉(zhuǎn)換,但oledb連接Excel時,使用的SQL不支持這些函數(shù)。因此只能從其他角度來解決該問題。我也在網(wǎng)上搜索了很多解決方法,最全面的解決方法是:http://www.douban.com/note/18510346/。下面列出了網(wǎng)上出現(xiàn)解決該問題方法的比較:

這里提供一個更加方便的辦法,不過前提是***行必須是作為字段名或者***行的數(shù)據(jù)類型就為字符型。這樣一說,大家就明白了。首先修改連接字符串為:

  1. view source 
  2. print ? 
  3.  
  4. //2003(Microsoft.Jet.Oledb.4.0) 
  5. string strConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath); 
  6.  
  7. //2010(Microsoft.ACE.OLEDB.12.0) 
  8. string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath);  

這里將HDR設為NO,因為我就是將***行做為數(shù)據(jù)讀取,而IMEX=1就表示根據(jù)前8行判斷列的數(shù)據(jù)類型,如果有字符型數(shù)據(jù),那么就強制混合數(shù)據(jù)轉(zhuǎn)換為 文本。這里就明白為什么要保證***行為字符型的原因了。能將列的數(shù)據(jù)類型強制設為字符型,那么列中出現(xiàn)什么類型的數(shù)據(jù)都不怕了。需要做的工作就是,在獲取 完數(shù)據(jù)后,將字段名重新設置,并刪除***條記錄即可。代碼如下:

  1. view source 
  2. print ? 
  3. 01. DataTable dt = new DataTable(); 
  4. 02.    
  5. 03. using(OleDbCommand cmd = new OleDbCommand()){ 
  6. 04.     cmd.Connection = conn; 
  7. 05.     cmd.CommandType = CommandType.Text; 
  8. 06.     cmd.CommandTimeout = 6; 
  9. 07.     cmd.CommandText = string.Format("select * from [{0}$]", sheetName); 
  10. 08.    
  11. 09.     OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 
  12. 10.     adapter.Fill(dt); 
  13. 11. } 
  14. 12.    
  15. 13. if (dt.Rows.Count > 0) { 
  16. 14.     DataRow dr = dt.Rows[0]; 
  17. 15.    
  18. 16.     for (int col = 0; col < dt.Columns.Count; col++) { 
  19. 17.         dt.Columns[col].ColumnName = dr[col].ToString(); 
  20. 18.     } 
  21. 19.    
  22. 20.     dt.Rows[0].Delete(); 
  23. 21.     dt.AcceptChanges(); 
  24. 22. } 
責任編輯:chenqingxiang 來源: oschina
相關(guān)推薦

2025-08-07 02:45:00

2009-11-27 10:31:02

GPRS路由

2021-12-03 12:15:01

QT中文亂碼Windows

2009-08-27 15:47:00

C#數(shù)據(jù)類型string

2009-09-04 10:16:30

C#數(shù)據(jù)類型

2009-09-07 10:48:53

C#數(shù)據(jù)類型

2011-06-08 13:35:18

C#數(shù)據(jù)類型

2010-01-04 15:05:53

2023-02-27 08:08:54

Pulsar源碼重復消費

2009-08-12 16:26:27

C#數(shù)據(jù)類型轉(zhuǎn)換

2010-01-14 10:19:05

2009-09-11 12:00:33

C#預定義數(shù)據(jù)類型

2025-03-03 00:13:50

2023-11-28 08:36:16

Spring中Body讀取

2010-01-11 18:05:24

VB.NET窗體繼承

2009-08-13 15:19:17

C#數(shù)據(jù)類型

2020-09-28 14:41:24

Event Loop

2024-05-20 00:00:00

代碼主線程

2009-09-01 16:35:55

C#操作String數(shù)

2009-08-14 13:52:18

C#判斷數(shù)據(jù)類型
點贊
收藏

51CTO技術(shù)棧公眾號