Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запросы к Excel, это забавно


Polevi ©   (2006-01-26 17:05:00) 

день добрый
есть у меня задача импортировать данные из книги 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 и попробуйте заполнять первый столбец цифрами и строками и выполняйте код - забавно, не так ли ?


SLP   (2006-01-27 16:05:00) [1]


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


Спасибо!


sniknik   (2006-01-27 15:38:00) [2]

ADOConnections.GetTableNames


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


> Polevi ©  

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


DSKalugin   (2006-01-27 14:27:00) [4]


>  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 13:52:00) [5]


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

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


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

'SELECT * FROM [lst1$]


SLP   (2006-01-27 13:06:00) [7]


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

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


Polevi   (2006-01-27 11:40:00) [8]

отсекаю в WHERE


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

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


Polevi   (2006-01-26 18:11:00) [10]

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

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


Polevi   (2006-01-26 17:45:00) [11]

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


sniknik   (2006-01-26 17:38:00) [12]

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


Polevi   (2006-01-26 17:36:00) [13]

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


Polevi   (2006-01-26 17:28:00) [14]

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


sniknik   (2006-01-26 17:20:00) [15]

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


sniknik   (2006-01-26 17:13:00) [16]

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

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


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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо