SharePoint 2007: Как я могу выполнить ряд операций в рамках транзакции?

Вы можете использовать пользовательский тип для null int64. Этот тип работает так, как вы ожидали.

Пример использования:

package main

import (
    "encoding/json"
    "database/sql/driver" 
    "fmt"
    "strconv"
)

type user struct {
    ID   int             `db:"id"`
    Name string          `db:"name"`
    // pointer needed to omitempty work, otherwise output will be "age": null
    Age  *NullInt64 `db:"age" json:"age,omitempty"`
}

func main() {
    u := user{ID: 1, Name: "John"}
    j, _ := json.Marshal(u)
    fmt.Printf("%s\n", j)
}

//    Output:
//        {"ID":1,"Name":"John"}

type NullInt64 struct {
    Val     int64
    IsValid bool
}

func NewNullInt64(val interface{}) NullInt64 {
    ni := NullInt64{}
    ni.Set(val)
    return ni
}

func (ni *NullInt64) Scan(value interface{}) error {
    ni.Val, ni.IsValid = value.(int64)
    return nil
}

func (ni NullInt64) Value() (driver.Value, error) {
    if !ni.IsValid {
        return nil, nil
    }
    return ni.Val, nil
}

func (ni *NullInt64) Set(val interface{}) {
    ni.Val, ni.IsValid = val.(int64)
}

func (ni NullInt64) MarshalJSON() ([]byte, error) {
    if !ni.IsValid {
        return []byte(`null`), nil
    }

    return []byte(strconv.FormatInt(ni.Val, 10)), nil
}

func (ni *NullInt64) UnmarshalJSON(data []byte) error {
    if data == nil || string(data) == `null` {
        ni.IsValid = false
        return nil
    }

    val, err := strconv.ParseInt(string(data), 10, 64)
    if err != nil {
        ni.IsValid = false
        return err
    }

    ni.Val = val
    ni.IsValid = true

    return nil
}

func (ni NullInt64) String() string {
    if !ni.IsValid {
        return `<nil>`
    }

    return strconv.FormatInt(ni.Val, 10)
}
6
задан Trent 23 March 2009 в 21:43
поделиться

4 ответа

Хотя SharePoint технически использует SQL в качестве поддержки устройства хранения данных, мы, как предполагается, не рассматриваем его как основанное на базе данных приложение. SP создает своего рода поддельную файловую систему, которая является тем, с чем мы взаимодействуем через API. Таким образом с точки зрения разработчика, Sharepoint является в значительной степени транзакцией меньше.

К сожалению, это - в значительной степени все, которое существует к нему :) Даже размышление о попытке связаться с базой данных непосредственно приведет к боли Ветхого Завета. Раздирание предметов одежды, стенающих и скрежетание зубов ;)

8
ответ дан 8 December 2019 в 12:22
поделиться

Если вы используете управление версиями, вы можете попробовать решение, которое проверяет ваш элемент, выполняет обновления и возвращает. Если требуется откат, просто отмените проверку.

Может сработать ??

4
ответ дан 8 December 2019 в 12:22
поделиться

Другой вариант - использовать рабочий процесс, упомянутый здесь . Как указано в Как Windows SharePoint Services обрабатывает действия рабочего процесса :

Windows SharePoint Services запускает рабочий процесс, пока он не достигнет точки где он не может продолжаться, потому что он ожидая наступления какого-то события: для Например, пользователь должен обозначить задачу как завершено. Только при этом "коммите" точка "делает ли Windows SharePoint Сервисы фиксируют изменения, внесенные в предыдущая версия Windows SharePoint Рабочие процессы, связанные с конкретными услугами. Эти изменения объединены в одна транзакция SQL.

1
ответ дан 8 December 2019 в 12:22
поделиться

Просто используйте Recycle(). Отслеживайте GUID в GUID[]. Если не удается открыть де RecycleBin и восстановить/удалить все по GUID

GUID[] guids = new GUID[];
SPWeb web;
SPListItem item;
SPList list;

try
{
    foreach item in list

    GUID current = item.Recycle()
    guids.add(current);

    item.Delete();
}
catch{
    if one fails : web.RecycleBin.Restore(guids);
}

if all succeed : web.RecycleBin.Delete(guids):
6
ответ дан 8 December 2019 в 12:22
поделиться