Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скопировать данные из рекордсета в таблицу / 15 сообщений из 15, страница 1 из 1
13.08.2004, 14:28:43
    #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
13.08.2004, 14:33:55
    #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
13.08.2004, 14:36:37
    #32648827
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать данные из рекордсета в таблицу
Поиграйся с параметрами открытия рекордсета
Типа
rs.Open strSQL, Cnn, adOpenDynamic (например)

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

Insert Into #tmp
Exec sp_MyProc1
...
Рейтинг: 0 / 0
13.08.2004, 14:42:15
    #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
13.08.2004, 14:45:17
    #32648854
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать данные из рекордсета в таблицу
А ключевое поле в выборке присутствует?

А текст ХП покажите?
...
Рейтинг: 0 / 0
13.08.2004, 15:01:26
    #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
13.08.2004, 15:31:29
    #32648998
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать данные из рекордсета в таблицу
SET NOCOUNT ON в начале ХП стоит?
...
Рейтинг: 0 / 0
13.08.2004, 15:38:45
    #32649015
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать данные из рекордсета в таблицу
2 paparome: SET NOCOUNT ON Влияет только на трафик, не засоряй человеку мозги.
...
Рейтинг: 0 / 0
13.08.2004, 15:46:23
    #32649030
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать данные из рекордсета в таблицу
F rf cjа ка собственно открывается рекордсет? Openrecordset - в студию!
...
Рейтинг: 0 / 0
13.08.2004, 17:28:18
    #32649291
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать данные из рекордсета в таблицу
Proga2 paparome: SET NOCOUNT ON Влияет только на трафик, не засоряй человеку мозги.
Вот тебе FAQ на эту тему http://www.sql.ru/faq/faq_topic.aspx?fid=111
И сходи на соседний форум (тот что по MSSQL) с этим заявлением - много нового о себе как о программисте узнаешь!
...
Рейтинг: 0 / 0
13.08.2004, 22:54:34
    #32649532
lsnk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать данные из рекордсета в таблицу
Все нижесказанное имхо:
Используя odbc соединение и получая данные из хп обновляемый рекордсет вроде не получишь, это вроде тока в адо и то в .net.
В таких случаях я делал так - создовал в запросах запрос к серверу (хотя постоянный иметь наверно не обязательно, можно каждый раз создовать программно, но так было проще) типа mysp @parametr1 и тд в программе через свойство запроса .sql подставлял нужную стороку(если менябтся параметры, если без параметров то и менять ничего не надо), после чего:
docmd.RunSQL "insert into t (....) from сохраненный запром к серверу " (сорри не помня точный синтаксис :), но смысл думаю ясен - одним запросом заполняем таблицу )
...
Рейтинг: 0 / 0
16.08.2004, 08:28:55
    #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
16.08.2004, 10:46:37
    #32650413
lsnk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать данные из рекордсета в таблицу
Ну я же предложил вам способ одним запросом заполнить локальную таблицу(без использования рекордсета). Чем он не подходит?
...
Рейтинг: 0 / 0
16.08.2004, 11:11:23
    #32650468
Раз (1)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать данные из рекордсета в таблицу
lsnkВ таких случаях я делал так - создовал в запросах запрос к серверу (хотя постоянный иметь наверно не обязательно, можно каждый раз создовать программно, но так было проще) типа mysp @parametr1 и тд в программе через свойство запроса .sql подставлял нужную стороку(если менябтся параметры, если без параметров то и менять ничего не надо), после чего:
docmd.RunSQL "insert into t (....) from сохраненный запром к серверу " (сорри не помня точный синтаксис :), но смысл думаю ясен - одним запросом заполняем таблицу )

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

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

Думаю это примерно то что надо, большое спасибо. Я как-то совершенно забыл, что в запросы к серверу действительно можно передавать параметры, хоть и таким извращенным способом как полная смена текста запроса :)
...
Рейтинг: 0 / 0
16.08.2004, 12:06:43
    #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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скопировать данные из рекордсета в таблицу / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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