Handle SharePoint large list (throttling)

Hello Folks

Most of the Developers face the throttling issue while bind and load the data from list to gridview. especially in those scenarios when you have thousands or millions of records in list. in order to protect the performance of the farm as a whole. Limits are applied on a per-Web application basis and are typically managed through the Web application settings in Central Admin. but you can handle the throttling issue while fetching the records from large list, i have tested this code on 10,000 records.

SPWeb web = SPContext.Current.Web;
SPList list = web.Lists["yourList"];
SPQuery query = new SPQuery();
query.QueryThrottleMode = SPQueryThrottleOption.Override;
SPListItemCollection items = list.GetItems(query);

The SPQueryThrottleOption enumeration has three values: Default, Override, and Strict. If you use the default value, the standard list view threshold applies to all users except local server administrators, who are not bound by either threshold. If you set the query throttle mode to Override, users who have the required permissions in the Web application user policy can query at the higher “auditors and administrators” threshold. Local server administrators remain unbound by either threshold. Finally, if you set the query throttle mode to Strict, this closes down the local server administrator loophole and the standard list view threshold applies to all users.

Hope this Help

Thanks

Happy SharePointing 😉

 

Advertisements

CheckIn and Approve all pages(PowerShell) SharePoint

Hello Folks,

After long time i am writing this blog.  here we gonna talk about checkin and publish all pages at once.

there are lots of ways to check in and approve pages at once. like from Site structure and powershell or you can check in and approve pages one by one from page library. but if you have 100s of  subsites in site collection so those method can be headache and painful for you.  so this script can help you out to checkin and approve all pages from your site collection even you have thousands of subsites in site collection.

 

function PublishAllPages ($url)

{

    $site = Get-SPSite -Identity $url

    #Walk through each Publishing Web and check in every page

    $site | Get-SPWeb -limit all | ForEach-Object {

        #Check to see if site is a publishing site

        if ([Microsoft.SharePoint.Publishing.PublishingWeb]::IsPublishingWeb($_)) {

            write-host "Reviewing pages in"$_.Title"site...."

            #Get the Publishing Web and pages within it

            $publishingWeb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($_)

            $publishingPages = $publishingWeb.GetPublishingPages()

            foreach ($publishingPage in $publishingPages)

            {

                #Check to ensure the page is checked out, and if so, check it in

                if ($publishingPage.ListItem.File.CheckOutStatus -ne "None")

                {

                    CheckInPage -page $publishingPage -web $_

                }

                else

                {

                    #Notify administrator that the page is already checked in

                    write-host $publishingPage.Title"("$publishingPage.Name") has already been checked in"

                }

                #Check to ensure page is checked in, and is so, approve it

                if ($publishingPage.ListItem.File.CheckOutStatus -eq "None")

                {

                    ApprovePage -page $publishingPage

                }

            }

        }

        else

        {

            #Notify administrator that the site is not a publishing site

            write-host $_.Title"is not a publishing site"

        }

    }

    #Dispose of the site object

    $site.Dispose()

}

function CheckInPage ($page, $web)

{

    #Check to ensure the page is checked out by you, and if so, check it in

    if ($page.ListItem.File.CheckedOutBy.UserLogin -eq $web.CurrentUser.UserLogin)

    {

        $page.CheckIn("Page checked in automatically by PowerShell script")

        write-host $page.Title"("$page.Name") has been checked in"

    }

    else

    {

        write-host $page.Title"("$page.Name") has not been checked in as it is currently checked out to"$page.ListItem.File.CheckedOutBy

    }

}

function ApprovePage ($page)

{

    if($page.ListItem.ListItems.List.EnableModeration)

    {

        #Check to ensure page requires approval, and if so, approve it

        if ($page.ListItem["Approval Status"] -eq 0)

        {

            write-host $page.Title"("$page.Name") is already approved"

        }

        else

        {

            $page.ListItem.File.Approve("Page approved automatically by PowerShell script")

            write-host $page.Title"("$page.Name") has been approved"

        }

    }

    else

    {

        write-host $page.Title"("$page.Name") does not require approval in this site"

    }

}

