Ms Access, интерфейс PostgreSQL, эффективный оператор INSERT INTO ... RETURNING ... - PullRequest
1 голос
/ 26 сентября 2010

HI

Я использую MS Access в качестве интерфейса к базе данных PostgreSQL. И я зашел в тупик:

Как бы я мог получить возвращаемое значение сквозного оператора SQL INSERT?

Я пробовал что-то вроде этого:

strSQL = "INSERT INTO someTable (col1, col2) VALUES ('val1', 'val2') RETURNING col0"
'Create passtrhough query dynamically (another function)
CreateSPT ("some_temp_query", strSQL)
idvalue = DLookup("col0", "some_temp_query")

Видимо, таким образом оператор INSERT будет вызываться 2 раза :) Кто-нибудь знает, как правильно? У меня кончились идеи

Редактировать: я использую последние драйверы psqlODBC

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

Предполагая, что у вас есть сохраненный проходной запрос, вы можете на лету изменять sql и таким образом возвращать значения.Следующий код выполняется без необходимости даже объявлять какие-либо переменные.

With CurrentDb.QueryDefs("qryPassReturn")
   .SQL = "INSERT INTO someTable (col1, col2) VALUES ('val1', 'val2') RETURNING col0"
   Debug.Print .OpenRecordset()(0)
End With

Я полагаю, вы могли бы объявить reocrdset для получения возвращаемого значения и перейти:

Dim rstReturn  As DAO.Recordset

With CurrentDb.QueryDefs("qryPassReturn")
   .SQL = "INSERT INTO someTable (col1, col2) VALUES ('val1', 'val2') RETURNING col0"
   Set rstReturn = .OpenRecordset
End With

Debug.Print rstReturn(0)

Итак, выможет просто передать sql, и возвращенные значения появятся как стандартный reocrdset.Итак, первый пример должен работать нормально, и обратите внимание, что я даже не объявил один varialbe, чтобы сделать эту работу.Вы, как уже упоминалось, просто нуждаетесь в сохраненном проходном запросе.

0 голосов
/ 26 сентября 2010

Кажется, что функция ниже делает трюк ... Хотя не уверен насчет производительности:)

'Insert-SQL passthroug
'Pass here all the insert statements
Function ISPT(SQLString)
Dim strODBCString As String
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim result As Long

    strODBCString = _
      "DRIVER={PostgreSQL Unicode};DATABASE=" & settings_getDBName() & _
      ";SERVER=" & settings_getServerAddress & _
      ";PORT=" & settings_getServerPort & _
      settings_getConnStrParams

      cn.Open strODBCString

      rs.Open SQLString, cn


      'return value
      result = rs.Fields(0).Value



    'Cleanup
    If rs.state <> adStateClosed Then rs.Close
    Set rs = Nothing
    If cn.state <> adStateClosed Then cn.Close
    Set cn = Nothing

    ISPT = result

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...