Импорт данных через ADO

nitrexin
Дата: 12.01.2012 13:12:56
Приветствую!

Стоит задача импорта из акцесса в постгрес, при чем испортировать надо любой объекти любой таблицы например:
из таблицы years акцесса перенести атрибут 'first year' в таблицу years, но уже постгреса.

CREATE TABLE year
(
"first year" smallint NOT NULL DEFAULT 0,
"first month" smallint NOT NULL DEFAULT 0,
CONSTRAINT year_pkey PRIMARY KEY ("first year" , "first month" )
)

Private Function connection()
Dim rst As ADODB.Recordset
Dim conn As ADODB.connection
Dim rs As dao.Recordset
Dim strselect As String
Dim strwhere As String
Dim a As String
Dim b As String
Dim tableName As String

Set rst = New ADODB.Recordset
Set conn = New ADODB.connection

conn.Open "Provider=PostgreSQL;Data Source=localhost;location=ap;User ID=postgres;password=test;"
conn.CommandTimeout = 5

rst.CursorLocation = 3
strselect = "select * from year"
rst.Open strselect, conn, adOpenKeyset, adLockOptimistic

Set TableName="year"

Set rs = CurrentDb.OpenRecordset(TableName, dbOpenTable)

'как реализовать сам импорт?

Do While Not rst.EOF

     rs.AddNew
     rs.Fields(0).Value = rst.Fields(0).Value 'rst.Fields(0)first year
     rs.Update
     rst.MoveNext
Loop 


conn.Close
Set conn = Nothing

End Function
Анатолий ( Киев )
Дата: 12.01.2012 14:09:46
nitrexin, а в чем вопрос?

Set TableName="year" - Set лишний.
nitrexin
Дата: 12.01.2012 14:26:28
Анатолий ( Киев ),

Спасибо, исправил. Не знаю как почему не работает цикл, вываливается еррор - ошибки во время выполнения многошаговой операции:
Do While Not rs.EOF
rst.AddNew
rst.Fields(0).Value = rs.Fields(0).Value 'rst.Fields(0)name
rst.Fields(1).Value = rs.Fields(1).Value 'rst.Fields(1)fam
rst.Update
rs.MoveNext
Loop

Мне надо прочесть значение из таблицы year акцесса и сделать добавление этого же значения в таблицу year, но уже в постгресе.
Анатолий ( Киев )
Дата: 12.01.2012 16:08:59
С постгрес не работал, поэтому - навскидку...
Ошибка так и звучит "ошибки во время выполнения многошаговой операции"? Т.е. часть записей заносится? Или это при первом же проходе?
А увеличить CommandTimeout?
А вместо CursorLocation = 3 (adUseClient) уеазать 3 (adUseServer)

И еще попробуйте:
rst.Open strselect, conn, adOpenKeyset, adLockBathOptimistic
а вместо rst.Update в цикле - rst.UpdateBath один раз по завершении цикла.

ЗЫ. А к постгрес нет ODBC драйвера?
nitrexin
Дата: 12.01.2012 17:00:10
Анатолий ( Киев ),

Да, ошибку привел дословно - "ошибки во время выполнения многошаговой операции". Попробывал изменить CursorLocation, CommandTimeout - не помогло. При изменении апдейта на rst.UpdateBath пишет, что нет такого метода.
Я не знаю преимуществ использования odbc, код не сильно меняется, только теперь проблема с запросом sqlCmd - column "2011" does not exists:

Private Function connection()
Dim rst As ADODB.Recordset
Dim conn As ADODB.connection
Dim rs As DAO.Recordset
Dim db As DAO.Database
Dim strselect As String
Dim strwhere As String
Dim a As String
Dim b As String
Dim Data() As Variant

Set rst = New ADODB.Recordset
Set conn = New ADODB.connection
Set db = CurrentDb()

ConnStr = "Driver={PostgreSQL Unicode};Server=localhost;Port=5432;Database=ap;Uid=postgres;Pwd=test;Timeout=5"
conn.CommandTimeout = 5
conn.ConnectionString = ConnStr
conn.Open

Set rs = db.OpenRecordset("year", dbOpenTable)

Do Until rs.EOF
sqlCmd = "insert into year (""" & rs.Fields(0).Name & """,""" & rs.Fields(1).Name & """)" & _
"Values (""" & rs.Fields(0).Value & """,""" & rs.Fields(1).Value & """)"
conn.Execute (sqlCmd)
rs.MoveNext
Loop

conn.Close
Set conn = Nothing

End Function


Подскажите как исправить, я уже все варианты перепробовал.
qwerty112
Дата: 12.01.2012 17:59:26
nitrexin,

1
CREATE TABLE year
(
"first year" smallint NOT NULL DEFAULT 0,
"first month" smallint NOT NULL DEFAULT 0,
CONSTRAINT year_pkey PRIMARY KEY ("first year" , "first month" )
)

поля в таб. - числовые, а вставляете - строки
2
незнаю, понимает ли постгрес "оковыченные" имена полей (?), - попробуйте взять их в []
Анатолий ( Киев )
Дата: 12.01.2012 19:59:02
nitrexin
При изменении апдейта на rst.UpdateBath пишет, что нет такого метода
При разных CursorLocation?
nitrexin
Я не знаю преимуществ использования odbc
Если создать и настроить DSN, то из Акса запросом вида:
SELECT ... INTO [ODBC;DSN=ИмяDSN].[year]
создать и заполнить таблицу. Только потом индексы добавить.
Или запросом вида:
INSERT INTO [ODBC;DSN=ИмяDSN].[year] ... SELECT...
Внести данные в ранее созданную таблицу.

Кстати "year" - не лучшее имя для объектов БД.
:-Q
Дата: 12.01.2012 20:03:49
Правильно UpdateBatch
Анатолий ( Киев )
Дата: 12.01.2012 20:11:41
Правильно UpdateBatch

И adLockBatchOptimistic тоже.
nitrexin
Дата: 14.01.2012 11:41:40
Анатолий ( Киев ),

Спасибо! решил проблему использованием odbc драйвера и UpdateBatch.