after running above script run the below command to call above script.

PublishAllPages -url sitecollectionurl

Thanks to  for this script!

Hope this help.

Happy SharePointing 😉

The EXECUTE permission was denied on the object proc_MSS_GetTopology’, database ‘Search_Service_Application_DB

Hello Folks,

when i got back to work in the morning i saw my search service was not working and throwing the error.

The EXECUTE permission was denied on the object ‘proc_MSS_GetTopology’, database Search_Service_Application_DB  {GUID} ”  this was caused due to the fact my new farm account didn’t have the“SPSearchDBAdmin”  role assigned under the Security > Users  > “SP farm Account”  on Search_Service_Application_DB  database (SQL Server Management Studio) other databases related to SharePoint Search service.  Once this was resolved my “Search Service Application: Search Administration” page displayed and I could create crawls.  you can follow below image for assigning the role of SPSearchDBAdmin.

423350

 

Thanks

Hope this Help.

Happy SharePointing 🙂

 

 

User Profile Synchronization Service SP2013 stuck on starting after upgrade from SP2010 to SP2013

Hello Folks,

I am in the process of upgrading our SharePoint Farm from 2010 to 2013. recently i have upgraded my User Profile Service and had trouble starting the UPS Synchronization Service which I spent hours trying to solve this issue. The UPS service application requires an encryption key that is stored separately from the database and is needed if you want to upgrade the User Profile Sync database.

steps to solve this issue.

Export the key from your SP2010 Farm:

just run the command prompt and execute this command.

%Program Files%Microsoft Office Servers14.0Synchronization ServiceBinmiiskmu.exe

Once you run this command Follow the prompt with your Farm Account credentials.

 

1

Copy the key file to the 2013 Farm

Import the Encryption Key on the SP2013 Farm:

Open a command Prompt from this location:

%Program Files%Microsoft Office Servers15.0Synchronization ServiceBin

Type the following: (Yes including the GUID)

miiskmu.exe /i YourFilePathwithFilename  {0E19E162-827E-4077-82D4-E6ABD531636E}

You should receive a message stating that the import was successful.

Start the UPS Sync Service

Starting the Service through CA then worked for me.

 

Hope this Help 🙂

Happy SharePointing

Search Application Topology

hey folks,

just recently i have implemented Search topology  with PowerShell so i thought i should share with you. there is no more UI options to set the search topology on different servers as we used to do in SharePoint2010, in SharePoint2013 you have to do it with PowerShell cmdlet , my current  scenario is that i have 3 servers and i have divided all component on these servers as you can see in the picture of After movement.

1 App Server

2 Web Front-end Servers.

SharePoint farm environment usually the Application Server will host all the Services including the Search Application services. The Search Application consists of several Search components like

  • Admin
  • Crawler
  • Content Processing
  • Analytics processing
  • Query Processing
  • Index

   Before Movement

Untitled

   After Movement 

search topology

 

below is the PowerShell cmdlet through these commands you can move the search Component.


$ssa = Get-SPEnterpriseSearchServiceApplication
$active = Get-SPEnterpriseSearchTopology -SearchApplication $ssa -Active
$clone = New-SPEnterpriseSearchTopology -SearchApplication $ssa -Clone –SearchTopology $active

$Srv2 = Get-SPEnterpriseSearchServiceInstance -Identity "Server Name Here"
New-SPEnterpriseSearchQueryProcessingComponent -SearchTopology $clone -SearchServiceInstance $Srv2
New-SPEnterpriseSearchAnalyticsProcessingComponent -SearchTopology $clone -SearchServiceInstance $Srv2
New-SPEnterpriseSearchContentProcessingComponent -SearchTopology $clone -SearchServiceInstance $Srv2
New-SPEnterpriseSearchCrawlComponent -SearchTopology $clone -SearchServiceInstance $Srv2

