Текущий архив: 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.48 MB
Время: 0.014 c