0

次のコードを使用して、外部の 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();
}

データにアクセスするための 4 つのコードラインがあります。

//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

ご覧のとおり、フィールドのデータ型が目的の操作に適合するため、エラーがスローされないのは 1 行だけです。情報ロギングは単なる例です。ax-table-fields にデータを割り当てようとすると、同じ問題が発生します。などによるキャストも同様に機能しませんint2str()any2str()

では、さらに処理するために、読み取ったデータを処理する正しい方法は何ですか?

@編集:エラーメッセージ

Fehler während der Verarbeitung: E​​lementtyp für Variablenzuweisung ungultig.

4

1 に答える 1

1

I just tried running your query directly in SSMS, and found that the field LEVEL didn't exist on the actual table on sql server, but there is a field named "LEVEL_" (which is the 3rd field on my table).

Additionally, this talks about any2str not doing what you would expect it to do, but I don't think that is your problem on retrieving the LEVEL field. http://abraaxapta.blogspot.com/2012/02/kernel-function-madness-any2str.html

于 2013-01-10T16:45:13.137 に答える