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

Вниз

ClientDataSet и Insert .... select ... from что?   Найти похожие ветки 

 
Раиса ©   (2008-09-22 00:31) [0]

Используя DBGrid, пользователь может ввести данные в ClientDataSet. Далее хочется выборку из полей  записать одним select-ом в БД (например, mdb-файл).
Не понимаю, что писать  в конструкции Insert .... select ... from какое имя таблицы (таблицы вроде как бы нет, а если попытаться написать типа ClientDataSet1.FileName:="aa.mdb", и сделать выборку из ClientDataSet1.FileName, то выдается ошибка).
Помогите, пожалуйста, или так нельзя сделать в случае с ClientDataSet?


 
Медвежонок Пятачок ©   (2008-09-22 00:36) [1]

Не понимаю, что писать  в конструкции Insert .... select ... from какое имя таблицы

Никакое имя. Так как нет никакой таблицы


 
Раиса ©   (2008-09-22 00:45) [2]

А как ВСЕ записи записать в таблицу ОДНИМ select-ом?

Даже если Access такого не подддерживает, то для MS SQL это нормальная конструкция...


 
sniknik ©   (2008-09-22 01:06) [3]

> то для MS SQL это нормальная конструкция...
сказки не рассказывай... ни один движок/sql сервер не "увидит" в запросе ClientDataSet. запрос выполняется "там", а ClientDataSet "здесь".


 
Раиса ©   (2008-09-22 01:17) [4]

Может быть, некорректно написала, но
insert into table1 select * from table2
для MS SQL нормально (где table1 и table2 - таблицы на сервере)

А как написать в случае использования ClientDataSet вместо table2?


 
sniknik ©   (2008-09-22 08:49) [5]

> Может быть, некорректно написала, но
> insert into table1 select * from table2
> для MS SQL нормально (где table1 и table2 - таблицы на сервере)
для access это тоже будет нормально, никакой разницы.

> А как написать в случае использования ClientDataSet вместо table2?
никак. ClientDataSet находится не на сервере, и связи к нему (isam/openrowset) не предусмотрено.
только "классический" запрос со значениями, лучше в параметрах и по одной записи, но можно и из всего датасета значения в него загнать... (а после начинать спрашивать про ограничения длинны запросов...).


 
Раиса ©   (2008-09-22 13:46) [6]

Про ограничения длины запросов мне спрашивать не приходилось...хотя есть запросы со многим количеством строк...

Я думала, что сохранение (например, в xml) могло бы мне помочь. Жаль, что никак...


 
clickmaker ©   (2008-09-22 14:10) [7]

> Я думала, что сохранение (например, в xml) могло бы мне
> помочь

а xml-то здесь причем?


 
Поросенок Винни-Пух ©   (2008-09-22 14:19) [8]

Я думала, что сохранение (например, в xml) могло бы мне помочь. Жаль, что никак...

лехко.
сохраняешь весь пакет или только дельту в xml, далее делаешь ему transform с помощью xsl и получаешь готовый inserts.sql


 
sniknik ©   (2008-09-22 14:22) [9]

> хотя есть запросы со многим количеством строк...
пока везет.

> что сохранение (например, в xml) могло бы мне помочь.
чем xml лучше чем ClientDataSet, если он в памяти? вот если это файл на диске в формате xml, тогда можно поискать, возможно есть isam для него.
хотя лучше использовать существующий dBase/Paradox/Text/ODBC/..., правда опять возникнет проблема в перекладывании данных ClientDataSet-а уже в него... что вернет к решению с "классическим" запросом с параметрами для каждой записи. и нафига тогда лишние действия?


 
sniknik ©   (2008-09-22 14:27) [10]

> и получаешь готовый inserts.sql
т.е. вариант с полным переносом данных ClientDataSet-а в запрос, только через посредника...
и с тем же ограничением на размер запроса, если не делать его через Query Analyzer либо не писать к нему "выполнитель пакета", он же там не в одну команду делает? а пакет команд. тогда кстати +, для аксесса(jet) не пойдет, т.к. он не понимает больше одной команды за раз.


 
MsGuns ©   (2008-09-22 15:34) [11]

Что сложного в таком коде:

var
 bm: TBookMark;
begin
 CDS1.DisbaleControls;
 bm := CDS1.GetBookMark;
 CDS1.First;
 With TADOCommand.Create(nil) do
   try
     Connection := <TADOConnection>;
     CommandText := "INSERT INTO TABLE (FLD1,FLD2,..FLDN) VALUES(:fld1,:fld2,..fldn)";
     Connection.BeginTrans;
     while not CDS1.Eof do
        begin
          Parameters.ParaByName("fld1").Value := CDS1.FieldByName("Fld1").AsString;
          Parameters.ParaByName("fld2").Value := CDS1.FieldByName("Fld2").AsInteger;              
          ...
          Parameters.ParaByName("fldn").Value := CDS1.FieldByName("Fld1").AsDateTime;
          try
             Execute;
          except
             ShowMessage("Ooops");
             break;
        end;
     if CDS.Eof then
        Connection.CommitTrans
    else
        Connection.RollbackTrans;
   finally
   end;
 CDS1.GoToBookMark(bm);
 CDS1.FreeBookMark(bm);
 CDS1.EnableControls;
end;


 
MsGuns ©   (2008-09-22 15:36) [12]

Блин, после break еще две строки

 end;
 Next;


 
Раиса ©   (2008-09-22 16:03) [13]

Ничего сложного. Я обычно Connection.RollbackTrans в try ..except пишу...

         try
            Execute;
         except
            ShowMessage("Ooops");
            Connection.RollbackTrans;            
            break;
         end;

Но хотелось без цикла одним запросом...


 
clickmaker ©   (2008-09-22 16:06) [14]

> [12] MsGuns ©   (22.09.08 15:36)
> Блин, после break еще две строки
>
> end;
> Next;

ну вот, всю малину испортил... :)


 
Johnmen ©   (2008-09-22 17:00) [15]

Есть такое предположение, что автору и вовсе не нужен CDS, а достаточно TADODataSet на всё про всё...


 
MsGuns ©   (2008-09-22 19:36) [16]

О, еще и Free забыл ;)
Хотя, автору, похоже, это все до "дверцы", ей надо "одним запросом"


 
Petr V. Abramov ©   (2008-09-22 23:17) [17]


> Далее хочется выборку из полей  записать одним select-ом
> в БД

идея правильная

> (например, mdb-файл).

в аксессе хрен выйдет (хотя могу ошибаться, тонкостей новых версий не знаю)

даже на "взрослых" базах это не делается ни через BDE, ни через ADO, хоть .НЕТ, хоть ни.НЕТ, только через спецкомпоненты



Страницы: 1 вся ветка

Текущий архив: 2009.06.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.007 c
3-1222218828
РФМ
2008-09-24 05:13
2009.06.07
Наличие картинки


15-1238549794
brother
2009-04-01 05:36
2009.06.07
Обсудим факт?


15-1238736040
@!!ex
2009-04-03 09:20
2009.06.07
Как сделать счетчик скачивания файла?


15-1238704205
Юрий
2009-04-03 00:30
2009.06.07
С днем рождения ! 3 апреля 2009 пятница


15-1238782378
Petr V. Abramov
2009-04-03 22:12
2009.06.07
ave отечественый производитель ::)