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