MOSS 2007: Каков источник «Справочников»? - PullRequest
0 голосов
/ 15 июля 2010

Я пытаюсь создать новый элемент списка SharePoint напрямую с помощью сервера SQL.Меня останавливает чертов столбец tp_DirName.У меня нет идей, как создать это значение.

Например, я выбрал все задачи из AllUserData, и есть возможные значения для столбца: «MySite / Lists / Task», «Lists / Task»и даже «MySite / Lists / List2».

MySite - это значение FullUrl из таблицы Webs.Я могу получить это.Но как насчет Lists / Task и Lists / List2?Где они хранятся?

Если попытаться избежать контекста SQL, я могу сформулировать это следующим образом: что это за объект, имеющий такой атрибут, как '/ Lists / List2'?Где я могу настроить его в графическом интерфейсе?

Ответы [ 4 ]

1 голос
/ 15 июля 2010

Я обнаружил, что таблица [AllDocs], в отличие от ее заголовка, содержит информацию о «каталогах», которую можно использовать для генерации tp_DirName. По крайней мере, я нашел записи "List2" и "Task" в столбце [AllDocs]. [Tp_Leaf].

Таким образом, решение выглядит следующим образом: объедините следующие 2 компонента, чтобы получить tp_DirName:

  1. [Webs]. [FullUrl] для сети, содержащей список, содержащий элемент.
  2. [AllDocs]. [Tp_Leaf] для списка, содержащего элемент.

Объединить следующие 2 компонента, чтобы получить tp_Leaf для элемента:

  1. (Количество элементов в списке) + 1
  2. '_. 000'

С уважением,

1 голос
/ 15 июля 2010

Просто к вашему сведению.ОЧЕНЬ не поддерживается попытка записи непосредственно в таблицы SQL SharePoint.Вы должны действительно попытаться написать что-то, что использует объектную модель SharePoint.Запись в базу данных SharePoint напрямую означает, что Microsoft не будет поддерживать среду.

0 голосов
/ 18 июля 2010

Хе-хе, есть хранимая процедура с именем proc_AddListItem. Я был почти прав. MS люди делают то же самое, но вместо (считать + 1) они используют просто ... tp_ID:)

В любом случае, теперь я знаю ЕДИНСТВЕННЫЙ ПРАВИЛЬНЫЙ ответ: мне нужно вызвать proc_AddListItem.

ОБНОВЛЕНИЕ: Не забудьте представить данные из таблицы [AllUserData] как новый элемент в [AllDocs] (просто вставьте id и имя листа, посмотрите, как SP это делает сам).

0 голосов
/ 18 июля 2010

Ну, мой предыдущий ответ был не очень полезен, хотя в нем был ключ к магии. Теперь у меня есть действительно полезный.

Что бы они ни говорили, M $ очень либерален для хакеров MOSS DB. По крайней мере, они предоставляют следующие документы:

http://msdn.microsoft.com/en-us/library/dd304112(PROT.13).aspx http://msdn.microsoft.com/en-us/library/dd358577(v=PROT.13).aspx

читать? Затем вы знаете, что все папки перечислены в таблице [AllDocs] с «1» в столбце «Тип».

Теперь давайте посмотрим на столбец 'tp_RootFolder' в AllLists. Похоже на идентификатор папки, не так ли? Итак, просто ВЫБЕРИТЕ единственную строку из [AllDocs], где Id = tp_RootFolder и Type = 1. Затем объедините DirName + LeafName, и вы узнаете, каким должно быть значение «tp_DirName» для вновь созданного элемента в списке , Это похоже на твердую породу.

Теперь о tp_LeafName для новых предметов. Ранее я писал, что ответ (Количество элементов в списке) + 1 + '_.000', что соответствует следующему запросу:

DECLARE @itemscount int;
SELECT @itemscount = COUNT(*) FROM [dbo].[AllUserData] WHERE [tp_ListId] = '...my list id...';
INSERT INTO [AllUserData] (tp_LeafName, ...) VALUES(CAST(@itemscount + 1 AS NVARCHAR(255)) + '_.000', ...)

Таким образом, я должен сказать, что не уверен, что это работает всегда. Для предметов - да, но для документов ... Я задам вопрос. Оставьте комментарий, если хотите прочитать отчет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...