Hier 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.
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();
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
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
Hier 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.
{
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.