powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скопировать данные из рекордсета в таблицу
15 сообщений из 15, страница 1 из 1
Скопировать данные из рекордсета в таблицу
    #32648815
Раз (1)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня в 97-м аксессе рекордсет, который через ODBC заполняется результатами выполнения хранимой процедуры MS SQL 2000. Открывается он почему-то только в режиме ForwardOnly, но это, как я понял, неизлечимо.
Мне же необходимо пройтись по нему в цикле несколько раз. Для этого я хочу скопировать данные из этого рекордсета в таблицу аксесса, специально для этого заведенную, и работать уже с ее табличным рекордсетом.
Вопрос - как лучше скопировать данные? Сейчас я открываю табличный рекордсет, прохожу в цикле по своему исходному и копирую все записи по полям, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
do while not rs1.EOF
  rs2.addnew
  
  rs2.fields("field1").value = rs1.fields("field1").value
  (...)
  rs2.fields("fieldN").value = rs1.fields("fieldN").value
  
  rs2.update
  rs1.movenext
loop

Можно ли как нибудь более быстро и изящно?
Или может быть все-таки есть возможность открыть такой рекордсет в режиме, отличном от ForwardOnly?
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32648824
Фотография Talen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если таблицы одинаковы, то можно так:
Код: plaintext
1.
    DoCmd.RunSQL "INSERT INTO newTable SELECT * FROM oldTable"
если разные, то так:
Код: plaintext
1.
    DoCmd.RunSQL "INSERT INTO new Table (field1, field2, ...) SELECT f1 as field1, field2 FROM oldTable"
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32648827
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поиграйся с параметрами открытия рекордсета
Типа
rs.Open strSQL, Cnn, adOpenDynamic (например)

По поводу временной таблы
А почему нельзя ее на стороне сервера (MSSQL) сделать?
Типа
Код: plaintext
1.
2.
3.
Create Table #tmp ...

Insert Into #tmp
Exec sp_MyProc1
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32648843
Раз (1)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TalenЕсли таблицы одинаковы, то можно так:
Код: plaintext
1.
    DoCmd.RunSQL "INSERT INTO newTable SELECT * FROM oldTable"
если разные, то так:
Код: plaintext
1.
    DoCmd.RunSQL "INSERT INTO new Table (field1, field2, ...) SELECT f1 as field1, field2 FROM oldTable"

Если бы источником данных была таблица, то и вопросов бы не было :)
А там рекордсет, и опять же не на основе родной аксессовской таблицы, а на основе процедуры MS-SQL...

paparome
Поиграйся с параметрами открытия рекордсета
Типа
rs.Open strSQL, Cnn, adOpenDynamic (например)

Игрался вроде всячески... :(

авторПо поводу временной таблы
А почему нельзя ее на стороне сервера (MSSQL) сделать?

Потому что мне данные из нее в Аксессе нужны
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32648854
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ключевое поле в выборке присутствует?

А текст ХП покажите?
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32648909
Раз (1)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paparome
А ключевое поле в выборке присутствует?

А текст ХП покажите?

Текст ХП:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
(...)
 -- здесь пропущено формирование таблицы @tItems,  
 -- оно (формирование) длинное и нудное, и дело вряд ли в нем :) 
 -- Итоговая выборка такая:  
(...)
SELECT
  TicketVexelItem.TicketVexelItemID ,
  BoundVexelDog = 
  CASE
    WHEN t.DogN IS NULL AND t.DogDate IS NULL THEN
      '(нет)'
    ELSE
      '№ ' + 
      CASE
        WHEN t.DogN IS NULL THEN
          '(нет)'
        ELSE
          LTRIM(RTRIM(STR(t.DogN)))
      END +
      ' от ' + 
      CASE
        WHEN t.DogDate IS NULL THEN
          '(нет)'
        ELSE
          CONVERT(varchar( 20 ), t.DogDate,  4 )
      END
  END ,
  TicketVexelItem.Selected
FROM
  TicketVexelItem
  LEFT JOIN
    @tItems t
  ON ( TicketVexelItem.TicketVexelItemID = t.TicketVexelItemID )
WHERE
  TicketVexelItem.TicketVexelID = @TicketVexelID

Поле TicketVexelItemID ключевое, то есть Primary Key на сервере.
Это имеет какое-то значение для возможности открывать полученный рекордсет в Аксессе в режиме не-ForwardOnly?
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32648998
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET NOCOUNT ON в начале ХП стоит?
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32649015
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 paparome: SET NOCOUNT ON Влияет только на трафик, не засоряй человеку мозги.
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32649030
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
F rf cjа ка собственно открывается рекордсет? Openrecordset - в студию!
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32649291
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Proga2 paparome: SET NOCOUNT ON Влияет только на трафик, не засоряй человеку мозги.
Вот тебе FAQ на эту тему http://www.sql.ru/faq/faq_topic.aspx?fid=111
И сходи на соседний форум (тот что по MSSQL) с этим заявлением - много нового о себе как о программисте узнаешь!
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32649532
lsnk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все нижесказанное имхо:
Используя odbc соединение и получая данные из хп обновляемый рекордсет вроде не получишь, это вроде тока в адо и то в .net.
В таких случаях я делал так - создовал в запросах запрос к серверу (хотя постоянный иметь наверно не обязательно, можно каждый раз создовать программно, но так было проще) типа mysp @parametr1 и тд в программе через свойство запроса .sql подставлял нужную стороку(если менябтся параметры, если без параметров то и менять ничего не надо), после чего:
docmd.RunSQL "insert into t (....) from сохраненный запром к серверу " (сорри не помня точный синтаксис :), но смысл думаю ясен - одним запросом заполняем таблицу )
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32650226
Раз (1)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри что пропал, не было меня в выходные в инете.

