Re: Access end Postgres - Mailing list pgsql-odbc

From Philippe Lang
Subject Re: Access end Postgres
Date
Msg-id 6C0CF58A187DA5479245E0830AF84F4218CBDA@poweredge.attiksystem.ch
Whole thread Raw
In response to Access end Postgres  (Jone <j.haran@hizkia.fr>)
List pgsql-odbc
Hi,

Everytime there is a user switch, I force the user to quit and open Access again. In my case, this an acceptable
option. 

But someone sent me code to do that some time ago. I haven't tested that at all. Here it is. Thanks for your feedback.

Philippe


---------------------------



De : Nyle Davis [mailto:davisoft@core.com]

Envoyé : jeudi, 8. septembre 2005 20:11

À : Philippe Lang

Objet : PGSQL Entry - MS Access Linked Table





Philippe,



The reason you are having to shut down Access is you do not close out your connections in Access.



The example you are using:



*****************************************************************************************



'***************************************************************

'The DoesTblExist function validates the existence of a TableDef

'object in the current database. The result determines if an

'object should be appended or its Connect property refreshed.

'***************************************************************

Function DoesTblExist(strTblName As String) As Boolean

On Error Resume Next

Dim db As DAO.Database, tbl As DAO.TableDef

Set db = CurrentDb

Set tbl = db.TableDefs(strTblName)

If Err.Number = 3265 Then ' Item not found.

DoesTblExist = False

Exit Function

End If

DoesTblExist = True

End Function



Function CreateODBCLinkedTables() As Boolean

On Error GoTo CreateODBCLinkedTables_Err

Dim strTblName As String, strConn As String

Dim db As DAO.Database, rs As DAO.Recordset, tbl As DAO.TableDef

Dim strDSN as String

' ---------------------------------------------

' Register ODBC database(s).

' ---------------------------------------------

Set db = CurrentDb

Set rs = db.OpenRecordset("Select * From tblODBCDataSources Order By DSN")

With rs

While Not .EOF

If strDSN <> rs("DSN") Then

DBEngine.RegisterDatabase rs("DSN"), _

"SQL Server", _

True, _

"Description=VSS - " & rs("DataBase") & _

Chr(13) & "Server=" & rs("Server") & _

Chr(13) & "Database=" & rs("DataBase")

End If

strDSN = rs("DSN")

' ---------------------------------------------

' Link table.

' ---------------------------------------------

strTblName = rs("LocalTableName")

strConn = "ODBC;"

strConn = strConn & "DSN=" & rs("DSN") & ";"

strConn = strConn & "APP=Microsoft Access;"

strConn = strConn & "DATABASE=" & rs("DataBase") & ";"

strConn = strConn & "UID=" & rs("UID") & ";"

strConn = strConn & "PWD=" & rs("PWD") & ";"

strConn = strConn & "TABLE=" & rs("ODBCTableName")

If (DoesTblExist(strTblName) = False) Then

Set tbl = db.CreateTableDef(strTblName, _

dbAttachSavePWD, rs("ODBCTableName"), _

strConn)

db.TableDefs.Append tbl

Else

Set tbl = db.TableDefs(strTblName)

tbl.Connect = strConn

tbl.RefreshLink

End If



rs.MoveNext

Wend

End With

CreateODBCLinkedTables = True

MsgBox "Refreshed ODBC Data Sources", vbInformation

CreateODBCLinkedTables_End:

Exit Function

CreateODBCLinkedTables_Err:

MsgBox Err.Description, vbCritical, "MyApp"

Resume CreateODBCLinkedTables_End

End Function



*****************************************************************************************



Needs the following additional actions/code:



Create a "Globals" module with that name under Insert + Module



Add the following statements to it:



Public db As DAO.Database, tbl As DAO.TableDef

Public strConn As String, rs As DAO.Recordset

Public LinkStr As String



Save the Module! Remember name=Globals



Delete those definitions from your existing code blocks



Add the following functions (Preferrably also in the Globals module, but not necessary)



Public Function DropLinked(LinkTab as string) As Boolean

Dim n as integer

For n = 1 to words(LinkTab)

db.TableDefs.Delete word(LinkTab,n)

next n

rs.close

tbl.close

strConn.close

Set rs = Nothing

Set tbl = Nothing

Set strConn = Nothing

End Function

Public Function Words(MyWLine As String) As Integer

' Find the Words in the input string whether

' Blank <" ">, Comma <","> or Blank+Comma <", "> separated

Dim bCount As Integer, cCount As Integer, bcCount As Integer

Words = 0

bCount = UBound(Split(MyWLine, " ")) + 1

cCount = UBound(Split(MyWLine, ",")) + 1

bcCount = UBound(Split(MyWLine, ", ")) + 1

If bcCount > 0 Then

Words = bcCount

ElseIf bCount > 0 Then

Words = bCount

ElseIf cCount > 0 Then

Words = cCount

End If

End Function

Public Function Word(MyWLine As String, MyIdx As Long) As String

' Find the nth Word in the input string

Dim MyArr1() As String, MyArr2() As String, MyArr3() As String

Word = MyWLine

If Len(MyWLine) > 0 Then

MyArr1 = Split(MyWLine, " ")

MyArr2 = Split(MyWLine, ",")

MyArr3 = Split(MyWLine, ", ")

If UBound(MyArr3) < MyIdx And MyArr3 <> "" Then

Word = myarr(MyIdx - 1)

ElseIf UBound(MyArr1) < MyIdx And MyArr1 <> "" Then

Word = myarr(MyIdx - 1)

ElseIf UBound(MyArr2) < MyIdx And MyArr2 <> "" Then

Word = myarr(MyIdx - 1)

End If

End If

End Function



Also add this line to the CreateODBCLinkedTables routine:



LinkStr = LinkStr & " " & tbl



Right after the line



db.TableDefs.Append tbl



When you intend to refresh the links do so with:



Sub Refresh()

Call DropLinked(LinkStr)

Call CreateODBCLinkedTables

End Function



I think this will solve your problem. If it does or you have to make changes please repost so all can have as a
resource.



Thanks!



OldManRiver



PS. Word and Words have just been modified and testing is not complete. Let me know if they cause problems and I'll
updateyou with tested code. 



--

CoreComm Webmail.

http://home.core.com



------- End of forwarded message -------



Nyle Davis

Account Manager/Analyst

(972)-252-6657

davisoft@megsinet.net


-----Message d'origine-----
De : pgsql-odbc-owner@postgresql.org [mailto:pgsql-odbc-owner@postgresql.org] De la part de Jone
Envoyé : jeudi, 22. septembre 2005 10:32
À : pgsql-odbc@postgresql.org
Objet : [ODBC] Access end Postgres

Hello,
I am working with Microsoft Access 2003 accessing a postgres database via ODBC.
I would like to know the best way to change the current user logged in the database without closing my application.

I have made a module that create linked table (ODBC without DSN). If i use it with a first user it works fine but then
ifi delete all the links and then link my table with another user, when i access the table i have always the rights
affectedto the first user and in the postgres logs i can see that it is always the first user that is identified. But
ifi execute an ODBC request by program with the second user (without using the linked table), in the logs i can see
thatthe second user has really executed that request. 
I have also executed the command "set session authorization" but it dose not seem to work even with a super-user.

Can anyone help me on this issue ?
Thank you by advance.

--
Jone SAUBABER HARAN
HIZKIA Informatique
64100 Bayonne (FRANCE)




---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

               http://archives.postgresql.org



pgsql-odbc by date:

Previous
From: Jone
Date:
Subject: Access end Postgres
Next
From: "Philippe Lang"
Date:
Subject: ODBC driver types