client = new ManagedClient64(); client.ParseConnectionString("..."); client.Connect(); ... // Поработали с клиентом, сохраняем его состояние string savedState = ManagedClient64.SerializeToString(client); storage.SaveClientState(savedState); // Сохранили // storage - некое хранилище, работающее на уровне сессии // (подойдёт даже сохранение в файл) client.Shutdown(); // Чтобы клиент не пытался отключиться от сервера2. При необходимости десериализируем клиента и производим нужные действия, после чего снова сохраняем состояние:
string savedState = storage.RestoreClientState (); ManagedClient64 client = ManagedClient64 .DeserializeFromString (savedState); // Продолжаем работу с сервером IrbisRecord record = client.ReadRecord(mfn); ... // Снова сохраняем состояние storage.SaveClientState(savedState); client.Shutdown();3. Когда пользователь явно нажимает кнопку «Log Out», отключаемся и мы:
string savedState = storage.RestoreClientState (); ManagedClient64 client = ManagedClient64 .DeserializeFromString(savedState); client.Disconnect (); storage.RemoveClientState ();
result._waitHandle = new ManualResetEvent(true);
foreach ( string s in BVM.SearchTextList ) { foreach ( IrbisRecord record in BVM.RecordList ) { RecordField currentField = record.Fields .GetField ( "910" ) .GetField ( 'h', s ) .FirstOrDefault (); if ( currentField != null ) { currentField.SetSubField ( 'a', "1" ); BVM.Client.WriteRecord ( record, false, true ); } } }Кстати, при выдаче книги необходимо ещё увеличивать на единицу счётчик выдач, хранящийся в поле 999. Примерно так:
int counter; int.TryParse ( record.FM ( "999" ), out counter ); counter++; record.SetField ( "999", counter.ToString () );
// Выполняем последовательный поиск int[] found = Client.SequentialSearch ( "\"A=Пушкин$\"", // отбор по словарю "v200:'сказк'" // булево выражение ); // Выводим найденные записи на консоль foreach (int mfn in found) { string description = Client.FormatRecord ( "@brief", mfn ); Console.WriteLine(description); }На экран будет выведено что-то вроде:
Client.SequentialSearch ( "\"A=Пушкин$\"", 100, // запрашиваемое количество записей 1, // номер первой записи (смещение) 10000, // минимальный MFN 20000, // максимальный MFN "v200:'сказк'" );Если вместо "\"A=Пушкин$\"" передать null, то будет выполнен последовательный поиск по всей базе данных, что, скорее всего, создаст большую нагрузку на сервер.
[@irbisc] [Main] AutoinFile=autoin_none.gblВ autoin_none.gbl напишите что-нибудь вроде:
0 // XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX Пустое заданиеВторой возможный способ: работайте через глобальную корректировку, для неё штатно предусмотрена возможность отключить autoin.gbl
// Как-нибудь добываем запись из базы RDR IrbisRecord record = ...; // Получаем 5-е повторение поля 40 (внимание, нумерация с нуля!) RecordField fieldToModify = record.Fields.GetField("40").GetOccurrence(4); if (fieldToModify == null) { // нет такого повторения } else { // устанавливаем значение подполя и отсылаем запись на сервер fieldToModify.SetSubField ( 'e', "20160901" ); // 1 сентября client.WriteRecord ( record, false, true ); }
void Prolongation ( ManagedClient64 client, // подключение string ticket, // номер читательского билета string barcode, // штрих-код или RFID книги string newDate // новая дата предполагаемого возврата ) { IrbisRecord record = client.SearchReadOneRecord ( "\"RI={0}\"", ticket ); if (record != null) { RecordField field = record.Fields .GetField("40") .GetField('f', "******") .GetField('h', barcode) .FirstOrDefault(); if (field != null) { field.SetSubField('e', newDate); client.WriteRecord(record, false, true); } } }