![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Таьлица в памяти [D7, MSSQL]
ВИКТОР © (2004-03-19 18:49:00)Помогите пожалуйста.
Мне нужно считать несколько записей из Recordsetа и поместить их в памяти компьютера. Для этого требуется создать структуру , которая будет хранить в памяти этот небольшой массив записей.
Как это сделать ведь я не знаю не количество полей ни их типы, так как Recordset может быть разным, то есть ссылаться на разные таблицы.
Заранее спасибо за помощь.
KSergey (2004-03-22 18:58:00) [1]Всем спасибо!
Наконец-то есть куда рыть! ;)
sniknik (2004-03-22 12:12:00) [2]Nikky © (22.03.04 11:29) [9]
нет не получается, редактировать не хочет.
а вот так как у > Hooch © работает (также как со временной таблицей)
видать както он всетаки понимает, что его "обманывают" и не дает этого сделать. также не дает редактировать константные выражения в запросе (такие к примеру cast (1 as int) AS ID)
т.е. дело не только в автоикременте, есть еще какойто признак "константности"/"получения значения только с сервера".
в общем надо разбиратся, если нужно менять именно рекордсет на клиенте, и возможно это невозможно ессли например константное значение представленно в рекордсете ссылкой на значение, или есть какието различия в структуре рекордсета редактируемые/нередактируемые поля (т.е. не только признаки/опции)
использовать клиентдатасет наверняка можно, но это задачка немного отличающаяся от исходной (с тем же успехом, делаем второй датасет(чтобы не привлекать мидас), сами формируем нужные поля(редактируемые) и перекачиваем данные) не того класса задачка (ИМХО). одно дело разобратся во внутренностях рекордсета другое найти ему замену.
Mike_Goblin (2004-03-22 11:31:00) [3]Сталкивался с такой проблемой, нашел три пути решения
1. Использование ADODataSet в отключенном режиме. то есть данные хранятся в памяти, при завершении приложения сбрасываются на диск. см решение от siknik
2. Использование briefcase модели средствами MIDAS http://www.rsdn.ru/article/db/midas_briefcase.xml
3. Использование Memory datasets
Nikky (2004-03-22 11:29:00) [4]Дело в том что поле ms sql identity создается в Дельфе как tAutoIncField, его нельзя редактировать соответственно.
Если в запросе указать id = cast (id as int), то создастся как tIntegerField и будет доступно для редактирования (снять флажок ReadOnly)
sniknik (2004-03-22 10:29:00) [5]KSergey © (22.03.04 08:00) [3]
прочитал ;о)
чего ответить не знаю. :( не делал подобного.
для MSSQL так не получилось (ReadOnly поменять у поля), вот у access это проходит, если автоинкременту при подключении к access поменят ридонли, он прекрасно редактируется в отсоедененном рекордсете.
можно посмотреть разницу, какого типа возвращает поля access/mssql ... ну в общем разобратся. может и получится сменить тип на клиенте (либо предварительно нужного создать перед запросом)
но похоже проще воспользоваться от > Hooch © (22.03.04 08:40) [4]
должно пройти (хотя так не пробовал, пока)
Hooch (2004-03-22 09:07:00) [6]ошибся немного
declare @MyTable table(ID int, name varchar(1000))
Hooch (2004-03-22 09:02:00) [7]ms sql 2000
KSergey (2004-03-22 08:53:00) [8]> [4] Hooch © (22.03.04 08:40)
Это синтаксис какого сервера? 2k?
Hooch (2004-03-22 08:40:00) [9]можно либо DataSet полность ручками сделать через CreateDataSet но я обычно так делал: в DataSet.CommandText пишем:
declare @MyTable(ID INT, NAME VARCHAR(100))
insert into @MyTable select X,Y from Z
select * from @MyTable
потом либо Connection=nil либо LockType = ltBatchOptimistic и любое поле можно редактировать
KSergey (2004-03-22 08:00:00) [10]Позволю себе поднять тему
Может многоуважаемый sniknik © найдет возможность прочитать и ответить? ;)
KSergey (2004-03-21 07:29:00) [11]sniknik, ты - гений!!!!
Я 2 года искал как сделать нечто подобное, но все, кто, возможно, и знал - делали лишь умные рожи или ссылались на коммерческие секреты...
А как все просто, оказывается!
А может, если не очень затруднит, дашь рецепт оставшейся небольшой проблемки: если в DataSet есть поле главого ключа, то после "отрыва" дельфи не дает его править, либо (после того как я принудительно снял флажек "ReadOnly у поля) провайдер ADO'шный стал писать "произошли ошибки во время выполнения многошаговой операции". В принципе и без этого можно жить, но для новых записей таки хотелось бы как-то это поле прописывать...
Может подскажете как??
А может вообще можно где-то читнуть про все это (ADO'шный DataSet в "автономном" режиме)? Что-то мне на ум слова не приходят подходящие для поиска...
sniknik (2004-03-19 19:05:00) [12]ADODataSet1.CommandText:= 'SELECT TOP 10 * FROM xXxxxx';
ADODataSet1.Open;
ADODataSet1.Connection:= nil;
все, имеем рекордсет в памяти компьютера, можно дабавлять/менять база не изменится, структура будет зависит от базовых полей в запросе.