![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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