Start-SPEnterpriseSearchServiceInstance -Identity $Srv2
Set-SPEnterpriseSearchTopology -Identity $clone
—————-
<em>Clone again to remove original</em>

$ssa = Get-SPEnterpriseSearchServiceApplication
$active = Get-SPEnterpriseSearchTopology -SearchApplication $ssa -Active
$clone = New-SPEnterpriseSearchTopology -SearchApplication $ssa -Clone –SearchTopology $active

Get-SPEnterpriseSearchComponent -SearchTopology $clone  — to get the component id for the subsequent commands

Remove-SPEnterpriseSearchComponent -Identity  <strong><span style="text-decoration: underline;">COMPID</span></strong> -SearchTopology $clone -confirm:$false
Set-SPEnterpriseSearchTopology -Identity $clone

—–

COMPID is the component id of the search component to be removed. You can get all component running on the server by using the command

Get-SPEnterpriseSearchComponent -SearchTopology $clone

 

thanks

Hope this help

Happy sharePointing 😉

 

post back issue after file download from SharePoint

hello Geeks,

i was facing  issue to download the file from SharePoint  after I download this file, I can’t click on other buttons even the same download button does not work.  after little search i found some information regarding this issue, SharePoint registers a JavaScript “on submit” handler. In this handler the global variable _spFormOnSubmitCalled is set to true. SharePoint uses this variable to check if a submit was executed and prevents any further submits. Since your “download postback” does not refresh the page this variable remains true. With the effect that all other buttons stop working. In SharePoint 2013  there is a function for resetting _spFormOnSubmitCalled to false already so no need to write your own.

here is my code


 SPList list = webObj.Lists["Documents"];
 SPFile file = list.RootFolder.Files["your pdf file url"];
 Response.ContentType = "Application/pdf";
 Response.AppendHeader("content-disposition", "attachment; filename=" + file);
 Response.Clear();
 Response.Flush();
 Response.End();

 

after writing this code just add the below line to your client side code.

 

<asp:LinkButton ID="lnk" runat="server" OnClick="lnk_Click" Text="<%$ Resources:Portal,DonwloadText %>" CausesValidation="false" OnClientClick="javascript:_spResetFormOnSubmitCalledFlag()"></asp:LinkButton>    

 

Hope this help

Regards

 

 

 

Youtube Integration with SharePoint

Hey Geeks

after long time i am writing this post due to busy schedule. recently i got the opportunity to integrate SharePoint with YouTube i had the requirement to Develop the Videos gallery control and videos should be fetch from YouTube channel.  here are the steps.

first you need to register these three DLLs in your solution in Package.Package file(you can download these DLLs from MyOneDriveShareFiles) then Let’s create a class to represent YouTube video on our control. The object of this class is a video that has properties: VideoId, Title, PublishDate, VideoDuration.  these properties will help us to show the publishing date of the video, Title of the video, and duration of the video, …ETC..there are lots of other properties in the dlls that can help you to more customize the functionality. if you want to make webpart configurable so you need to create webpart properties.

To use all possibilities that YouTube Data API offered, you need to get Developer Key.  Developer key uniquely identifies an application that will interact with the YouTube service. You can get it Here

string YOUTUBE_CHANNEL –> WebPart Property for YouTube channel name

string YOUTUBE_DEVELOPER_KEY –> WebPart Property for YouTube developer Key(Optional)

 



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Google.GData.Client;
using Google.YouTube;

namespace AlQasmia.Utility_Functions
{
    public class YouTubeVideoObject
    {
        public string VideoId { get; set; }
        public string Title { get; set; }
        public string PublishDate { get; set; }
        public string VideoDuration { get; set; }
    }
    public class YouTubeVideoHelper
    {
       // const string YOUTUBE_CHANNEL = "BobinaMusic";
        //const string YOUTUBE_DEVELOPER_KEY = "AI39si6JqO_f2b_JWSV3QUbcwg5S-1RJ4-kiieosBZy9r1ORkCAv7BT5tLp579Tzmly8rvOVm3Jyueq3ZVqUNt1blS4DcoVppA";

