Disclaimer: Approach used in this blog post is risky and not recommended. The idea of this post is to just understand the insight and sharing my experience with my blog readers. If still you want to try this for any situation then please do this at your own risk.
We earlier created a custom list using list definitions feature in our site. After one month, we decided that the list definition responsible for list creation had to move to another feature to make the feature as the group of alike lists.
After deployment, we found that list was not being opened and was throwing error. So after digging in to log file, I came to know that list was still pointing to previous feature and now that feature didn’t have the reference for the list schema (As we had already moved the reference to the new feature). I was not ready to take risk of deleting the existing list as it was already contained thousands of referenced items. Deleting the list means to do lots of manual work to fix the functionality and to waste the time and effort.
Now there was only one way that if somehow I could change the reference of existing feature id of list to new feature id. But how that was possible??
I couldn’t found a direct way by using code or Power Shell script to change the feature reference of existing list. So I started analyzing and thought that at least there must be some place where SharePoint keeps this configuration and my mind said content database. Now as you know that SharePoint content database is not a piece of cake to understand and it’s very complex to understand. Everything is based on GUID and referencing is too complex to understand. Due to this complexity, Microsoft doesn’t recommend to touch the content database. But for me there was no other way. So below is how I fixed this issue.
- In site content database, there is a table (AllLists) that has all such references. This table keeps the relation information of a custom list and feature related with the list.
- ‘tp_Title‘ column has the name of list(s) and ‘tp_FeatureId‘ column keeps the feature id related to the specific list.
- My list name was ‘AnnouncementCategory’ and first I perform the below command.
SELECT * FROM [AllLists] where tp_Title like ‘%Announce%’
This query gave me all related lists result set. After analyzing the result set I came to know that all other related lists are pointing to same feature id but the problematic list was pointing to different feature id (The previous feature).
- Now I decided to update the feature id value to see the difference. I noted down the current feature-id value at notepad (In case to revert back the changes) and execute below mentioned update command to update the feature id.
update AllLists set tp_FeatureId=’xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx’ where tp_ID like ‘%xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx%’
tp_FeatureId : This is the feature id of new feature that contains the reference of the existing list. You can get this from your code file (Feature.xml) or from 14 hive (C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\FEATURES).
tp_ID : This is the unique id column in the AllLists table to identify a specific record.
- After running this command, when I tried to open the problematic list then to my surprise it opened without any error. After that I performed some testing on the list to verify that whether everything is working fine or not.
- Testing included adding/updating/deleting/content migration and lookup references of list.
For me after spending a couple of hours, it was like bingo. Happy Share Pointing 🙂
I developed an event handler and need to deploy it on production server. My production server is built on Windows 2008 Enterprise Server 64 Bit and there was only one installation on server i.e. SharePoint Server 2010. Now I need to install my assembly in to GAC. I copied my .dll to production server. Then I opened c:\windows\assembly and drag drops my assembly in to GAC (c:\windows\assembly folder). But nothing happened and my assembly couldn’t install in GAC 😦
Drag and drop was not working. So second alternative was to use gautil.exe to install the assembly inside GAC but as it was production server so there wasn’t any installation of visual studio and hence there was no SDK installed therefore there wasn’t such exe like gacutil.exe. Again that was a problem. Now I worked on why drag and drop is not working. I searched here and there and follow some articles but nothing helped me. I disable UAC and restart server but it doesn’t work. I opened console and explorer using run as administrator but nothing helped me. Then I copied gacutil.exe file from my development machine to production server but I couldn’t run it (Though lastly this technique worked for me).So finally I resolved this issue and below are the directions for how to resolve this?
1. First check that if production server is of 32 bit or 64 bit?
2. If it is 64 bit then open folder “C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64“
But if it is 32 bit then open folder “C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin“
3. Copy 2 files i.e. gacutil.exe & gacutil.exe.config
4. Paste these files to any location of production server.
5. Your gacutil.exe is now ready to run and u can install assembly in to GAC using this small utility.
Points to Remember
* When you drag and drop assembly in GAC it won’t give proper error messages (Like targeting framework error) if it has any so better to use gacutil to install assembly.
* gacutil.exe doesn’t run standalone rather it needs a configuration file to run i.e. gacutil.exe.config
I was executing a command using stsadm and when I hit enter it was displaying an error stating that “Command Line Error”. Everything was perfect from my end but it was weird to getting this error. So finally I could resolve this. For information how to resolve this find my earlier blog post here.
Though it was for a different problem but resolution of both problems is same.
I was trying to register custom profiledeletehandler by using stsadm command line utility. My command, code and assembly were perfect. But even then when I was trying to execute stsadm then it was displaying “The given assembly or codebase was invalid”.
Humnnn what could be the problem then after doing some research I came to know that I wrote the part of the command in notepad first and then copy/paste this part in command line. OMG, that was some encoding problem while copy/pasting the command.
Though if you delete the stsadm command and retype this in command line console then both (earlier & retyped) will look same. But this was only and major difference and solve the problem.
Solution: Please type the whole command by your own including each and everything.
Moral of the Story:
1. Avoid copy/pasting the stsadm command from other application as you can be the victim of this type of problem.
2. Always do check for PublicKeyToken values (If u are using assembly reference) twice and other spelling mistakes in stsadm command, as it can be the cause of these type of problems.
Problem: Inside variation labels, if we click on create hierarchies button nothing happens.
Scenario: I had a publishing site with variation enabled on a specific port. I backed up the site and restore it on a web site hosted on another server. This new website is on different port. Now i created a new variation label inside new site and after creating variation label, when i clicked on Create Hierarchies button nothing got happen. So i started to search the root cause of this problem. I first open the variation link to check the variation settings and here i found that location in the variation home section was pointed to the old server and settings were disabled. Humnnn it meant that this was the root cause of the problem. So question arises that how to change the settings as i wanted to keep all the sites that were earlier created by using variation hierarchies and using GUI there was no option to reset these settings. After searching Google, i couldn’t find any specific things regarding this. Problem was that linking in variation settings was not appropriate. So after spending lots of hours to fix this problem i came to know that there is a hidden relationship list inside the publishing site that has variation functionality. So after tweaking my site URL i got that list. Below are the steps to fix this problem.
1. Append your root site URL like this “http://testserver:9001/relationships%20list/allitems.aspx“.
2. Relationships List will open and here you will see so many entries of (no title) depending upon the earlier sites created.
3. You have to open and view each item until you find the value “F68A02C8-2DCC-4894-B67D-BBAED5A066F9” against the GroupId column.
4. This item has relation link for variation home site and this value will same for all publishing sites having variations.
5. Edit the item.
6. Against ObjectId column fill the URL of root site e.g. http://testserver:9001
7. Give any title and click on OK button.
8. Come out from that list, create a new variation label and then create hierarchies button.
9. Voilà hierarchies are creating now.
So once again I am back with a blog post…
Today we will see that how to import a spreadsheet inside a custom list with defined columns.
We are ready for production deployment for an application. This application contains the master data for cities all over the world. Client provided us the list of 9000 cities that need to be inserted inside master custom list as we know that 9000 entries will take the hell lot of time to add in the list. So how would I do it within the sort span of time?
The only way that I put all the cities inside an excel and then create a new a custom list by importing that excel. So I start the thing. I create a list using import spreadsheet option but ooopsssss all cities updated inside that custom list but when I look at the column name this shows me like Column1, Column2, etc….
This was very disappointing as this list and columns are used in my custom code, and I don’t want to change my code due to this.
SO QUESTION WAS that I want 9000 entries inside custom list with desired column names…
What to do so below are the steps to do that.
- First open the excel sheet.
- Paste the data inside excel sheet accordingly you want.
- Now in the first row put the column name that you want the list column name.
- Remember that between two columns there should not be any column left blank.
- Now select first cell of the sheet.
- Click on Insert tab and then click on the table.
- It will open a Create table window with the selected range of data.
- Select my table has headers checkbox then ok.
- Now your sheet is in a table format, and we are on the way.
- Now open the site and select on create.
- Create the custom list using import spreadsheet option
- Give a name of the list and path of the excel sheet and click on import.
- It will open the excel sheet and a window.
- Select cell ranges in the drop down and give the range of the cells.
- Just import and after completing the process we have a custom list with data and desired column names.
Happy SharePointing 🙂
I have a solution that contains SharePoint dll’s reference. Whenever I run the solution, start page get crash and show me this error.
“Could not load file or assembly ‘Microsoft.SharePoint.Search, Version=126.96.36.199, Culture=neutral, PublicKeyToken=71e9bce111e9429c’ or one of its dependencies. An attempt was made to load a program with an incorrect format.”
Well every time I run the project it creates Microsoft.SharePoint.Search.dll and Microsoft.SharePoint.Search.xml inside the bin folder and it creates the problem. Well there are lots many things have written on web regarding this problem. I follow all these things but could not get rid of this error. Finally I decided to fix this problem according to my way. So below are the steps to fix this problem permanently.
1. Inside solution explorer (Visual Studio), select the project and right click on that.
2. From context menu, click on properties.
3. When properties page opens, Click on Build Events.
4. Under Post – build event command line, copy and paste below lines
Now save the project, build the project and run. Now above mentioned error will never irritate you. 🙂
During my SharePoint project i need to clean up the site for better performance. So first thing i started to delete the closed web parts from web part pages. As there were so many web part pages in the application so i decide to write a web application that can delete the closed web parts after run. Well when i run the application i got “The security validation for this page is invalid. Click Back in your Web browser, refresh the page, and try your operation again.” error on delete operations. I knew that this error was due to the fact that Web Page Security Validation was turned on that site and it was restricting me to delete the web part from my application. I can change the settings from Central Administration by turning off the security validation for that site but it’s not a good practices as any malicious code can harm your site as the security validation was off for that site. So i decide to handle this thing pro grammatically from my code so that it only disable security validation of web for a moment when only my code will run otherwise it will be on and protect my web from harmful activities. Well so here is the solution i applied.
Microsoft.SharePoint.Administration.SPWebApplication webApp = web.Site.WebApplication;
webApp.FormDigestSettings.Enabled = false;
// Insert your code for adding/deleting/updating here
webApp.FormDigestSettings.Enabled = true;
That’s it and i was back for deleting closed web parts 🙂
Well as we know that we can extend a SharePoint site for different zone other than default with different port number and host header. In extended site creation, a new site creates on IIS pointing to a new virtual directory on server. This new virtual directory has its own web.config file for extended site. But extended site points to same content db as the original site has. Therefore end user access same contents through different site urls depending upon the permission set on individual sites. In short you can say that extended site is a replica of its original site as both sites serve from same content db.
Now you want to remove/delete an extended web site from SharePoint server. What to do as extended site doesn’t show in “web application list” and in “Delete Web application”. Well no probes as I mentioned earlier that when we extend a web application it just create a site in IIS and point to existing site content database. So if we remove it from IIS and delete the virtual directory created by extended site then it should remove and delete from SharePoint server. But that’s a manually part and in this case we can miss some references. So here is the best practice for that:
- Open Central Administration and go to Application Management tab.
- Under “SharePoint Web Application Management” section, click on “Remove SharePoint from IIS Web site” link.
- Select the actual web application from which you create extended site.
- Under “Select IIS Web site and zone to remove” drop down list, expand the drop down by clicking the arrow button.
- Here you will get all the extended sites with their zones including the actual website (Always created in Default Zone).
- Select the extended site that you want to remove.
- Under “Delete IIS Web sites”, check the Yes radio button and click OK.
- Wait for processing and after completing the process you are done.
When we create a new web application in SharePoint using central administration, we get a section of “Reset Internet Information Services“ and by default its set to “Restart IIS Manually”. Many times we keep this option by default and create the application but even after successful web application creation we don’t reset IIS and go further for Site Collection creation without any problem. So what is the use of that option even we don’t do anything manually. So here is the explanation.
Single Server Scenario
When we create a new web application it asks for the Application Pool information to us. We can use an Application pool for new web application from the existing application pools or we can create a new application pool for the web application. Now if we create a new application pool then we need not to reset IIS as the purpose of IIS reset is just to recycle the application pool in which our newly created web application will reside. But if we use the existing application pool then it’s the best and recommended practice to reset IIS as may be of existing application pool will not recognize the new web application some time so we need to recycle this using an IIS reset.
So for the best practices, always go for default option and do an “IISRESET /noforce” manually on application server whenever a new application created in a Single server scenario.
Another option i.e. “Restart IIS Automatically” never applies to application server (In which the CA exists) but this option is used to reset the IIS on other web front end servers reside in Farm. For the Application server either it is single server configuration or farm configuration you must reset IIS manually as it won’t reset IIS automatically for application server.
In the Farm scenario, If “Restart IIS Automatically” option is not selected and you have more than one server in the farm, you must wait until the IIS web site is created on all servers, and then run “IISRESET /noforce” on each Web server. The new IIS site will not be usable until that is completed.
So for the best practices, always select “Restart IIS Automatically” option and do an “IISRESET /noforce” manually on application server whenever a new application created in a FARM scenario.