2010-08-29 1 views
6

я создаю утилиту для импорта данных из Excel в базу данных Oracle,мне нужен обходной путь для Excel Гадания данных проблемы Типы

У меня есть фиксированный шаблон для файла Excel,

Теперь, когда я Я пытаюсь импортировать данные с помощью поставщика Jet и ADO.Net - Ole, я обнаружил следующую проблему: некоторые столбцы не были импортированы, потому что в их столбцах [строка и номер] есть смешанные типы данных,

Я искал эту проблему в Интернете. Я нашел причину 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 to oracle? код пожалуйста? где это не удается? – shahkalpesh

+0

Можете ли вы не просто установить весь столбец как текст в Excel? – Rup

+0

@ shahkalpesh: он не вызывает никаких исключений, он просто игнорирует текстовые данные, потому что он догадывается, что тип данных для столбца является числом из первых 8 записей и возвращает значение null для не числовых значений – Homam

ответ

7

Я нашел решение, добавив IMEX = 1 для строки подключения, но есть специальный формат для него, который descriped в следующем link ,

Параметр IMEX предназначен для столбцов, в которых используются смешанные числовые и альфа-значения. Драйвер Excel обычно сканирует первые несколько строк , чтобы определить, какой тип данных использовать для каждого столбца. Если столбец определяется как числовой , основанный на проверке первых нескольких строк, тогда любые строки с альфа-символами в этом столбце будут возвращены как Null. Параметр IMEX (1 - режим ввода) заставляет тип данных столбца соответствовать , чтобы буквенно-цифровые значения обрабатывались надлежащим образом.

С уважением

1

Можете ли вы работать с отличным концом? Этот пример работает в 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, но это не подходит для моего случая, но мой вопрос: почему я не могу использовать IMEX = 1 в ADO.Net? и существует ли аналогичная функция расширения с ADO.Net? – Homam

+1

Почему вы не можете использовать IMEX = 1? Это всего лишь часть строки подключения.В этом http://www.pcreview.co.uk/forums/thread-1863969.php Пол, MVP, предположите, что вы можете. – Fionnuala

+0

@ Remou: Большое спасибо, он работает, это необходимо (char) 34 в строке подключения (из ссылки, которую вы добавили). – Homam

1

Это не совсем верно! По-видимому, Jet/ACE ALWAYS принимает строковый тип, если первые 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

+0

попробуйте использовать wsReader.GetValue (j) .ToString(), а затем, если вы хотите, чтобы он был двойным, вы можете попытаться разобрать его из строки. – Jim

+0

Проблема с этим, Джим, заключается в том, что если ваши первые значения в столбце являются числами, но у вас позже есть значения, такие как «CDF62738», эти значения будут считаться NULL, потому что недопустимый номер: / – tomasofen

Смежные вопросы