2016-06-15 27 views
0

所以我設法連接Sage到我的訪問數據庫,這是偉大的,但每次我關閉數據庫並再次打開它,我必須登錄無論如何手動存儲在Access數據?無論是通過變量還是表格,因爲顯然訪問可以將登錄信息保存在某個地方,因爲我只需要登錄一次。使用訪問vba通過變量傳遞登錄自動登錄到Sage Line 50 ver20

編輯 - 添加登錄連接細節

Sub login_Click() 
    Dim sagedb As Database 
    Dim accessdb As Database 
    Dim rs As Recordset 
    Dim strConnect As String 
    Set sagedb = OpenDatabase("Directory") 
    strConnect = "DSN=SageAccountsVer20;uid=xxx;pwd=xxx;" 
    Set accessdb = OpenDatabase("", False, False, strConnect) 
    accessdb.Close 
    Set accessdb = Nothing 
    Set rs = sagedb.OpenRecordset("dbo_authors") 
    Debug.Print rs(0) 
    Debug.Print "Recordset Opened Successfully" 
    rs.Close 
    sagedb.Close 
    Set rs = Nothing 
+0

*因爲我只需要爲每個「會話」登錄一次,如果這是正確的術語 –

+0

顯示您的連接字符串和連接代碼 – dbmitch

+0

子login_Click() 昏暗sagedb數據庫 昏暗ACCESSDB數據庫 昏暗RS作爲Recordset Dim strConnect As String Set sagedb = OpenDatabase(「Directory」) strConnect =「DSN = SageAccountsVer20; uid = xxx; pwd = xxx;」 Set accessdb = OpenDatabase(「」,False,False,strConnect) accessdb.Close Set accessdb = Nothing Set rs = sagedb。OpenRecordset( 「dbo_authors」) Debug.Print RS(0) Debug.Print 「記錄成功舉辦」 rs.Close sagedb.CloseSet RS =什麼 –

回答

0

不知賢者50,但我已經與賢者300 API,這大概是類似的工作;您可以/應該存儲您的Sage會話實例,並保持活動狀態,只要您需要Sage連接存活即可。

我與之合作過的會話界面需要初始化,然後打開;您的代碼需要提供一個字符串句柄,一個appID,一個程序名稱和一個應用程序版本以進行初始化,然後當您打開會話時,您需要一個用戶ID,一個密碼和一個數據庫名稱。

下面是我使用(referenging賢者COM API)一個C#包裝界面,顯示的值是如何傳遞:

public interface ISession : IDisposable 
{ 
    void Init(string handle, SageAppInfo info); 
    void Open(SageCredential credential, DateTime timestamp, int flags = 0); 
    IDbLink OpenDbLink(DBLinkType type, DBLinkFlags flags); 
    IEnumerable<string> Errors { get; } 
} 

public class SessionWrapper : ISession 
{ 
    private readonly ISessionComInterop _session; 

    public SessionWrapper(ISessionComInterop session) 
    { 
     _session = session; 
    } 

    public void Init(string handle, SageAppInfo info) 
    { 
     _session.Init(handle, info.AppId, info.ProgramName, info.AppVersion); 
    } 

    public void Open(SageCredential credential, DateTime timestamp, int flags = 0) 
    { 
     _session.Open(credential.UserId, credential.Password, credential.DatabaseName, timestamp, flags); 
    } 

    public IDbLink OpenDbLink(DBLinkType type, DBLinkFlags flags) 
    { 
     return new DbLinkWrapper(_session.OpenDBLink(type, flags)); 
    } 

    public IEnumerable<string> Errors 
    { 
     get 
     { 
      for (var i = 0; i < _session.Errors.Count; i++) 
      { 
       yield return string.Format("[{0}] {1} ({2})", _session.Errors[i].Code, _session.Errors[i].Message, _session.Errors[i].Source); 
      } 
     } 
    } 

    public void Dispose() 
    { 
     _session.Dispose(); 
    } 
} 

理所當然的VBA實施將是完全不同的,但重要的部分是這樣的:

_session.Open(credential.UserId, credential.Password, credential.DatabaseName, timestamp, flags); 

我的調用代碼看起來是這樣的:

_session.Init(string.Empty, _info); 
_session.Open(_credential, DateTime.Now); 
_db = _session.OpenDbLink(DBLinkType.Company, DBLinkFlags.ReadWrite); 

所以,請提供您的代碼UserId a PasswordDatabaseName,時間戳和您需要的任何DBLinkFlags;您的VBA代碼看起來是這樣的:

mySession.Open APP_USERID, APP_PWD, APP_TESTDB, Now, DBLinkFlags.ReadWrite 

mySession是一個全局對象變量,那麼無論APP_USERID來自完全取決於你。在.Open調用中對它們進行硬編碼,使它們成爲代碼內常量,或者將它們設置爲代碼內變量並將值存儲在Access數據庫或外部xml配置文件中,這些都是可行的;首先獲取硬編碼證書的工作,然後找出一個策略來對它們進行參數化。

+0

謝謝你我會看一看你的建議。連接字符串,我認爲這將工作是「DSN = SageAccountsVer20; uid = xxx; pwd = xxx;」似乎我見過很多。我會告訴你我是如何得到真正感謝的幫助。 –

0

這也許可以解釋爲什麼每次登錄信息時都會收到提示。 我想你正在使用兩個打開 - 但只有一個與你的connxn字符串連接。

這是否更好?

Dim sagedb As Database 
    Dim rs As Recordset 
    Dim strConnect As String 

    strConnect = "DSN=SageAccountsVer20;uid=xxx;pwd=xxx;" 
    Set sagedb = OpenDatabase("Directory", False, False, strConnect) 
    Set rs = sagedb.OpenRecordset("dbo_authors") 

    Debug.Print rs(0) 
    Debug.Print "Recordset Opened Successfully" 

    rs.Close 
    sagedb .Close 
    Set sagedb = Nothing 

    sagedb.Close 
    Set rs = Nothing