Конференция "Базы" » ClientDataSet и Insert .... select ... from что? [D7, Access]
 
  • Раиса © (22.09.08 00:31) [0]
    Используя DBGrid, пользователь может ввести данные в ClientDataSet. Далее хочется выборку из полей  записать одним select-ом в БД (например, mdb-файл).
    Не понимаю, что писать  в конструкции Insert .... select ... from какое имя таблицы (таблицы вроде как бы нет, а если попытаться написать типа ClientDataSet1.FileName:='aa.mdb', и сделать выборку из ClientDataSet1.FileName, то выдается ошибка).
    Помогите, пожалуйста, или так нельзя сделать в случае с ClientDataSet?
  • Медвежонок Пятачок © (22.09.08 00:36) [1]
    Не понимаю, что писать  в конструкции Insert .... select ... from какое имя таблицы

    Никакое имя. Так как нет никакой таблицы
  • Раиса © (22.09.08 00:45) [2]
    А как ВСЕ записи записать в таблицу ОДНИМ select-ом?

    Даже если Access такого не подддерживает, то для MS SQL это нормальная конструкция...
  • sniknik © (22.09.08 01:06) [3]
    > то для MS SQL это нормальная конструкция...
    сказки не рассказывай... ни один движок/sql сервер не "увидит" в запросе ClientDataSet. запрос выполняется "там", а ClientDataSet "здесь".
  • Раиса © (22.09.08 01:17) [4]
    Может быть, некорректно написала, но
    insert into table1 select * from table2
    для MS SQL нормально (где table1 и table2 - таблицы на сервере)

    А как написать в случае использования ClientDataSet вместо table2?
  • sniknik © (22.09.08 08:49) [5]
    > Может быть, некорректно написала, но
    > insert into table1 select * from table2
    > для MS SQL нормально (где table1 и table2 - таблицы на сервере)
    для access это тоже будет нормально, никакой разницы.

    > А как написать в случае использования ClientDataSet вместо table2?
    никак. ClientDataSet находится не на сервере, и связи к нему (isam/openrowset) не предусмотрено.
    только "классический" запрос со значениями, лучше в параметрах и по одной записи, но можно и из всего датасета значения в него загнать... (а после начинать спрашивать про ограничения длинны запросов...).
  • Раиса © (22.09.08 13:46) [6]
    Про ограничения длины запросов мне спрашивать не приходилось...хотя есть запросы со многим количеством строк...

    Я думала, что сохранение (например, в xml) могло бы мне помочь. Жаль, что никак...
  • clickmaker © (22.09.08 14:10) [7]
    > Я думала, что сохранение (например, в xml) могло бы мне
    > помочь

    а xml-то здесь причем?
  • Поросенок Винни-Пух © (22.09.08 14:19) [8]
    Я думала, что сохранение (например, в xml) могло бы мне помочь. Жаль, что никак...

    лехко.
    сохраняешь весь пакет или только дельту в xml, далее делаешь ему transform с помощью xsl и получаешь готовый inserts.sql
  • sniknik © (22.09.08 14:22) [9]
    > хотя есть запросы со многим количеством строк...
    пока везет.

    > что сохранение (например, в xml) могло бы мне помочь.
    чем xml лучше чем ClientDataSet, если он в памяти? вот если это файл на диске в формате xml, тогда можно поискать, возможно есть isam для него.
    хотя лучше использовать существующий dBase/Paradox/Text/ODBC/..., правда опять возникнет проблема в перекладывании данных ClientDataSet-а уже в него... что вернет к решению с "классическим" запросом с параметрами для каждой записи. и нафига тогда лишние действия?
  • sniknik © (22.09.08 14:27) [10]
    > и получаешь готовый inserts.sql
    т.е. вариант с полным переносом данных ClientDataSet-а в запрос, только через посредника...
    и с тем же ограничением на размер запроса, если не делать его через Query Analyzer либо не писать к нему "выполнитель пакета", он же там не в одну команду делает? а пакет команд. тогда кстати +, для аксесса(jet) не пойдет, т.к. он не понимает больше одной команды за раз.
  • MsGuns © (22.09.08 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 © (22.09.08 15:36) [12]
    Блин, после break еще две строки

     end;
     Next;
  • Раиса © (22.09.08 16:03) [13]
    Ничего сложного. Я обычно Connection.RollbackTrans в try ..except пишу...

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

    Но хотелось без цикла одним запросом...
  • clickmaker © (22.09.08 16:06) [14]
    > [12] MsGuns ©   (22.09.08 15:36)
    > Блин, после break еще две строки
    >
    > end;
    > Next;

    ну вот, всю малину испортил... :)
  • Johnmen © (22.09.08 17:00) [15]
    Есть такое предположение, что автору и вовсе не нужен CDS, а достаточно TADODataSet на всё про всё...
  • MsGuns © (22.09.08 19:36) [16]
    О, еще и Free забыл ;)
    Хотя, автору, похоже, это все до "дверцы", ей надо "одним запросом"
  • Petr V. Abramov © (22.09.08 23:17) [17]

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

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

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

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

    даже на "взрослых" базах это не делается ни через BDE, ни через ADO, хоть .НЕТ, хоть ни.НЕТ, только через спецкомпоненты
 
Конференция "Базы" » ClientDataSet и Insert .... select ... from что? [D7, Access]
Есть новые Нет новых   [134473   +28][b:0][p:0.001]