powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / помогите соединиться с Cache 5.0 из .Net (VS 2010)
5 сообщений из 5, страница 1 из 1
помогите соединиться с Cache 5.0 из .Net (VS 2010)
    #37123026
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто нибудь это делал штатными средствами? именно 5.0 и именно .Net?
Только без использованися SQL, а скажем прогу запустить или глобальку посмотреть?

Дайте примеры, если есть.
...
Рейтинг: 0 / 0
помогите соединиться с Cache 5.0 из .Net (VS 2010)
    #37123142
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u78 ,

Уже было нечто похожее.
...
Рейтинг: 0 / 0
помогите соединиться с Cache 5.0 из .Net (VS 2010)
    #37203263
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отвечаю сам себе.

Работает DLL InterSystems.Data.CacheClient.dll

на стороне Cache должен быть класс который выполняет команды
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
Class User.Xecute Extends %RegisteredObject
{

/// Читать
ClassMethod Read(What As %CacheString) As %Library.CacheString
{
	s $ZT="ReadErr"
	q @What
ReadErr
 q $ZE
}

/// Писать
ClassMethod Write(What As %CacheString, Value As %CacheString) As %Library.CacheString
{
	x "s "_What_"=Value"
}

/// Выполнять
ClassMethod Execute(What As %CacheString) As %Library.CacheString
{
      n io,file,start,last
      s io=$IO
      s file=+$J
      s start=1
      k ^SPOOL(file)
      o 2:(file:start)
      u 2
      x What
      u io
      c 2
      s last=$O(^SPOOL(file,""),-1)
      Quit file
}

}

На стороне .Net (C#) вот такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
using System;
using System.Drawing;
using System.Windows.Forms;
using InterSystems.Data.CacheClient;

namespace SimpleCache
{
    public partial class Form1 : Form
    {
        bool Connected = false;
        public static CacheObject.Factory factory = new CacheObject.Factory();

        /// <summary>
        /// В конструкторе прочитаем строку соединения из сохранённых настроек
        /// </summary>
        public Form1()
        {
            InitializeComponent();
            factory.SetOutput(edtResult);
            edtConnectionString.Text = Properties.Settings.Default.ConnectionString;
            ShowConnectionStatus();
        }

        /// <summary>
        /// Кнопка Соединить
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            string ConnReady = edtConnectionString.Text;
            Connect(ConnReady);
        }

        /// <summary>
        /// Кнопка Разъединить
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            bool ok = factory.Disconnect();
            ShowConnectionStatus();
        }

        /// <summary>
        /// Показать статус соединения
        /// </summary>
        private void ShowConnectionStatus()
        {
            if (factory.IsConnected())
            {
                ShowConnected();
            }
            else
            {
                ShowDisconneced();
            }
        }

        /// <summary>
        /// Установить контролы в соответствии со статусом СОЕДИНЕНО
        /// </summary>
        private void ShowConnected()
        {
            panel1.BackColor = Color.Green;
            btnConnect.Enabled = false;
            btnDiconnect.Enabled = true;
            btnXecute.Enabled = true;
            edtCommand.Enabled = true;
            Connected = true;
            btnRead.Enabled = true;
            edtRead.Enabled = true;
        }

        /// <summary>
        /// Установить контролы в соответствии со статусом РАЗЪЕДИНЕНО
        /// </summary>
        private void ShowDisconneced()
        {
            panel1.BackColor = Color.Red;
            btnConnect.Enabled = true;
            btnDiconnect.Enabled = false;
            btnXecute.Enabled = false;
            edtCommand.Enabled = false;
            btnRead.Enabled = false;
            edtRead.Enabled = false;
            Connected = false;
        }

        /// <summary>
        /// Кнопка Выполнить
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnXecute_Click(object sender, EventArgs e)
        {
            if (Connected == false)
            {

            }
            dynamic CacheClassObj = factory.Static("User.Xecute");
            string x = edtCommand.Text;
            string file = CacheClassObj.Execute(x);
            string index = CacheClassObj.Read("$O(^SPOOL(\""+file+"\",\"\"))");
            while (index != "")
            {
                string res = CacheClassObj.Read("^SPOOL(\""+file+"\",\""+index+"\")");
                edtResult.Text += res;
                //edtResult.Lines[0] = res;
                index = CacheClassObj.Read("$O(^SPOOL(\"" + file + "\",\""+index+"\"))");
            }
            CacheClassObj.Execute("k ^SPOOL(\""+file+"\")");

        }

        /// <summary>
        /// Кнопка Прочитать
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRead_Click(object sender, EventArgs e)
        {
            /*
            if (!factory.IsConnected())
            {
                button1_Click(object sender, EventArgs e);
            }
             * */
            dynamic CacheClassObj = factory.Static("User.Xecute");
            string what = edtRead.Text;
            string res = CacheClassObj.Read(what);
            edtResult.Text = res;
        }

        /// <summary>
        /// Кнопка вызова диалога соединения с Cache
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnShowConnect_Click(object sender, EventArgs e)
        {
            string conn = factory.ConnectDlg();
            edtConnectionString.Text = conn;
            Properties.Settings.Default.ConnectionString = conn;
            Properties.Settings.Default.Save();
        }

        /// <summary>
        /// Соединение с Cache
        /// </summary>
        /// <param name="ConnReady"></param>
        private void Connect(string ConnReady)
        {
            string conn = ConnReady;
            if (ConnReady == "")
            {
                conn = factory.ConnectDlg();
                edtConnectionString.Text = conn;
                Properties.Settings.Default.ConnectionString = conn;
                Properties.Settings.Default.Save();
            }

            bool ok = factory.Connect(conn);

            ShowConnectionStatus();
        }
    }
}
(не забыть добавить InterSystems.Data.CacheClient.dll в References проекта).

В аттаче собственно Solution для .Net и xml файл с классом Cache. Dll можно найти в дистрибутиве Cache.
...
Рейтинг: 0 / 0
помогите соединиться с Cache 5.0 из .Net (VS 2010)
    #37204060
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u78 ,

В Вашем примере используется ActiveX ( CacheObject.dll ), а не Caché Managed Provider for .NET ( InterSystems.Data.CacheClient.dll )
Примеры работы с CacheObject.dll можно найти здесь . Примеры приведены для Delphi, но не суть важно.
Статью удобнее читать предварительно импортировав её в стандартную документацию Caché (инструкции можно найти в конце статьи).

Если есть необходимость работы с Caché на низком уровне (глобалы, программы), то посмотрите VisM :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
using System;

namespace test
{
  class Program
  {
    public static void Main(string[] args)
    {
      var vism=new VISMLib.VisMClass();
      vism.Connect("CN_IPTCP:127.0.0.1[1972]:_SYSTEM:@sys","mytag");
      vism.NameSpace="SAMPLES";
      vism.Execute(@"set VALUE=$ZV_"" ""_$ZU(5)");
      Console.WriteLine(vism.VALUE);
      vism.DeleteConnection();
      
      Console.Write("Press any key to continue . . . ");
      Console.ReadKey(true);
    }
  }
}

PS: есть ещё веб-сервисы, но не думаю, что это Ваш вариант.
...
Рейтинг: 0 / 0
помогите соединиться с Cache 5.0 из .Net (VS 2010)
    #37204103
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

Да, действительно, я ошибся, в References у меня ActiveX Interop.CacheObject .
Спасибо.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / помогите соединиться с Cache 5.0 из .Net (VS 2010)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]