        public static YouTubeVideoObject[] GetVideos(string YOUTUBE_CHANNEL, string YOUTUBE_DEVELOPER_KEY)
        {
           
                YouTubeRequestSettings settings = new YouTubeRequestSettings("Channel", YOUTUBE_DEVELOPER_KEY);
                YouTubeRequest request = new YouTubeRequest(settings);

                string feedUrl = String.Format("http://gdata.youtube.com/feeds/api/users/{0}/uploads?orderby=published", YOUTUBE_CHANNEL);
                Feed videoFeed = request.Get(new Uri(feedUrl));

                return (from video in videoFeed.Entries
                        select new YouTubeVideoObject() { VideoId = video.VideoId, Title = video.Title, PublishDate = video.YouTubeEntry.Published.Date.ToShortDateString(), VideoDuration = video.Media.Duration.Seconds}).ToArray();
           
           
        }
    }
}


Now its time to bind videos with Repeater control. you can use grid as well.

<asp:Repeater ID="VideosRepeater" runat="server">
    <ItemTemplate>
    
             
Publish Date:<%# Eval(“PublishDate”) %> Duration:<%# Eval(“VideoDuration”)%> (Seconds)
    </div>
    </ItemTemplate>
    <SeparatorTemplate>
      <br />
    </SeparatorTemplate>
    </asp:Repeater>
    <div class="button">
    
    <asp:ImageButton ID="ImgBtnPrev" runat="server" CssClass="button" OnClick="LnkBtnPrev" ImageUrl="/_layouts/images/prev.png" />
    <asp:ImageButton ID="ImgBtnNext" runat="server" CssClass="button" OnClick="LnkBtnNext" ImageUrl="/_layouts/images/next.png" />

Below you can find the Repeater Control Code.


 public YouTubeChannel ParentWebPart
        {
            get;
            set;
        }

        public int PagNum
        {
            get
            {
                if (ViewState["PagNum"] != null)
                {
                    return Convert.ToInt32(ViewState["PagNum"]);
                }
                else
                {
                    return 0;
                }

            }
            set
            {
                ViewState["PagNum"] = value;
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {

                    YouTubeVideos();
                }
            }
            catch (Exception ex)
            {

                ex.ToString();
            }
           

        }


        public void YouTubeVideos()
        {
            try
            {
                SPSecurity.RunWithElevatedPrivileges(delegate
                {

                    int cnt;


                    YouTubeVideoObject[] arr1 = YouTubeVideoHelper.GetVideos(ParentWebPart.youTubeChannelName, ParentWebPart.DeveloperKey);

                    DataTable dt = new DataTable();
                    dt.Columns.Add("Title");
                    dt.Columns.Add("VideoId");
                    dt.Columns.Add("VideoDuration");
                    dt.Columns.Add("PublishDate");
                    for (int i = 0; i < arr1.Length; i++)
                    {
                        DataRow row = dt.NewRow();
                        var VidObj = arr1[i];
                        row["Title"] = VidObj.Title;
                        row["VideoId"] = VidObj.VideoId;
                        row["VideoDuration"] = VidObj.VideoDuration;
                        row["PublishDate"] = VidObj.PublishDate;
                        dt.Rows.Add(row);
                    }

                 
                    PagedDataSource pagedata = new PagedDataSource();
                    DataTable dt2 = new DataTable();
                    DataSet ds = new DataSet();

                
                    ds.Tables.Add(dt);
                    cnt = ds.Tables[0].Rows.Count;
                    cnt = ds.Tables[0].Rows.Count;

                    pagedata.DataSource = ds.Tables[0].DefaultView;
                    pagedata.AllowPaging = true;
                    pagedata.PageSize = 10;
                    pagedata.CurrentPageIndex = PagNum;

                    int vcnt = cnt / pagedata.PageSize;
                    if (PagNum < 1)
                      
                        ImgBtnPrev.Visible = false;
                    else if (PagNum > 0)
                      
                        ImgBtnPrev.Visible = true;
                    if (PagNum == vcnt)
                        
                        ImgBtnNext.Visible = false;
                    if (PagNum < vcnt)
                      
                        ImgBtnNext.Visible = true;




                    VideosRepeater.DataSource = pagedata;
                    VideosRepeater.DataBind();





                  
                });
        
            }
            catch (Exception ex)
            {

                ex.ToString();
            }
            
        
        }


        protected void LnkBtnPrev(object sender, EventArgs e)
        {
            PagNum -= 1;
            YouTubeVideos();


        }
        protected void LnkBtnNext(object sender, EventArgs e)
        {
            PagNum += 1;
            YouTubeVideos();
        }

 

