I use ODBC for querying on InterSystems Caché db.
In C# I do:
DbCommand.CommandText = "select Class_getTablesMetaXml('globalName') As returnStr";
OdbcDataReader reader = DbCommand.ExecuteReader();
Everything is OK, but if returnStr is longer than 16374 characters returnStr seems to be empty in C#.
According doc (http://docs.intersystems.com/ens20082/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_datatype#RSQL_datatype_longstrings) I should use CStream%String
datatype, but I don't know how to achieve it.
My caché procedure method looks like:
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
}
My Caché version is: 2009.1.3 (Build 704U)
In configuration I have checked: Enable Long Strings
After query "select Class_getTablesMetaXml('globalName') As returnStr"
, I get XML string. But if its longer than 16374, I get empty string in my C# app where I use ODBC for querying. I need solve it or do something like get string of 15000 length and then second string which I will concatenate in my app(c#), but i absolutely don't know how to do it.
To use CStream%String you should change return type from %String to %GlobalCharacterStream in your SqlProc and change your code because it is Stream. And for generating XML, try to use %XML.Writer