0

それで、Sageをアクセスデータベースに接続できましたが、データベースを閉じて再度開くたびに、手動で再度ログインする必要があります.そのデータをアクセスに保存する方法はありますか? ログインする必要があるのは一度だけであるため、明らかにアクセスするとログイン情報がどこかに保存されるため、変数またはテーブルを介してください。

編集 - ログイン接続の詳細を追加

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
4

2 に答える 2

0

私は Sage 50 については知りませんが、おそらく似ている Sage 300 API で作業しました。Sage セッションのインスタンスを保存して、Sage 接続が必要な間は保存しておくことができます/すべきです。

私が使用したセッション インターフェイスは、初期化してから開く必要があります。コードでは、初期化する文字列ハンドル、appID、プログラム名、およびアプリのバージョンを提供する必要があります。セッションを開くときは、ユーザー ID、パスワード、およびデータベース名が必要です。

これは私が使用している 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);

そのため、コードにUserIda Password、 a DatabaseName、タイムスタンプなど、DBLinkFlags必要なものを指定してください。VBA コードは次のようになります。

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

mySessionグローバルオブジェクト変数はどこにあり、どこからAPP_USERID来るかは完全にあなた次第です。それらを呼び出しでハードコードする.Openか、コード内定数にするか、コード内変数にして、値を Access データベースまたは外部の xml 構成ファイルに格納します。何でも機能します。ハードコーディングされた資格情報を機能させることから始めて、それらをパラメーター化する戦略を考え出します。

于 2016-06-15T17:29:57.730 に答える