Строка кэша Intersystems в виде%Stream.GlobalCharacter

Я пытаюсь сохранить (и загрузить) достаточно длинную строку в свойство Cache Class String(MAXLEN=1024000).

Длина строки составляет около 32 000 символов, и вместо хранения содержимого строки (которое по своему значению является объектом JSON) она хранит

2@%Stream.GlobalCharacter

Как данные сохраняются

Когда я пытаюсь загрузить содержимое строки в моей программе на C#, я буквально получаю строку выше, я не получаю JSON. При просмотре таблицы через веб-интерфейс и интерфейс терминала Cache я также вижу приведенную выше строку.

У меня есть другая строка JSON длиной около 23 000 символов, которая сохраняет и загружает без проблем.

Я это понимаю 2@%Stream.GlobalCharacter это способ хранения данных, но я хотел бы легко иметь возможность загрузить / сохранить его в виде строки.

Обновить

Я пытаюсь сохранить данные в моем приложении C# ASP.Net следующим образом.

sql = "INSERT INTO Namespace.Table ( Name, Active, Revision, Definition ) VALUES ( ?, 1, ?, ? )";

cC = new CacheCommand(sql, dbConn);
cC.Parameters.Add(new CacheParameter("name", formType)); // string
cC.Parameters.Add(new CacheParameter("revision", revision)); // int
cC.Parameters.Add(new CacheParameter("definition", formData)); // string

cC.ExecuteNonQuery();

Я загружаю данные следующим образом

string sql = "SELECT TOP 1 * FROM Namespace.Table WHERE Active = 1 AND Name = ? ORDER BY Revision DESC";
CacheCommand cC = new CacheCommand(sql, dbConn);
cC.Parameters.Add(new CacheParameter("name",formType));
CacheDataReader rdr = cC.ExecuteReader();
while(rdr.Read())
{
    string json = rdr["Definition"].ToString();
}

1 ответ

Решение

Говорили с Intersystems (спасибо Николь), и решение состоит в том, чтобы установить тип свойства%Stream.GlobalCharacter вместо%String.

Это легко с точки зрения C#, так как строка автоматически преобразуется в него, и вы можете использовать метод.ToString(), чтобы снова вывести строку.

Ниже от Интерсистемс:

Я изучил это немного дальше, и у меня есть теория о том, что здесь происходит. В некоторых версиях Caché я думаю, что при вставке строки с определенным размером (я думаю, 16k символов, но я не совсем уверен) в базу данных Caché через ODBC, она автоматически преобразуется в поток символов. Но так как свойство определено как% String на сервере, строковый литерал "2@%Stream.GlobalCharacter" хранится в базе данных вместо OREF, указывающего на содержимое потока. Затем, когда вы выбираете значение Definition, это просто строка "2@%Stream.GlobalCharacter".

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