![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброе время суток уважаемые программисты! Не могли бы вы помочь мне в следующем вопросе. Имеется таблица в EXCEL в ней 5 столбцов надо их отправить в бд по следующим запросам:
добавление INSERT INTO ZKOKS.OLD_NUMBER (ID, REG_ID, TYPE, NUM) VALUES (:ID, :REG_ID, :TYPE, :NUM) изменение UPDATE ZKOKS.OBJ SET INV_NUM = :INV_NUM, CAD_NUM = :CAD_NUM WHERE (OBJ.CAD_NUM = 'список') подключение к базе я реализовал, таблицу выгрузил в StringGrid? а как связать эту таблицу по средством запроса с БД не знаю. Прошу Вашей помощи. Заранее благодарен! |
|
#2
|
||||
|
||||
|
А с чего вдруг в StringGrid? Сей компонент не заточен под работу с базами. Используйте TDBGrid.
|
|
#3
|
|||
|
|||
|
Сделал через DBGrid, а как дальше реализовать?
|
|
#4
|
||||
|
||||
|
Поскольку вам надо делать запрос, то подключение через OLE вам не поможет, значит подключаемся к таблице через ADO. Используем примерно такую строку подключения:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Отпуска.xls;Extended Properties=Excel 8.0;Persist Security Info=False Далее для проверки выполняем запрос к нужному листу в таблице: select * from [Лист1$] Все данные с листа экселя прочитаны. С подключением и чтением данных разобрались. Теперь поясните ваш пост. 1. Вы пишете 5 столбцов, а в запросе вижу только 4. 2. Из экселя считываются все данные или есть критерий какой-то 3. В какую базу надо записать? Об этом ни слова. |
|
#5
|
|||
|
|||
|
Цитата:
Как раз таки я так и сделал. 1.Насчет столбцов можно увидеть в архиве 2.Из экселя, который я выгрузил в DBGrid необходимы по первому запросу 4 поля, а вот по второму другие 2 (но они тоже имеются в таблице) 3. В базу ORACLE надо выгрузить (подключение к ней реализовал через SQLConnection) |
|
#6
|
||||
|
||||
|
Ага, уже проясняется. Конечно тут вроде напрашиваются гетерогенные запросы, но я в них не силен, особенно с подключением к ораклу, а потому пойдем нешустрым, но надежным путем.
![]() (Непосредственно для передачи данных нам грид не потребуется. Разве что посмотреть, что собственно копируется.) Значит имеем 2 подключения к разным базам. Пишем такой код: Код:
SQLQuery1.SQL.Text := 'insert into OracleTable (Fld1,Fld2,Fld3,Fld4,Fld5) Values(:Val1, :Val2, :Val3, :Val4, :Val5)';
while not AdoQuery1.Eof
do begin
SQLQuery1.Params.ParamValues['Val1'] := AdoQuery1.FieldValues['Fld1'];
SQLQuery1.Params.ParamValues['Val2'] := AdoQuery1.FieldValues['Fld2'];
SQLQuery1.Params.ParamValues['Val3'] := AdoQuery1.FieldValues['Fld3'];
SQLQuery1.Params.ParamValues['Val4'] := AdoQuery1.FieldValues['Fld4'];
SQLQuery1.Params.ParamValues['Val5'] := AdoQuery1.FieldValues['Fld5'];
SQLQuery1.ExecSQL;
AdoQuery1.Next;
end;Вроде должно работать. Последний раз редактировалось Страдалецъ, 31.07.2013 в 14:00. |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
demon-sheff (01.08.2013)
| ||
|
#7
|
|||
|
|||
|
Спасибо огромное, Вы мне очень сильно помогли! 1 запрос прошел на ура!!! а вот со 2 выходит проблемка. Может я чего не так делаю:
Код:
SQLQ.SQL.Text := 'UPDATE ZKOKS.OBJ SET INV_NUM = :NUM WHERE OBJ.CAD_NUM = '+':CAD_NUM';
while not AdoQuery1.Eof
do begin
SQLQ.Params.ParamValues['INV_NUM'] := AdoQuery1.FieldValues['NUM'];
SQLQ.Params.ParamValues['CAD_NUM'] := AdoQuery1.FieldValues['CAD_NUM'];
Showmessage('Данные изменены!');
SQLQ.ExecSQL;
AdoQuery1.Next;
end;А выдает такую ошибку: SQLQ:Parameter 'INV_NUM' not found |
|
#8
|
||||
|
||||
|
Видимо хотелось так:
Код:
SQLQ.Params.ParamValues['NUM'] := AdoQuery1.FieldValues['NUM']; И еще, такой момент. Изменение данных производится после SQLQ.ExecSQL, а не до. Если по какой-то причине запрос не прошел, ваше сообщение Showmessage('Данные изменены!'); будет ложным. Последний раз редактировалось Страдалецъ, 01.08.2013 в 13:03. |
|
#9
|
|||
|
|||
|
Цитата:
|
|
#10
|
|||
|
|||
|
Цитата:
|
|
#11
|
||||
|
||||
|
У вас параметр как-бы прослойка между экселем и ораклом. Т.е. все 3 сущности, поле оракла, поле экселя, имя параметра могут иметь и одинаковые и разные имена. Главное самому не запутаться, что куда передается. В вашем запросе последовательность такая:
AdoQuery1.FieldValues['NUM'] --> SQLQ.Params.ParamValues['NUM'] --> ZKOKS.OBJ.INV_NUM |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
demon-sheff (02.08.2013)
| ||
|
#12
|
|||
|
|||
|
СПАСИБО БОЛЬШОЕ! Очень вразумительный ответ!
Тему можно закрывать. |
|
#13
|
|||
|
|||
|
при длительном тестировании выяснилось, что
Код:
kol:integer;
begin
kol:= DBGrid3.DataSource.DataSet.RecordCount;
SQLQ.SQL.Text := 'UPDATE ZKOKS.OBJ SET INV_NUM =(:NUM) WHERE OBJ.CAD_NUM = '+'(:CAD_NUM)';
while not AdoQuery1.Eof
do begin
SQLQ.Params.ParamValues['NUM'] := AdoQuery1.FieldValues['NUM'];
SQLQ.Params.ParamValues['CAD_NUM'] := AdoQuery1.FieldValues['CAD_NUM'];
SQLQ.ExecSQL;
AdoQuery1.Next;
Label2.Caption:='Выполненое действие: изменены '+inttostr(kol)+' запис(и)ей!';
end;где x число которое должно быть. Как с этим бороться кто-нибудь знает? |
|
#14
|
||||
|
||||
|
Никак с этим бороться не надо. Это все тоже значение,только у вас представление этого числа на экран стало почему-то экспонентным. Например эксель с числами не влезающими в ячейку проделывает такой фокус - для комактности
Просто задайте формат представления числа и все должно исправится. |
|
#15
|
|||
|
|||
|
Цитата:
![]() |