По порядку:
paparomeSET NOCOUNT ON в начале ХП стоит?
Нет, сейчас попробовал поставить - не повлияло ни на что.
У меня данные-то в рекордсет корректно передаются, проблема только в том, что он ForwardOnly, и никакими силами мне этого изменить не удалось.

Alexey Shка собственно открывается рекордсет? Openrecordset - в студию!
Вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Dim loWS As DAO.Workspace, loConn As DAO.Connection, loRS As DAO.Recordset
Dim lcSQLString As String

lcSQLString = "EXEC sp_TicketVexel_Get_BoundVexelDog " & Trim(Str(Me.ticketVexelID.Value))

Set loWS = CreateWorkspace("NewODBCWorkspace", "admin", "", dbUseODBC)
Set loConn = loWS.OpenConnection("Connection1", dbDriverNoPrompt, , "ODBC;DATABASE=bo;UID=;PWD=;DSN=bo")
Set loRS = loConn.OpenRecordset(lcSQLString, dbOpenDynaset)
При чем вместо dbOpenDynaset можно ставить любую другую допустимую константу из хэлпа к 97-му Аксессу, разницы никакой.

lsnkВсе нижесказанное имхо:
Используя odbc соединение и получая данные из хп обновляемый рекордсет вроде не получишь, это вроде тока в адо и то в .net.
В таких случаях я делал так - создовал в запросах запрос к серверу (хотя постоянный иметь наверно не обязательно, можно каждый раз создовать программно, но так было проще) типа mysp @parametr1 и тд в программе через свойство запроса .sql подставлял нужную стороку(если менябтся параметры, если без параметров то и менять ничего не надо), после чего:
docmd.RunSQL "insert into t (....) from сохраненный запром к серверу " (сорри не помня точный синтаксис :), но смысл думаю ясен - одним запросом заполняем таблицу )
Обновляемый мне и не нужен, пусть он будет ReadOnly, но только чтобы по нему можно было больше одного раза пройти :)
А данные нужно обрабатывать именно в Аксессе, чтобы сравнить их с локальными аксессовскими же данными...

Спасибо всем кто ответил, я так думаю что наверно Бог с ним с рекордсетом, есть в нем нужные данные и хорошо, а ситуация с ForwardOnly в 97-м наверно неразрешима.
В общем-то единственный оставшийся вопрос - можно ли скопировать данные из этого рекордсета в таблицу Аксесса более красивым способом, чем в заглавном топике? Или пусть работает так, если уж работает?
Вопрос собственно возник из-за того, что сейчас данных таким образом обрабатывается немного (порядка 5-10 записей), и я не уверен что эта конструкция не начнет жутко тормозить при сотнях или тысячах записей.
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32650413
lsnk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну я же предложил вам способ одним запросом заполнить локальную таблицу(без использования рекордсета). Чем он не подходит?
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32650468
Раз (1)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsnkВ таких случаях я делал так - создовал в запросах запрос к серверу (хотя постоянный иметь наверно не обязательно, можно каждый раз создовать программно, но так было проще) типа mysp @parametr1 и тд в программе через свойство запроса .sql подставлял нужную стороку(если менябтся параметры, если без параметров то и менять ничего не надо), после чего:
docmd.RunSQL "insert into t (....) from сохраненный запром к серверу " (сорри не помня точный синтаксис :), но смысл думаю ясен - одним запросом заполняем таблицу )

lsnkНу я же предложил вам способ одним запросом заполнить локальную таблицу(без использования рекордсета). Чем он не подходит?

Ага, со второго раза мне удалось разбить ваш поток сознания на отдельные мысли. :)

Думаю это примерно то что надо, большое спасибо. Я как-то совершенно забыл, что в запросы к серверу действительно можно передавать параметры, хоть и таким извращенным способом как полная смена текста запроса :)
...
Рейтинг: 0 / 0
Скопировать данные из рекордсета в таблицу
    #32650619
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все дегко получается если воспользоваться pass-through queries
Создаю query с connection на сервер, текст его: EXEC ХП, после этого открываю рекордсет
Dim db As DAO.Database: Set db = CurrentDb
Dim rs As DAO.Recordset: Set rs = db.OpenRecordset("Qry", dbOpenSnapshot)
и гуляю по нему как хочу
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скопировать данные из рекордсета в таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]