Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.059 c
2-1141400208
Ded22
2006-03-03 18:36
2006.03.19
Поиск по Имени и Фамилии


2-1141544738
x.pro
2006-03-05 10:45
2006.03.19
Вопрос, конечно, ламерский...


15-1140616689
Silica
2006-02-22 16:58
2006.03.19
Документация


3-1138093925
BAX
2006-01-24 12:12
2006.03.19
Коннект к базе?


1-1140185224
KyRo
2006-02-17 17:07
2006.03.19
Почему не стартует нить ??