-
Используя DBGrid, пользователь может ввести данные в ClientDataSet. Далее хочется выборку из полей записать одним select-ом в БД (например, mdb-файл). Не понимаю, что писать в конструкции Insert .... select ... from какое имя таблицы (таблицы вроде как бы нет, а если попытаться написать типа ClientDataSet1.FileName:='aa.mdb', и сделать выборку из ClientDataSet1.FileName, то выдается ошибка). Помогите, пожалуйста, или так нельзя сделать в случае с ClientDataSet?
-
Не понимаю, что писать в конструкции Insert .... select ... from какое имя таблицы
Никакое имя. Так как нет никакой таблицы
-
А как ВСЕ записи записать в таблицу ОДНИМ select-ом?
Даже если Access такого не подддерживает, то для MS SQL это нормальная конструкция...
-
> то для MS SQL это нормальная конструкция... сказки не рассказывай... ни один движок/sql сервер не "увидит" в запросе ClientDataSet. запрос выполняется "там", а ClientDataSet "здесь".
-
Может быть, некорректно написала, но insert into table1 select * from table2 для MS SQL нормально (где table1 и table2 - таблицы на сервере)
А как написать в случае использования ClientDataSet вместо table2?
-
> Может быть, некорректно написала, но > insert into table1 select * from table2 > для MS SQL нормально (где table1 и table2 - таблицы на сервере) для access это тоже будет нормально, никакой разницы.
> А как написать в случае использования ClientDataSet вместо table2? никак. ClientDataSet находится не на сервере, и связи к нему (isam/openrowset) не предусмотрено. только "классический" запрос со значениями, лучше в параметрах и по одной записи, но можно и из всего датасета значения в него загнать... (а после начинать спрашивать про ограничения длинны запросов...).
-
Про ограничения длины запросов мне спрашивать не приходилось...хотя есть запросы со многим количеством строк...
Я думала, что сохранение (например, в xml) могло бы мне помочь. Жаль, что никак...
-
> Я думала, что сохранение (например, в xml) могло бы мне > помочь
а xml-то здесь причем?
-
Я думала, что сохранение (например, в xml) могло бы мне помочь. Жаль, что никак...
лехко. сохраняешь весь пакет или только дельту в xml, далее делаешь ему transform с помощью xsl и получаешь готовый inserts.sql
-
> хотя есть запросы со многим количеством строк... пока везет.
> что сохранение (например, в xml) могло бы мне помочь. чем xml лучше чем ClientDataSet, если он в памяти? вот если это файл на диске в формате xml, тогда можно поискать, возможно есть isam для него. хотя лучше использовать существующий dBase/Paradox/Text/ODBC/..., правда опять возникнет проблема в перекладывании данных ClientDataSet-а уже в него... что вернет к решению с "классическим" запросом с параметрами для каждой записи. и нафига тогда лишние действия?
-
> и получаешь готовый inserts.sql т.е. вариант с полным переносом данных ClientDataSet-а в запрос, только через посредника... и с тем же ограничением на размер запроса, если не делать его через Query Analyzer либо не писать к нему "выполнитель пакета", он же там не в одну команду делает? а пакет команд. тогда кстати +, для аксесса(jet) не пойдет, т.к. он не понимает больше одной команды за раз.
-
Что сложного в таком коде:
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;
-
Блин, после break еще две строки
end; Next;
-
Ничего сложного. Я обычно Connection.RollbackTrans в try ..except пишу...
try Execute; except ShowMessage('Ooops'); Connection.RollbackTrans; break; end;
Но хотелось без цикла одним запросом...
-
> [12] MsGuns © (22.09.08 15:36) > Блин, после break еще две строки > > end; > Next;
ну вот, всю малину испортил... :)
-
Есть такое предположение, что автору и вовсе не нужен CDS, а достаточно TADODataSet на всё про всё...
-
О, еще и Free забыл ;) Хотя, автору, похоже, это все до "дверцы", ей надо "одним запросом"
-
> Далее хочется выборку из полей записать одним select-ом > в БД
идея правильная
> (например, mdb-файл).
в аксессе хрен выйдет (хотя могу ошибаться, тонкостей новых версий не знаю)
даже на "взрослых" базах это не делается ни через BDE, ни через ADO, хоть .НЕТ, хоть ни.НЕТ, только через спецкомпоненты
|