Если вы хотите изменить поле на 'hello'
, только если оно 'bye'
, используйте это:
UPDATE table1
SET col1 = 'hello'
WHERE col1 = 'bye'
Если вы хотите обновить только если оно отличается от 'hello'
, используйте :
UPDATE table1
SET col1 = 'hello'
WHERE col1 <> 'hello'
Есть ли причина для такого странного подхода? Как прокомментировал Даниэль, особого усиления нет - разве что, если у вас есть тысячи строк с col1='hello'
. Это тот случай?
Вы также можете перебирать элементы напрямую, и если вы используете поле URL, вы, вероятно, захотите использовать класс SPFieldUrlValue
, поэтому вам не придется иметь дело с тем, как SharePoint хранит URL-адреса:
foreach(SPListItem item in spList.Items){
SPFieldUrlValue data = item["Url"] as SPFieldUrlValue;
// now you have data.Description, data.Url
}
Существует много таких SPField *
вспомогательных классов, и они очень полезны, особенно когда у вас есть несколько значений.
По какой-то причине некоторые люди считают, что этот способ медленнее, основываясь на доказательствах в сообщении в блоге о сообщении Грега (даже проголосовали за него). Это, однако, не имеет ничего общего с моим ответом: цикл foreach
создает Iterator, поэтому он не должен обращаться к базе данных еще 99 раз (в сообщении они использовали для
цикл для доступа к первым 100 элементам).
если вы находитесь в функции, функция активируется в определенной области (например, сайт, Интернет, веб-приложение или ферма).
Если вы хотите получить доступ к списку из функции, используйте класс SPFeatureReceiver для привязки приемника событий к вашей функции. Затем в этом классе есть переопределения, когда запускается событие активации функции. это переопределение получает параметр типа SPFeatureReceiverProperties.
из этого параметра вы можете использовать переход на сайт:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
using(SPSite site = properties.Feature.Parent as SPSite) //this depends on scope of feature
{
SPList myList = site.RootWeb.Lists["MyList"];
}
}
, чтобы узнать, как выполнять итерацию этого списка, см. другие ответы
Правильный способ сделать это - сохранить возвращаемое значение свойства Items в переменной SPListItemCollection. При этом к базе данных запрашивается только один раз, а затем мы перебираем набор результатов, который хранится в объекте коллекции. Вот измененный пример кода:
SPListItemCollection items = SPContext.Current.List.Items;
for(int i=0;i<100 && i<items.Count;i++) {
SPListItem listItem = items[i];
htmlWriter.Write(listItem["Title"]);
}
Если вы работаете в среде x86, я недавно обнаружил потрясающий способ доступа к данным только для чтения с помощью MSSQL / OLEDB ...
SELECT * FROM OPENROWSET (
'Microsoft.ACE.OLEDB.12.0',
'WSS;IMEX=1;RetrieveIds=Yes;DATABASE=http://sharepoint.lsi.local/ops/;LIST={3DCAF100-44A1-4331-8328-748AA98E36AB};',
'SELECT * FROM list'
)
Как говорили другие, вам не следует выполнять итерацию коллекции Items напрямую (особенно в больших коллекциях). Альтернативный вариант:
// если вам нужна вся коллекция. В противном случае используйте SPQuery из списка
DataTable dt = list.Items.GetDataTable();
foreach (DataRow row in dt.Rows)
{
...
. Тогда вы сможете делать множество вещей. Если вам нужно выполнить проверку, чтобы получить только некоторые из элементов, например:
if (row["ContentType"].ToString().Equals("Your contenttype id"))
{
SPListItem item = list.GetItemById((int)row["ID"]);
, или используйте SpQuery для получения столбца в запросе, например:
SPQuery oQuery = new SPQuery();
oQuery.ViewFields = "<FieldRef Name='UrlColumn'/>";
list.Items.GetItems(oQuery).GetDataTable();
...foreach code...
row["UrlColumn"]
BTW При использовании OPENROWSET ...
IMEX = 2 для чтения / записи. IMEX = 1 - только для чтения.
List = [Name] у меня работает вместо того, чтобы использовать list = {GUID}.
Для извлечения всех элементов списка и итераций по каждому из них, лучшим решением будет следующее (предполагая, что этот код выполняется как часть функции):
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
using(SPSite site = properties.Feature.Parent as SPSite)
{
SPList list = site.RootWeb.Lists["ListName"];
SPListItemCollection items = list.Items;
foreach (SPListItem listItem in items)
{
Response.Write(SPEncode.HtmlEncode(listItem["Url"].ToString()) +"<BR>");
}
}
}
Но если список очень большой, то лучше пролистать по элементам списка:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
using(SPSite site = properties.Feature.Parent as SPSite)
{
SPList list = site.RootWeb.Lists["ListName"];
if(items.ItemCount > 100)
{
SPQuery query = new SPQuery();
query.RowLimit = 100;
int index = 1;
do
{
SPListItemCollection items = list.GetItems(query);
foreach (SPListItem listItem in items)
{
Response.Write(SPEncode.HtmlEncode(listItem["Url"].ToString()) +"<BR>");
}
query.ListItemCollectionPosition = items.ListItemCollectionPosition;
index++;
} while (query.ListItemCollectionPosition != null);
}
else
{
SPListItemCollection items = list.Items;
foreach (SPListItem listItem in items)
{
Response.Write(SPEncode.HtmlEncode(listItem["Url"].ToString()) +"<BR>");
}
}
}
}
Это основано на Best Practices for SharePoint от Microsoft.