Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Таьлица в памяти [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;

все, имеем рекордсет в памяти компьютера, можно дабавлять/менять база не изменится, структура будет зависит от базовых полей в запросе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо