通过SQLDataReader.get_Item()检索值

时间:2013-01-09 09:53:06

标签: axapta dynamics-ax-2012

我试图通过以下代码访问外部sql表。访问按预期工作,但是如果必须为进一步的处理进行数据类型处理,我在处理值时遇到问题。

以下代码可以作为ax中的作业执行:

static void Job1(Args _args)
{
    str serverName;
    str catalogName;
    str ConnectionString;
    str sqlQuery;

    System.Data.SqlClient.SqlConnectionStringBuilder connectionStringBuilder;
    System.Data.SqlClient.SqlConnection connection;
    System.Data.SqlClient.SqlCommand command;
    System.Data.SqlClient.SqlParameterCollection parameterCollection;
    System.Data.SqlClient.SqlDataReader dataReader;
    ;
    new InteropPermission( InteropKind::ClrInterop ).assert();

    sqlQuery = "SELECT TOP 10 * FROM PRODROUTE";

    serverName = SysSQLSystemInfo::construct().getLoginServer();
    catalogName = SysSQLSystemInfo::construct().getloginDatabase();
    connectionStringBuilder = new System.Data.SqlClient.SqlConnectionStringBuilder();
    connectionStringBuilder.set_DataSource(serverName);

    connectionStringBuilder.set_IntegratedSecurity(true);
    connectionStringBuilder.set_InitialCatalog(catalogName);
    ConnectionString = connectionStringBuilder.get_ConnectionString();

    connection = new System.Data.SqlClient.SqlConnection(ConnectionString);
    command = new System.Data.SqlClient.SqlCommand(sqlQuery);
    command.set_Connection(connection);

    try
    {
        connection.Open();
        try
        {
            dataReader = command.ExecuteReader();

            while(dataReader.Read())
            {
                //info( dataReader.get_Item( "PRODID" )); // ok
                //info( dataReader.get_Item( "LEVEL" )); // not working
                info ( int2str( dataReader.GetInt32( 23 ))); // not working
                //info( any2str(dataReader.get_Item( "LEVEL" ))); // not working
            }
            dataReader.Dispose();
        }
        catch 
        {
            dataReader.Dispose();
        }
        catch(Exception::CLRError)
        {
            dataReader.Dispose();
        }
        connection.Dispose();
    }
    catch
    {
        connection.Dispose();
    }
    catch(Exception::CLRError)
    {
        connection.Dispose();
    }
    command.Dispose();
    CodeAccessPermission::revertAssert();
}

访问数据有四个代码行:

//info( dataReader.get_Item( "PRODID" )); // ok
//info( dataReader.get_Item( "LEVEL" )); // not working
info ( int2str( dataReader.GetInt32( 23 ))); // not working
//info( any2str(dataReader.get_Item( "LEVEL" ))); // not working

如您所见,只有一行不会引发错误,因为字段的数据类型适合所需的操作。信息记录只是一个例子。如果我尝试将数据分配给ax-table-fields,则会出现同样的问题。 通过int2str()any2str()等进行投射也无效。

那么处理数据读取的正确方法是什么?进一步处理?

@edit: ErrorMsg

FehlerwährendderVerarbeitung:ElementtypfürVertitynzuweisungungültig。

1 个答案:

答案 0 :(得分:1)

我刚尝试在SSMS中直接运行你的查询,发现在sql server上的实际表中没有字段LEVEL,但是有一个名为“LEVEL_”的字段(这是我表上的第3个字段)

此外,这谈到any2str没有做你期望它做的事情,但我不认为这是你检索LEVEL字段的问题。 http://abraaxapta.blogspot.com/2012/02/kernel-function-madness-any2str.html