Today I want to talk about executing SQL statements in X++ on both the current AX database and external databases. This is something probably every AX developer will have to do at some point.

You’ll want to do this for many reasons; to execute stored procedures, to improve performance, to get data from an external database, and so on.

I will provide samples for two classes:  - Connection (Execute SQL statement on current AX database)  - ODBCConnection (Execute SQL statement on external database)

I will not cover the ADO connection (CCADOConnection class), because it doesn’t work when you run it on server (or in batch), and I don’t like that. If you do, try to convince me.

Executing direct SQL on the current AX database

When you execute a SQL statement, there are two options:  - either you did a select and you expect a result to be returned  - or you did insert/update/delete and you don’t expect a result.

The first sample is for a SQL statement that returns a result:

public static server void main(Args _args)
{
Connection connection;
Statement statement;
str query;
Resultset resultSet;
; // create connection object
connection = new Connection(); // create statement
statement = connection.createStatement(); // Set the SQL statement
query = 'select name from CustTable'; // assert SQL statement execute permission
new SqlStatementExecutePermission(query).assert(); // when the query returns result,
// loop all results for processing
//BP Deviation documented
resultSet = statement.executeQuery(query); while(resultSet.next())
{
// do something with the result
info(resultSet.getString());
} // limit the scope of the assert call
CodeAccessPermission::revertAssert();
}

Note: this is a main method, put it in a class. Also note that it has to run on server.

Now if you do an update/delete/insert, you will want to do something like this:

public static server void main(Args _args)
{
Connection connection;
Statement statement;
str query;
; // create connection object
connection = new Connection(); // create statement
statement = connection.createStatement(); // Set the SQL statement
query = "insert into CustTable (AccountNum, Name, RecId) values ('demo', 'demo', 2)"; // assert SQL statement execute permission
new SqlStatementExecutePermission(query).assert(); //BP Deviation documented
statement.executeUpdate(query); // limit the scope of the assert call
CodeAccessPermission::revertAssert();
}

You can find more info about the executeQuery() and executeUpdate() methods on msdn: Statement Class

Executing direct SQL on an external database using ODBC

Again, we have to differentiate between queries that return a result and those that don’t.

The following code sample retrieves records from an external database and processes the result:

public static server void main(Args _args)
{
Statement statement;
str query;
Resultset resultSet;
LoginProperty loginProperty;
OdbcConnection odbcConnection;
; loginProperty = new LoginProperty();
loginProperty.setDSN('YOURDSN'); odbcConnection = new OdbcConnection(loginProperty); // Create new Statement instance
statement =odbcConnection.CreateStatement(); // Set the SQL statement
query = 'select name from CustTable'; // assert SQL statement execute permission
new SqlStatementExecutePermission(query).assert(); // when the query returns result,
// loop all results for processing by handler
//BP Deviation documented
resultSet = statement.executeQuery(query); while(resultSet.next())
{
// do something with the result
info(resultSet.getString());
} // limit the scope of the assert call
CodeAccessPermission::revertAssert();
}

As you can see, the code is pretty similar. The main difference is that we are using ODBC classes, including the LoginProperty class.

In this example, I use a DSN (Data Source Name) that I configured on the AOS server. The DSN contains a reference to the server and database you want to connect to, and also what user credentials should be used to connect to the database. This is a lot safer than storing them in AX.  If you don’t know how to create a DSN, there are plenty of tutorials on the web.

To update/delete/update, the code is more or less the same:

public static server void main(Args _args)
{
Statement statement;
str query;
LoginProperty loginProperty;
OdbcConnection odbcConnection;
; loginProperty = new LoginProperty();
loginProperty.setDSN('YOURDSN'); odbcConnection = new OdbcConnection(loginProperty); // Create new Statement instance
statement =odbcConnection.CreateStatement(); // Set the SQL statement
query = "insert into CustTable (AccountNum, Name, RecId) values ('demo', 'demo', 2)"; // assert SQL statement execute permission
new SqlStatementExecutePermission(query).assert(); // when the query returns result,
// loop all results for processing by handler
//BP Deviation documented
statement.executeUpdate(query); // limit the scope of the assert call
CodeAccessPermission::revertAssert();
}

If you feel that something is missing in these examples, just ask.

How to executing direct SQL statements [Axapta, AX4.0, AX2009, AX2012]的更多相关文章

  1. Save results to different files when executing multi SQL statements in DB Query Analyzer 7.01

        1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainl ...

  2. Access text files using SQL statements by DB Query Analyzer

    Access text files using SQL statements by DB Query Analyzer Ma Gen feng (Guangdong Unitoll Services ...

  3. Executing Raw SQL Queries using Entity Framework

    原文 Executing Raw SQL Queries using Entity Framework While working with Entity Framework developers m ...

  4. 14.5.3 Locks Set by Different SQL Statements in InnoDB

    14.5.3 Locks Set by Different SQL Statements in InnoDB 通过不同的SQL语句设置的锁 在InnoDB中 一个锁定读, 一个UPDATE 或者一个D ...

  5. 14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置

    14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置 locking read, 一个UPDATE,或 ...

  6. Microsoft SQL Server Compact 4.0&&ADO.NET Entity Framework 4.1&&MVC3

    最近重新查看微软MvcMusicStore-v3.0的源代码,发现忽略了很多重要的东西,特别是数据访问那一部分. 首先Microsoft SQL Server Compact 4.0 详细的介绍和下载 ...

  7. SQLSERVER图片查看工具SQL Image Viewer5.5.0.156

    原文:SQLSERVER图片查看工具SQL Image Viewer5.5.0.156 SQLSERVER图片查看工具SQL Image Viewer5.5.0.156 在2013年某一次北京SQL ...

  8. Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程

    原文:Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程 Red Gate系列之二 SQL Source Co ...

  9. PL/SQL Developer从11.0.6版本开始32/64为之区分

    PL/SQL Developer从11.0.6版本开始32/64为之区分 在PL/SQL Developer11.0.6版本之前,64位Windows操作系统在使用PL/SQL Developer都未 ...

随机推荐

  1. Hadoop修改SSH端口号

    hadoop-env.sh export HADOOP_SSH_OPTS="-p 16022"

  2. openssl rsa 私钥 PKCS8私钥 公钥

    上文配置好 openssl 运行 => cmd => cd C:\usr\local\ssl\bin => 执行 openssl

  3. sql 2008 r2

    http://jingyan.baidu.com/article/6c67b1d6ca06f02787bb1ed1.html

  4. js中字符串的截取

    当需要从一组数据中移除到符合条件的某一个数据的时候,在这种情况下如何进行截取呢? 基本思路: ①将其通过特定的符号,将一组字符串进行拼接,或者用","或者用"+" ...

  5. H264 Profile

    H.264有四种profile,对应四种H264画质级别.每个profile支持一组特定的编码功能,并支持一类特定的应用,分别是BP.EP.MP.HP: 1. BP-Baseline Profile ...

  6. Appium启动服务报错

    错误信息如下: error: Could not find a device to launch. You requested 'iPhone 6 (8.4)', but the available ...

  7. 【Unity Shaders】学习笔记——SurfaceShader(十一)光照模型

    [Unity Shaders]学习笔记——SurfaceShader(十一)光照模型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5664792.html ...

  8. IT综合学习网站收集

    最近整理了一下曾经使用过的IT从入门到广泛的综合类基础学习网站,记录下来,以便初学者使用: 1.http://www.w3school.com.cn/  中文版基础在线学习平台 2.http://ww ...

  9. 下载编译和测试Android 源代码

    http://source.android.com/source/downloading.html 其中出现错误 repo: fatal: error unknown url type: https ...

  10. yii中第三方库

    yii中存在一些路径别名:ext:表示包含了所有第三方扩展的目录  参考:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.namespac ...