Zugriff auf externe Datenbank via ODBC

Im folgenden ein paar Code-Beispiele wie man aus Dynamics AX heraus auf externe Datenbanken lesend und schreibend zugreifen kann.

Die Beispiele basieren auf folgendem MSDN-Beitrag:
How to: Connect to an External Database from X++ Code [AX 2012]
 

Lesender Zugriff (SELECT)

// X++, Main method in a class.
static public void Main(Args _args)
{
    LoginProperty loginProperty;
    OdbcConnection odbcConnection;
    Statement statement;
    ResultSet resultSet;
    str sql, criteria;
    SqlStatementExecutePermission perm;
    ;

    // Set the information on the ODBC.
    loginProperty = new LoginProperty();
    loginProperty.setDSN("ExternalDB_32bit");
    loginProperty.setDatabase("ExternalDatabaseName");

    //Create a connection to external database.
    odbcConnection = new OdbcConnection(loginProperty);

    if (odbcConnection)
    {
        sql = "SELECT * FROM items;";

        //Assert permission for executing the sql string.
        perm = new SqlStatementExecutePermission(sql);
        perm.assert();

        //Prepare the sql statement.
        statement = odbcConnection.createStatement();
        resultSet = statement.executeQuery(sql);

        //Cause the sql statement to run,
        //then loop through each row in the result.
        while (resultSet.next())
        {
            //It is not possible to get field 3 and then 1.
            //Always get fields in numerical order, such as 1 then 2 the 3 etc.
            print strFmt("%1 - %2", strRTrim(resultSet.getString(1)), strRTrim(resultSet.getString(2)));
        }

        //Close the connection.
        resultSet.close();
        statement.close();
    }
    else
    {
        error("Failed to log on to the database through ODBC.");
    }
}

 

Schreibender Zugriff (INSERT)

// X++, Main method in a class.
static public void Main(Args _args)
{
    LoginProperty loginProperty;
    OdbcConnection odbcConnection;
    Statement statement;
    str sql, criteria;
    SqlStatementExecutePermission perm;
    ;

    // Set the information on the ODBC.
    loginProperty = new LoginProperty();
    loginProperty.setDSN("ExternalDB_32bit");
    loginProperty.setDatabase("ExternalDatabaseName");

    //Create a connection to external database.
    odbcConnection = new OdbcConnection(loginProperty);

    if (odbcConnection)
    {
        sql = "INSERT INTO items VALUES ('7000', 'Item 7000');";

        //Assert permission for executing the sql string.
        perm = new SqlStatementExecutePermission(sql);
        perm.assert();

        //Prepare the sql statement.
        statement = odbcConnection.createStatement();
        statement.executeUpdate(sql);

        //Close the connection.
        statement.close();
    }
    else
    {
        error("Failed to log on to the database through ODBC.");
    }
}

 

Schreibender Zugriff (UPDATE)

// X++, Main method in a class.
static public void Main(Args _args)
{
    LoginProperty loginProperty;
    OdbcConnection odbcConnection;
    Statement statement;
    str sql, criteria;
    SqlStatementExecutePermission perm;
    ;

    // Set the information on the ODBC.
    loginProperty = new LoginProperty();
    loginProperty.setDSN("ExternalDB_32bit");
    loginProperty.setDatabase("ExternalDatabaseName");

    //Create a connection to external database.
    odbcConnection = new OdbcConnection(loginProperty);

    if (odbcConnection)
    {
        sql = "UPDATE items SET itemname = 'Name of ' + itemId;";

        //Assert permission for executing the sql string.
        perm = new SqlStatementExecutePermission(sql);
        perm.assert();

        //Prepare the sql statement.
        statement = odbcConnection.createStatement();
        statement.executeUpdate(sql);

        //Close the connection.
        statement.close();
    }
    else
    {
        error("Failed to log on to the database through ODBC.");
    }
}

Wenn man diese Zugriffe am Client ausführt, reicht eine 32-bit DSN. Laufen die Zugriffe über den Server - beispielsweise über das SysOperation-Framework - und ist auf dem Server ein 64bit-Betriebsystem installiert so muss auf dem AOS eine 64-bit DSN eingerichtet sein.

Screenshot

Verwendet man die falsche DSN, erkennt man das an Fehlermeldungen wie den folgenden:

ODBC-Vorgang ist fehlgeschlagen. Anmeldung bei der Datenbank nicht möglich.
[Microsoft][ODBC Driver Manager] The specified DSN contains an architecture mismatch between the Driver and Application

Um nun die jeweils richtige DSN zu verwenden, könnte man den Zugriff wie folgt anpassen:

// Set the information on the ODBC.
loginProperty = new LoginProperty();
if(Global::isRunningOnServer())
{
    loginProperty.setDSN("ExternalDB_64bit");
}
else
{
    loginProperty.setDSN("ExternalDB_32bit");
}
loginProperty.setDatabase("ExternalDatabaseName");

Anmerkung:

Die 32-bit Version der ODBC-Verwaltung (Odbcad32.exe) ist unter %systemdrive%\Windows\SysWoW64 zu finden.
Die 64-bit Version der ODBC-Verwaltung (Odbcad32.exe) ist unter %systemdrive%\Windows\System32 zu finden.

Dieser Beitrag bezieht sich auf die Version:
Dynamics AX 2012

Kommentar hinzufügen
 
 

 

 
 
 
Beiträge des aktuellen Monats
März 2024
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
25262728293031
 
© 2006-2024 Heinz Schweda | Impressum | Kontakt | English version | Mobile Version
Diese Webseite verwendet Cookies, um Benutzern einen besseren Service anzubieten. Wenn Sie weiterhin auf der Seite bleiben, stimmen Sie der Verwendung von Cookies zu.  Mehr dazu