Главная страница
    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.49 MB
Время: 0.004 c
10-1158422614
aglar
2006-09-16 20:03
2009.06.07
Вставить слово в ворд.. не знаю даже, с чего начать...


15-1238827193
dreamse
2009-04-04 10:39
2009.06.07
Плагины для IE


2-1240556887
Vladislav
2009-04-24 11:08
2009.06.07
Как внести программу в контекстное меню Windows


15-1238237325
TUser
2009-03-28 13:48
2009.06.07
Ну, что, инженеры? Слабо?


15-1238836531
rnts
2009-04-04 13:15
2009.06.07
С днём web-программиста!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский