Friday, April 24, 2015

Cara Mengakses External Database Menggunakan TSQL OLEDB dari X++

Pada post sebelumnya, kita sudah membahas bagaimana cara meng-akses external database menggunakan class ODBC. Tetapi class ODBC ini memiliki keterbatasan untuk versi 2012 keatas, yaitu tidak dapat mengakses database server menggunakan user id yang lain (walaupun kita sudah menggunakan loginProperty.setOther), account yang digunakan adalah AOS service account.



Oleh karena itu AX menyediakan cara lainnya untuk mengakses external database. Salah satunya adalah menggunakan class OLEDB.

Contoh:

static void connToExternalDB_OLEDB(Args _args)
{
    System.Exception                    e;   
    System.Data.OleDb.OleDbConnection   objConn;   
    System.Data.OleDb.OleDbCommand      cmdSelect;   
    System.Data.OleDb.OleDbDataReader   reader;   
    InteropPermission                   perm;
    // set connection string
    str connectStr = "Provider=SQLOLEDB.1;"
        + "Persist Security Info=False;Database=AX2012DB;Server=AXServer;"
        + "User id=testUser;Password=testPassword";   
    str exceptionStr;   
    ;

    try
    {
        perm = new InteropPermission(InteropKind::ClrInterop);       
        if (perm == null)       
        {           
            throw error("Error with file permissions");
        }
        perm.assert();

        objConn = new System.Data.OleDb.OleDbConnection(connectStr);
        objConn.Open();

        cmdSelect   = objConn.CreateCommand();
        cmdSelect.set_CommandText("SELECT [column1], [column2] FROM [table] where [columN] = ‘string’");
        reader      = cmdSelect.ExecuteReader();

        while (reader.Read())
        {
                 info(reader.GetString(0));
                 info( CLRInterop::getAnyTypeForObject(reader.GetDecimal(1)) );
        }
        CodeAccessPermission::revertAssert();
    }   
    catch(Exception::CLRError)
    {
        CodeAccessPermission::revertAssert();
                perm = new InteropPermission(InteropKind::ClrInterop);
        if (perm == null)
        {
                 return;
        }
        perm.assert();

        e = ClrInterop::getLastException();
        CodeAccessPermission::revertAssert();
        while( e )
        {
            exceptionStr += e.get_Message();
            e = e.get_InnerException();
        }
        info(exceptionStr);
    }
    catch
    {
        error("An Exception has occurred");
    }

     if(objConn)
        objConn.Close();
}

NOTE: Jika kita mengakses data source provider yang mendukung Windows Authentication, maka didalam connection string kita harus menggunakan Trusted_Connection=yes atau Integrated Security=SSPI menggantikan user id dan password.

No comments:

Post a Comment