InterSystems Caché ODBC - максимальная длина результата

Я использую ODBC для запросов на InterSystems Caché db.

В C# я делаю:

DbCommand.CommandText = "select Class_getTablesMetaXml('globalName') As returnStr";
OdbcDataReader reader = DbCommand.ExecuteReader();

Все в порядке, но если returnStr длиннее 16374 символов, returnStr кажется пустым в C#.

В соответствии с документом ( http://docs.intersystems.com/ens20082/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_datatype#RSQL_datatype_longstrings) я должен использовать CStream%String тип данных, но я не знаю, как этого добиться.

Мой метод процедуры кэширования выглядит так:

ClassMethod getTablesMetaXml(globalName As %String) As %String [ SqlProc ]
{
    set global = "^"_globalName

    set xmlString = "<global><name>"_globalName_"</name>"

    set tableCount = 0
    set iTab = ""
    for
    {
        set tableCount = tableCount+1
        set iTab = $order( @global@("tab", iTab) )
        quit:(iTab = "")

        set xmlString = xmlString _ "<table>"
        set xmlString = xmlString _     "<title>"_@global@("tab", iTab, "Name")_"</title>"
        set xmlString = xmlString _     "<indexTab>"_iTab_"</indexTab>"

        set i=""
        set propCount = 0
        for
        {
            set propCount = propCount + 1
            set i = $order( @global@("tab",iTab,"sMeta", i) )
            quit:(i = "")

            set xmlString = xmlString _ "<col>"
            set xmlString = xmlString _     "<title>" _ ..zcvXml(@global@("tab",iTab,"sMeta",i)) _ "</title>"
            set xmlString = xmlString _     "<name>prop" _ propCount _ "</name>"
            set xmlString = xmlString _     "<format>" _ ..zcvXml($g(@global@("tab",iTab,"sMeta",i,"Format"))) _ "</format>"
            set xmlString = xmlString _ "</col>"
        }
    set xmlString = xmlString _ "</table>"
    }

    set xmlString = xmlString _ "</global>"

    q xmlString
}

Моя версия Caché: 2009.1.3 (сборка 704U)

В конфигурации я проверил: Включить длинные строки

После запроса "select Class_getTablesMetaXml('globalName') As returnStr"Я получаю строку XML. Но если он длиннее 16374, я получаю пустую строку в своем приложении C#, где я использую ODBC для запросов. Мне нужно решить это или сделать что-то вроде получения строки длиной 15000, а затем второй строки, которую я объединю в своем приложении (C#), но я абсолютно не знаю, как это сделать.

1 ответ

Решение

Чтобы использовать CStream%String, вы должны изменить тип возвращаемого значения с% String на%GlobalCharacterStream в вашем SqlProc и изменить код, потому что это Stream. А для генерации XML попробуйте использовать %XML.Writer

Другие вопросы по тегам