Показать сообщение отдельно
Старый 18.01.2007, 16:09   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Зачем так рано сдаваться-то?

Обнаружил два способа борьбы:
1. добавить во фрагмент ConnectionString "Extended Properties='Excel 8.0;HDR=Yes'" подстроку "IMEX=1", чтобы получилось "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'" (при этом как минимум одно из первых 8 значений должно быть текстом)
2. добавить ведущий апостроф (известный способ в Excel) в те ячейки первых 8 строк, которые выглядят как числовые ( 150300 => '150300 )

Далее, у меня получились следующие результаты исследования:
1. MAXSCANROWS при использовании из Аксапты у меня не почему-то не заработал (т.е. всегда всё определяли первые 8 строк)

2. тип данных в конкретном поле ADO определяет по значениям в первых 8 строках (даже при MAXSCANROWS=1 и при MAXSCANROWS=16; и даже при MAXSCANROWS=0, когда по идее должны сканироваться все записи таблицы)
2.1. если в первых 8 строках 5 текстовых значений и 3 числовых, то тип поля принимается как ТЕКСТ
2.2. если в первых 8 строках 3 текстовых значений и 5 числовых, то тип поля принимается как ЧИСЛО
2.1. если в первых 8 строках 4 текстовых значений и 4 числовых, то тип поля принимается как ЧИСЛО

3. Если добавить параметр IMEX=1, то (опять-таки всё определяется по первым 8 строкам):
3.1. Если в первых 8 строках есть хотя бы одно текстовое значение, то тип поля принимается как ТЕКСТ (!)
3.2. Если в первых 8 строках есть ТОЛЬКО ЧИСЛОВЫЕ значения, то тип поля принимается как ЧИСЛО (даже если все последующие значения, начиная с 9-го являются текстом)

Подробности про IMEX=1, например, здесь:
Цитата:
NOTE: Setting IMEX=1 tells the driver to use Import mode. In this state, the registry setting ImportMixedTypes=Text will be noticed. This forces mixed data to be converted to text. For this to work reliably, you may also have to modify the registry setting, TypeGuessRows=8. The ISAM driver by default looks at the first eight rows and from that sampling determines the datatype. If this eight row sampling is all numeric, then setting IMEX=1 will not convert the default datatype to Text; it will remain numeric.
За это сообщение автора поблагодарили: kashperuk (6).