These are the Snaps.

YouTubeWP

 

WPProperties

once you deploy the solution just go and configure the webpart properties(if you have) put the channel name and developer Key(if you have) and save it. that’s it

 

Thanks and Have a good day

Happy SharePointing 😉

Remove Extra Space Around the Web Part In SharePoint 2013

Hey Folks,

An extra padding of 20 pixel is included by default in SharePoint 2013 for every webpart. so this issue can be resolve and you can remove extra space around the webpart by this CSS.

 <style type="text/css">

     .ms-webpartPage-root {
         border-spacing: 0px !important;
     }
       .ms-webpartzone-cell {
         margin: 0px !important;
     }
 </style>

 

Happy SharePointing 😉

Administration Content Database in Suspect Mode

 

Go to your SQL Server and ensure either your Central Admin Content Database or Config Database, if it is in Suspect mode,  see snapshot below:

1

 

Central Admin Content database or a Config database can abruptly go into the suspect mode without any apparent logical reason. In my case, SharePoint Central Admin Content Database went into the Suspect mode.

To resolve the issue, follow steps in the following order as mentioned:

Go to your MSSQLData files that reside under: C:Program FilesMicrosoft SQL ServerMSSQL10.MSSQLSERVERMSSQLDATA

 

2

 

. Identify your Central Admin Content Database name in my case it got screwed up and was in the suspect: mode: so this is my content database name SharePoint_AdminContent_38c5cc2d-aeec-4dc2-b7a5-65457250ae2c

Please take a backup of the corrupted .mdf and .ldf files, before following other steps.

 

Open your SQL Server Management Studio ->, New Query and it opens up your SQL Query editor, copy and paste the query below and change the highlighted to your database name:

Use master

–Verify whether Database has any issues
EXEC sp_resetstatus “SharePoint_AdminContent_38c5cc2d-aeec-4dc2-b7a5-65457250ae2c.mdf”

—Alter database and put it on Emergency Mode
ALTER DATABASE “SharePoint_AdminContent_38c5cc2d-aeec-4dc2-b7a5-65457250ae2c” SET EMERGENCY
DBCC checkdb(‘SharePoint_AdminContent_38c5cc2d-aeec-4dc2-b7a5-65457250ae2c’)

–Set the database in the Single User mode
ALTER DATABASE “SharePoint_AdminContent_38c5cc2d-aeec-4dc2-b7a5-65457250ae2c” SET SINGLE_USER WITH ROLLBACK IMMEDIATE

–Repair the database and allow data loss
DBCC CheckDB(‘SharePoint_AdminContent_38c5cc2d-aeec-4dc2-b7a5-65457250ae2c’,REPAIR_ALLOW_DATA_LOSS)

–Set the database back to Multi-User mode
ALTER DATABASE “SharePoint_AdminContent_38c5cc2d-aeec-4dc2-b7a5-65457250ae2c” SET MULTI_USER

–Ensure Database is reset
EXEC sp_resetstatus ‘SharePoint_AdminContent_38c5cc2d-aeec-4dc2-b7a5-65457250ae2c’

 

Execute all the commands in your SQL Query Editor and there you go, Go back to your SQL Management Studio and you can see that the (Suspect) mode issue against the Content/Config database is fixed and the database got fully repaired and restored.

To verify , hit your Central Administration and it starts working just fine…

 

Happy SharePointing 😉