簡體   English   中英

使用訪問 vba 通過變量傳遞登錄以自動登錄到 Sage Line 50 ver20

[英]Using access vba to pass the login via variables to automate the login to Sage Line 50 ver20

因此,我設法將 Sage 連接到我的 Access 數據庫,這很棒,但是每次我關閉數據庫並再次打開它時,我都必須再次手動登錄,是否可以將這些數據存儲在 Access 中? 無論是通過變量還是表,因為顯然訪問可以將登錄信息保存在某處,因為我只需要登錄一次。

編輯 - 添加登錄連接詳細信息

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

我不知道 Sage 50,但我使用過 Sage 300 API,這大概是相似的; 您可以/應該存儲 Sage 會話的實例,並在需要 Sage 連接時保持活動狀態。

我使用過的會話接口需要初始化,然后打開; 你的代碼需要提供一個字符串句柄、一個appID、一個程序名和一個要初始化的應用程序版本,然后當你打開會話時你需要一個用戶名、一個密碼和一個數據庫名。

這是我正在使用的 C# 包裝器接口(參考 Sage 的 COM API),它顯示了值是如何傳遞的:

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);

因此,讓您的代碼提供UserIdPasswordDatabaseName 、時間戳以及您需要的任何DBLinkFlags 您的 VBA 代碼可能如下所示:

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

其中mySession是一個全局對象變量,那么APP_USERID來自何處完全取決於您。 .Open調用中對它們進行硬編碼,使它們成為代碼中的常量,或者使它們成為代碼中的變量並將值存儲在您的 Access 數據庫或外部 xml 配置文件中,任何事情都可以; 首先讓硬編碼憑證工作,然后找出一個策略來參數化它們。

這可能解釋了為什么每次都會提示您輸入登錄信息。 我認為您正在使用兩個打開 - 但只有一個與您的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM