вторник, 1 апреля 2014 г.

Где хранить пользовательские данные часть 2: про SPPersistedObject

Сегодня продолжу рассказ про то. где можно хранить всякие пользовательские установки в SharePoint. Сегодня - самый идеологически правильный вариант, к сожалению, требующий административных прав, SPPersistedObject. Ну, админские права - это не проблема. у нас же есть RunWithElevatedPrivilegies.

Но, вернемся к нашей теме. Что вообще такое этот SPPersistedObject? Вот краткая выдержка из MSDN:

Класс SPPersistedObject предоставляет базовый класс для всех объектов администрирования. 
Все поля с атрибутом Persisted к XML-сериализации и записывает XML blob в базу данных конфигурации. 

Так что, все что нам нужно - это создать свой класс наследующий у SPPersistedObject и содержащий нужные нам Persisted поля. Вот так, например:
       public class MySettingsClass: SPPersistedObject 
       {
            public MySettingsClass() {}

            public MySettingsClass(string name, SPPersistedObject parent, Guid id)  :  base(name, parent, id) { }
   
            [Persisted]
            public string MySomeProperty;

            [Persisted]
            public string MyOtherProperty;
      }

Итак, свой класс мы создали. Надо сказать, это был самый сложный этап. Дальше все делается парой строк кода. Давайте сохраним наши установки. Например, в контексте объекта webApplication:
     MySettingsClass settings = new MySettingsClass("my settings", SPContext.Current.Site.WebApplication, Guid.NewGuid());
     settings.MySomeProperty = "test";
     settings.MyOtherProperty = "test2";
     settings.Update();

Ну и теперь, получив из webApplication объект нашего класса мы можем восстановить наши установки.
     MySettingsClass settings = SPContext.Current.Site.WebApplication.GetChild< mysettingsclass >("my settings");
     string property1 = settings.MySomeProperty; // "test";
     string property2 = settings.MyOtherProperty  // "test2";

Как видите ничего сложного. Единственная проблема - то, что вы собираетесь хранить в своем классе должно поддерживать сериализацию.


понедельник, 31 марта 2014 г.

Где хранить пользовательские данные или установки в SharePoint?

В SharePoint есть несколько вариантов хранения пользовательских данных, разной степени "правильности" и удобства.

Самый просто вариант - это, конечно, куки, которые в SharePoint, к и в любом веб-сайте никто не отменял. На всякий случай напомню как работать с куками в ASP.NET:

      //Записываем данные
      HttpCookie myCookie = new HttpCookie("MyKey");
      myCookie.Value = someData;
      myCookie.Expires = DateTime.Now.AddDays(1000);
      Response.Cookies.Add(myCookie);


      //Читаем данные
      if (Request.Cookies["MyKey"] != null)
      {
                    string someData = Request.Cookies["MyKey"].Value.ToString();
      }

      //Удаляем куку устанавливая куку с просроченным временем истечения. Данные нам в этом случае неважны, поэтому просто ""
      HttpCookie myCookie = new HttpCookie("MyKey");
      myCookie.Value = "";
      myCookie.Expires = DateTime.Now.AddDays(-1000);
      Response.Cookies.Add(myCookie);


Второй вариант - использования свойства Properties объекта SPWeb. Если решите использовать этот способ имейте ввиду, что все, что вы добавляете в Properties автоматически дублируется в свойстве AllProperties, но с ключом состоящим только из маленьких букв.
   // Добавляем свойство
   web.Properties["MyKey"] = value;
   web.Update();
   web.Properties.Update();
 
   // Читаем свойство

   var value = web.Properties["MyKey"];

   // Удаляем свойство
   web.AllProperties.Remove("mykey");
   web.Properties["MyKey"] = null;
   web.Update();
   web.Properties.Update();




Получаем список всех таблиц/тригеров/вьюшек в БД MS-SQL

В любой базе данных MS-SQL есть несколько очень полезных системных вьюшек. Самая интересная из них называется sys.objects и содержит данные практически обо всем в вашей базе. Например, вот так можно получить список всех хранимых процедур:

  SELECT *
  FROM [test].[sys].[sysobjects]
  where type='P'

А вот так список всех пользовательских таблиц:
  SELECT *
  FROM [test].[sys].[sysobjects]
  where type='U'

Тип информации о которой вы хотите узнать задается параметром type и может быть одним из следующих вариантов: