Datenbankzugriff über ADO.net

TableHier ein Beispiel wie man aus Dynamics AX heraus über ADO.net auf eine Datenbank zugreifen kann.

Man sollte nur darauf achten, daß in den Tabellen die man einliest nach Möglichkeit keine NULL-Werte enthalten sind, mit solchen kann die Methode CLRInterop::getAnyTypeForObject() nicht korrekt umgehen.

Aus diesem Grund verwende ich im Beispiel die IsNull()-Funktion um alle NULL-Werte entsprechend dem jeweiligen Datentyp vorher umzuwandeln.

static void ADOnetWithOutNULL(Args _args)
{
    str 100 serverName = @"AX2012R2A";
    str 100 dataBaseName = "ImportDatabase";
    System.Data.SqlClient.SqlConnectionStringBuilder connectionStringBuilder;
    System.Data.SqlClient.SqlConnection connection;
    System.Data.SqlClient.SqlCommand command;
    System.Data.SqlClient.SqlDataReader dataReader;
    str sqlQuery;
    System.Exception InteropException;
    Counter c;
    real realValue;
    str 100 strValue;
    int intValue;
    utcDateTime dateTimeValue;
    date dateValue;
   

    void cleanUp()
    {
        if(dataReader) dataReader.Dispose();
        if(connection) connection.Dispose();
        if(command)    command.Dispose();       
       
        CodeAccessPermission::revertAssert();       
       
        interopException = CLRInterop::getLastException();
        if(interopException)
        {
            while(!CLRInterop::isNull(interopException.get_InnerException()))
            {
                error(CLRInterop::getAnyTypeForObject(interopException.get_Message()));
            }
        }
    }
   
    new InteropPermission( InteropKind::ClrInterop ).assert();

    connectionStringBuilder = new System.Data.SqlClient.SqlConnectionStringBuilder();
    connectionStringBuilder.set_DataSource(serverName);
    connectionStringBuilder.set_InitialCatalog(databaseName);
    connectionStringBuilder.set_IntegratedSecurity(true);

    // Because NULL-Values may cause errors, IsNull-Statement is used
    sqlQuery = @" SELECT
                   isNull([CustomerID], 0) AS CustomerID
                  ,isNull([CustomerName], '') AS CustomerName
                  ,isNull([LastInvoiceDateTime], '9999-01-01 01:01:01.001') AS LastInvoiceDateTime
                  ,isNull([LastCollectionLetterDate], '9999-01-01 01:01:01.001') AS LastCollectionLetterDate
                  ,isNull([CreditLimit], 0) AS CreditLimit
                  FROM [Customers]";


    try
    {
        // Connection
        connection = new System.Data.SqlClient.SqlConnection(connectionStringBuilder.ToString());
        connection.Open();

        try
        {
            // Create statement
            command = connection.CreateCommand();
            command.set_CommandText(sqlQuery);

            // Create reader
            dataReader = command.ExecuteReader();
           
            try
            {
                while (dataReader.Read())
                {
                    c++;

                    // Read records
                    strValue = CLRInterop::getAnyTypeForObject( dataReader.get_Item("CustomerName"));
                    intValue = CLRInterop::getAnyTypeForObject( dataReader.get_Item("CustomerID"));
                    realValue = CLRInterop::getAnyTypeForObject( dataReader.get_Item("CreditLimit"));
                    dateValue = CLRInterop::getAnyTypeForObject( dataReader.get_Item("LastCollectionletterDate"));
                    dateTimeValue = CLRInterop::getAnyTypeForObject( dataReader.get_Item("LastInvoiceDateTime"));
                   
                    // Truncate string values
                    strValue = strRTrim(strValue);

                    // Output
                    info(strFmt("Integer: %1 String: %2 Real: %3 DateTime: %4 Date: %5", intValue,
                                                                                         strValue,
                                                                                         realValue,
                                                                                         dateTimeValue,
                                                                                         dateValue));
                }
            }
            catch (Exception::CLRError)
            {
                cleanUp();
                throw error("Wrong fields");
            }               
        }
        catch (Exception::CLRError)
        {
            cleanUp();
            throw error(strFmt("The SQL-Statement seems to be wrong: %1", sqlQuery));
        }
    }
    catch(Exception::CLRError)
    {
        cleanUp();
        throw error(strFmt('Connection to database "%1/%2" failed', serverName, databaseName));
    }

    cleanUp();

    info(strFmt("Records read: %1", c));

}

Update vom 16.11.2014

Das obige beispiel setzt voraus, daß der Benutzer über die entsprechende Rechte auf der abzufragenden Datenbank besitzt.

Auch kann man mit den entsprechenden Rechten auch Tabellen innerhalb von Dynamics AX abfragen, die man unter normalen Umständen über den AOT nicht abfragen kann. Dadurch kann man beispielsweise die folgende Fehlermeldung "umgehen":

You are not authorized to access table ‘SysVersionControlMorphXLockTable’ (SysVersionControlMorphXLockTable). Contact your system administrator.

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