Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

SQL запросы к Excel, это забавно   Найти похожие ветки 

 
Polevi ©   (2006-01-26 17:05) [0]

день добрый
есть у меня задача импортировать данные из книги Excel в базу
делаем запрос к Excel через ADO и результат отправляем в виде XML в stored proc на сервере, дальше понятно
у меня это все чудно работало до сегодняшнего дня
понадобилось импортировать данные из книги, в которой есть колонка с разными типами данных, то есть
1234
1234-1
1235
и тд

при обработке я заметил что значения для некоторых строк не определены ! при выполнении запроса ADO каким то только ему известным способом определяет тип данных колонки и в дальнейшем для всех ячеек в которых тип другой возвращает Null
я долго пытался понять принцип определения типа но так ничего и не достиг
возможно у кого-нибудь будут идеи по этому поводу, ниже привожу код для тестирования

procedure TForm1.Exec;
var
 conn,rs,s:OleVariant;
begin
 memo1.text:="";
 conn:=CreateOleObject("ADODB.Connection");
 conn.ConnectionString:=Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties="Excel 8.0;HDR=NO"",["c:\rl2.xls"]);
 conn.Open;
 rs:=conn.Execute("SELECT * FROM [Sheet1$]");
 while not rs.Eof do
 begin
   s:=rs.Fields.Item(0).Value;
   if s=NULL then
     Memo1.Lines.Add("")
   else
     Memo1.Lines.Add(s);
   rs.MoveNext;
 end;
 conn.Close;
end;

создайте книгу Excel и попробуйте заполнять первый столбец цифрами и строками и выполняйте код - забавно, не так ли ?


 
Nikolay M. ©   (2006-01-26 17:12) [1]

Малость коснулись этого на скл.

http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=237490#2098716


 
sniknik ©   (2006-01-26 17:13) [2]

> при выполнении запроса ADO каким то только ему известным способом определяет тип данных колонки
вообщето не ADO, Jet.
определяет при значениях по умолчанию по первым восмьи строкам. будут там в большинстве цифры (isNumeric проверку пройдет) то дается цифровое значение даже если потом все строки... которые отбросятся.

параметр реестра TypeGuessRows в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel


 
sniknik ©   (2006-01-26 17:20) [3]

вообще почитай про ISAM-ы Jet-а в справке JETSQL40.CHM (искать на машине с мсофисом) там много чего интересного про разные вещи... (правда "забавность" этих вещей после этого пропадет ;о)))


 
Polevi ©   (2006-01-26 17:28) [4]

гм, оперативно, спасибо :-)


 
Polevi ©   (2006-01-26 17:36) [5]

блин но это же бред какойто
какого черта он Null то возвращает.. что делать то
можно конечно другим макаром данные тянуть из екселя, способов много но хотелось красиво


 
sniknik ©   (2006-01-26 17:38) [6]

> что делать то
можно "насильно" заставить его все данные считать строками ->
Excel 8.0;HDR=NO;IMEX=1;


 
Polevi ©   (2006-01-26 17:45) [7]

спаситель !!!
работает !!!
спасибо огромное блин спасибо надо было раньше спросить с утра маюсь
:-)


 
Polevi ©   (2006-01-26 18:11) [8]

вот блин
для SELECT * FROM [Sheet1$]   IMEX=1 помогает
если написать SELECT * FROM [Sheet1$2:1000] - см. сабж

сплошные пляски с бубном :-)


 
sniknik ©   (2006-01-26 20:57) [9]

хм... действительно. никогда внимания не обращал.
ну, чего можно сказать... ну делай верхнее ограничение TOP 1000, а начало... ну будут лишние строки. надеюсь не смертельно, в рекордсете пропускай.


 
Polevi ©   (2006-01-27 11:40) [10]

отсекаю в WHERE


 
SLP ©   (2006-01-27 13:06) [11]


>  rs:=conn.Execute("SELECT * FROM [Sheet1$]");
>  

Подскажите, пож-та, как правильно здесь обратиться к листу Excel по имени
Я сделала так:
rs:=conn.Execute("SELECT * FROM [lst1]"); lst1 - имя листа в книге.
Вываливается ошибка : Объект "lst1" не найден ядром базы данных Microsoft Jet .Проверьте существование объекта и правильность имени и пути.


 
Polevi ©   (2006-01-27 13:12) [12]

"SELECT * FROM [lst1$]


 
SLP ©   (2006-01-27 13:52) [13]


> Polevi ©   (27.01.06 13:12) [12]

Спасибо большое! Все получилось!


 
DSKalugin ©   (2006-01-27 14:27) [14]


>  s:=rs.Fields.Item(0).Value;
>    if s=NULL then
>      Memo1.Lines.Add("")
>    else
>      Memo1.Lines.Add(s);


s - какого типа был?
Я бы так написал
   if rs.Fields.Item(0).isNULL then
     Memo1.Lines.Add("")
   else
     Memo1.Lines.Add(rs.Fields.Item(0).Value);


 
SLP ©   (2006-01-27 15:29) [15]


> Polevi ©  

Еще вопрос.  Как  считать программным путем имена листов в книге, чтобы обращаться не в лоб, а через переменную.
Заранее спасибо!


 
sniknik ©   (2006-01-27 15:38) [16]

ADOConnections.GetTableNames


 
SLP ©   (2006-01-27 16:05) [17]


> sniknik ©   (27.01.06 15:38) [16]


Спасибо!



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
15-1140972740
Зм1й
2006-02-26 19:52
2006.03.19
mp3


15-1140525596
Knight
2006-02-21 15:39
2006.03.19
На подходе очередной дефолт... есть предпосылки или?


2-1141627235
WChek
2006-03-06 09:40
2006.03.19
отлов события


15-1140775934
DSKalugin
2006-02-24 13:12
2006.03.19
Способы защиты exe/dll от модификации ресурсов


2-1141193058
stela
2006-03-01 09:04
2006.03.19
текстовые файлы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский