Вы можете использовать пользовательский тип для 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)
}
Хотя SharePoint технически использует SQL в качестве поддержки устройства хранения данных, мы, как предполагается, не рассматриваем его как основанное на базе данных приложение. SP создает своего рода поддельную файловую систему, которая является тем, с чем мы взаимодействуем через API. Таким образом с точки зрения разработчика, Sharepoint является в значительной степени транзакцией меньше.
К сожалению, это - в значительной степени все, которое существует к нему :) Даже размышление о попытке связаться с базой данных непосредственно приведет к боли Ветхого Завета. Раздирание предметов одежды, стенающих и скрежетание зубов ;)
Если вы используете управление версиями, вы можете попробовать решение, которое проверяет ваш элемент, выполняет обновления и возвращает. Если требуется откат, просто отмените проверку.
Может сработать ??
Другой вариант - использовать рабочий процесс, упомянутый здесь . Как указано в Как Windows SharePoint Services обрабатывает действия рабочего процесса :
Windows SharePoint Services запускает рабочий процесс, пока он не достигнет точки где он не может продолжаться, потому что он ожидая наступления какого-то события: для Например, пользователь должен обозначить задачу как завершено. Только при этом "коммите" точка "делает ли Windows SharePoint Сервисы фиксируют изменения, внесенные в предыдущая версия Windows SharePoint Рабочие процессы, связанные с конкретными услугами. Эти изменения объединены в одна транзакция SQL.
Просто используйте 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):