2010-08-29 19 views
6

Tworzę narzędzia do importowania danych z programu Excel do bazy danych Oracle,muszę obejście Excel Guessing typy danych problemu

Mam stały szablon dla pliku Excel,

Teraz, kiedy próbuję zaimportować dane przez dostawcę Jet i narzędzia do połączeń ADO.Net - Ole, znalazłem następujący problem: nie ma niektórych kolumn nie zostały zaimportowane, ponieważ są mieszane typy danych w swoich kolumnach [ciąg i liczba],

Szukałem tego problemu w internecie Znalazłem powód: guessing data types from Excel

Kod obciążenie:

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); 

Co należy zrobić, aby powiedzieć Excel STOP zgadywania i dać mi dane jako tekst?

jeśli nie, czy możesz mi pomóc w obejściu?

Z góry dziękuję

+0

W jaki sposób importujesz rekordy z programu Excel do Oracle? kod, proszę? gdzie to się nie udaje? – shahkalpesh

+0

Czy nie możesz ustawić całej kolumny jako tekstu w programie Excel? – Rup

+0

@ shahkalpesh: Nie rzuca żadnego wyjątku, po prostu ignoruje dane tekstowe, ponieważ zgaduje, że typ danych dla kolumny jest liczbą z pierwszych 8 rekordów i zwraca wartość null dla wartości nie numerycznych. – Homam

Odpowiedz

7

znalazłem rozwiązanie dodając IMEX = 1 w ciągu połączenia, ale nie jest to specjalny format dla niego, który opisany jest w następujący link .

Parametr IMEX dotyczy kolumn, które używają mieszanych wartości numerycznych i alfa. Sterownik programu Excel zazwyczaj skanuje pierwsze kilka wierszy , aby określić, jakiego typu danych użyć dla każdej kolumny. Jeśli kolumna zostanie określona jako numeryczna na podstawie skanu pierwszych kilku wierszy, wówczas wszystkie wiersze ze znakami alfa w tej kolumnie będą zwracane jako Null jako . Parametr IMEX (1 jest trybem wejściowym) wymusza na typie kolumny wartość , tak aby wartości alfanumeryczne były poprawnie obsługiwane.

Pozdrowienia

1

Czy możesz pracować od końca programu Excel? Ten przykład uruchomić w programie Excel umieści mieszane tyoes danych do tabeli 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

Dzięki Remou, ale nie nadaje się do mojego przypadku, ale moje pytanie brzmi, dlaczego nie mogę używać IMEX = 1 w ADO.Net? i czy istnieje podobna własność działa z ADO.Net? – Homam

+1

Dlaczego nie możesz użyć IMEX = 1? Jest to tylko część ciągu połączenia.W tym http://www.pcreview.co.uk/forums/thread-1863969.php, Paul, MVP, sugerują, że możesz. – Fionnuala

+0

@ Remou: Dziękuję bardzo, działa, to było potrzebne (char) 34 w łańcuchu połączenia (z linku, który dodałeś). – Homam

1

To nie jest całkowicie w porządku! Wygląda na to, że Jet/ACE ZAWSZE przyjmuje typ łańcucha, jeśli pierwsze 8 wierszy jest pustych, niezależnie od IMEX = 1, i zawsze używa typu liczbowego, jeśli pierwsze 8 wierszy jest cyframi (ponownie, niezależnie od IMEX = 1). Nawet gdy sprawiłem, że wiersze zostały odczytane do 0 w rejestrze, nadal miałem ten sam problem. To był jedyny pewny sposób na uruchomienie go:

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

+0

Wszystko zależy od tego, czy zmodyfikowałeś rejestr, czy nie, TypeGuessRows w szczególności http://msdn.microsoft.com/en-us/library/bb177610(v=office.12).aspx – Fionnuala

+0

spróbuj użyć wsReader.GetValue (j) .ToString(), a następnie, jeśli chcesz go podwójnie, możesz spróbować przeanalizować go z łańcucha. – Jim

+0

Problem z tym, Jim, polega na tym, że jeśli twoje pierwsze wartości w kolumnie są liczbami, ale później masz wartości takie jak "CDF62738", te wartości będą przyjmowane jako NULL, ponieważ nieważna liczba: / – tomasofen

Powiązane problemy