2010-08-29 25 views
6

我創建一個實用程序來從Excel導入數據到Oracle數據庫的解決方法,我需要爲Excel猜測數據類型的問題

我對Excel文件的固定模板,

現在,當我試圖通過Jet提供程序和ADO.Net - Ole連接工具導入數據時,發現以下問題:有些列未被導入,因爲其列[string和number]中有混合的數據類型,

我在網上找了這個問題我發現原因是guessing data types from Excel

負載代碼:

connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0;"); 
string columns = "P_ID, FULL_NAME_AR, job_no, GENDER, BIRTH_DATE, RELIGION, MARITAL_STATUS, NAT_ID, JOB_Name, FIRST_HIRE_DATE, HIRE_DATE, CONTRACT_TYPE, GRADE_CODE, QUALIFICATION"; 
string sheetName = "[Emps$]"; 
OleDbCommand command = new OleDbCommand(string.Format("select {0} from {1} where p_id is not null", columns, sheetName), connection); 

connection.Open(); 
dr = command.ExecuteReader(); 
DataTable table = new DataTable(); 
table.Load(dr); 

我應該怎麼做,告訴Excel中不必猜測,給我數據,文本?

如果沒有,你能幫助我與任何變通辦法?

在此先感謝

+0

你是如何從Excel導入記錄到Oracle?代碼請?它在哪裏失敗? – shahkalpesh 2010-08-29 14:40:02

+0

您是否可以將整個列設置爲Excel中的文本? – Rup 2010-08-29 14:53:59

+0

@ shahkalpesh:它不拋出任何異常,只是忽略文本數據,因爲它會猜測列的數據類型與前8個記錄數和返回null非數值 – Homam 2010-08-29 14:56:47

回答

7

我找到了一個解決方案,加入IMEX = 1的連接字符串,但有它特殊的格式,descriped在以下link

IMEX參數用於使用混合數字和alpha值的列。 Excel驅動程序通常會掃描,以確定要使用的數據類型,每一列的前幾行 。如果列被確定基於第一若干行的掃描是數字 ,然後用在此列中字母字符任何行將 被返回爲Null。 IMEX參數(1爲輸入模式)強制該列的數據類型爲 文本,以便正確處理字母數字值。

問候

1

您可以從excel工作?這個例子在Excel中運行將把數據好壞參半tyoes到一個SQL Server表:

Dim cn As New ADODB.Connection 

scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ 
& sFullName _ 
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

cn.Open scn 

s = "SELECT Col1, Col2, Col3 INTO [ODBC;Description=TEST;DRIVER=SQL Server;" _ 
& "SERVER=Some\Instance;Trusted_Connection=Yes;" _ 
& "DATABASE=test].TableZ FROM [Sheet1$]" 
cn.Execute s 
+0

感謝Remou,但它不適合我的情況,但我的問題是,爲什麼我不能在ADO.Net中使用IMEX = 1?有沒有類似的擴展屬性適用於ADO.Net? – Homam 2010-08-29 15:00:58

+1

爲什麼你不能使用IMEX = 1?它只是連接字符串的一部分。在這個http://www.pcreview.co.uk/forums/thread-1863969.php,保羅,MVP,建議你可以。 – Fionnuala 2010-08-29 17:23:15

+0

@ Remou:非常感謝,它工作正常,連接字符串中需要(char)34(來自您添加的鏈接)。 – Homam 2010-08-30 11:50:00

1

這不完全正確!顯然,噴氣/ ACE總是假定字符串類型,如果第一8行是空的,無論IMEX = 1,始終使用數字型,如果第一8行是數字(同樣,無論IMEX = 1)。即使當我在註冊表中將行讀取爲0時,我仍然遇到同樣的問題。這是唯一確保消防方式來得到它的工作:

try 
{ 
    Console.Write(wsReader.GetDouble(j).ToString()); 
} 
catch //Lame unfixable bug 
{ 
    Console.Write(wsReader.GetString(j)); 
} 

+0

這一切都取決於你是否篡改了註冊表,特別是TypeGuessRows http://msdn.microsoft.com/en-us/library/bb177610(v=office.12).aspx – Fionnuala 2012-07-17 10:33:13

+0

嘗試使用wsReader.GetValue (j).ToString(),然後如果你想把它作爲double,你可以嘗試從字符串中解析它。 – Jim 2012-07-18 19:18:53

+0

Jim的問題在於,如果列中的第一個值是數字,但後來又有像「CDF62738」這樣的值,則這些值將被視爲NULL,因爲無效數字爲:/ – tomasofen 2015-12-17 03:10:04