четверг, 23 декабря 2010 г.

Действия для ускорения работы с FileStream

В процессе исследования задачи генерации большого количества файлов были определены действия, которые могут существенно ускорить операции с файлами на FileStream. Их можно применить, если в вашей базе используется именно такой способ хранения файлов.

Оригинальная статья http://msdn.microsoft.com/ru-ru/library/dd206979%28SQL.100%29.aspx
  1. Отключить на диске с Filestream генерацию файлов в формате 8.3 (Volume_path – опциональный параметр): FSUTIL BEHAVIOR SET DISABLE8DOT3 1
    Об утилите FSUTIL
  2. Отключить обновление времени последнего доступа к файлу на сервере с Filestream: FSUTIL BEHAVIOR SET DISABLELASTACCESS 1
  3. Отключить на диске с Filestream индексирование операционной системы
  4. Добавить логический диск с Filestream в исключения антивирусных программ
  5. Дефрагментировать логический диск с Filestream
  6. Рекомендуемый размер кластера в NTFS – 64 Кб
  7. Не использовать RAID-5 для размещения Filestream
  8. Отключить опции AutoShrink и AutoClose в базе данных

среда, 22 декабря 2010 г.

Програмное выделение номера в карточках конструктора решений

В карточках конструктора решений есть свойство типа "Нумератор". Оно позволяет пользователю выделить номер. Но как решить задачу автоматического выделения номера, например, при открытии карточки?

В текущих версиях конструктора сделать это можно только программно, и задача не тривиальная. поэтому приведу готовый кусок кода.


Обработчик события AfterActivate - будет выполнен сразу после открытия карточки.

на С#
// обработчик события AfterActivate - будет выполнен сразу после открытия карточки
private void cardControl_AfterActivate(System.Object sender, System.EventArgs e)
{
// получаем свойство типа "Нумератор". Нужно указать название свойства
var numeratorProperty = GetCardProperty("Регистрационный номер");
// если номер уже задан, то выходим из метода, ничего не делая
if (numeratorProperty.Value != null)
return;
// получаем атрибут правила и его значение (идентификатор)
var ruleAttribute = numeratorProperty.Description.GetAttribute("Rule");
Guid? ruleId = (Guid?)ruleAttribute.Value;
// с помощью преобразователя данных создаем новый номер по правилу
var numeratorMapper = new DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper(
Session, CardData.Id, DomainObject.NumbersSectionId.Value);
var number = numeratorMapper.Create(ruleId.Value);
// устанавливаем новое значение свойства
numeratorProperty.Value = number;
// обновляем элементы карточки, чтобы отобразить новое значение
RefreshControls();
}

// вспомогательный метод поиска элемента по названию
private CardProperty GetCardProperty(string propertyName)
{
foreach (CardProperty property in PropertyController.CardProperties)
{
if (property.Name == propertyName)
return property;
}
return null;
}

Vb.net

Private Sub cardControl_AfterActivate(sender As System.Object, e As System.EventArgs)
 
  ' получаем свойство типа "Нумератор"
  Dim numeratorProperty AS DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty  = GetCardProperty("Регистрационный номер")
  ' если номер уже задан, то выходим из метода, ничего не делая

  If numeratorProperty.Value IsNot Nothing Then
   Return
  End If
  ' получаем атрибут правила и его значение (идентификатор)
  Dim ruleAttribute as DocsVision.BackOffice.Model.Layouts.Entities.PropertyAttribute = numeratorProperty.Description.GetAttribute("Rule")
  
  Dim ruleId As System.Nullable(Of Guid) = CType(ruleAttribute.Value, System.Nullable(Of Guid))
  ' с помощью преобразователя данных создаем новый номер по правилу
  Dim numeratorMapper as DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper  = New DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper(me.Session, CardData.Id, DomainObject.NumbersSectionId.Value)
  Dim number as DocsVision.BackOffice.Model.CardProperties.Entities.NumeratorNumber  = numeratorMapper.Create(ruleId.Value)
  ' устанавливаем новое значение свойства
  numeratorProperty.Value = number
  ' обновляем элементы карточки, чтобы отобразить новое значение

  me.PropertyController.RefreshControls
  
    End Sub


 ' вспомогательный метод поиска элемента по названию
 Private Function GetCardProperty(propertyName As String) As DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty 
  For Each [property] As DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty In PropertyController.CardProperties
   If [property].Name = propertyName Then
    Return [property]
   End If
  Next
  Return Nothing
 End Function

вторник, 7 декабря 2010 г.

Ctrl-C

Так получилось, что под конец года совсем нет времени писать новые статьи в наш блог. В четвертом квартале сдается много проектов, и обычно количество инцидентов становится чуть больше (о распределении инцидентов в течение года расскажу позже :).
В этом есть плюс: по окончании решения будет много полезной информации из опыта.

Сейчас же, чтобы блог не простаивал сообщу полезный трюк. Во многих окнах сообщений об ошибках работает Ctrl-C. Т.е. можно скопировать только текст. Для сообщения из картинки выше.

[Window Title]
Trusted sites

[Content]
Sites added to this zone must use the  https:// prefix. This prefix assures a secure connection.

[OK]

p.s. В окнах сообщений DocsVision есть кнопка "Больше" и "Скопировать текст сообщения"