This site is a self-contained low down on what's going on in my life, what I'm working on, what I'm thinking about, and how I'm feeling about life in general.
Thursday, 31 July 2008
This article is aimed at those developers who've developed their own SharePoint 2007 webparts in Visual Studio using the wss sdk and want to deploy them to a different server.
The first step is to do a standard Visual Studio deployment of your webpart (F5 or the play button). Once this has happened go to the project folder, then the bin > debug folder.
In here you should have a file along the lines of my_projects.wsp. Take this file and copy it to a folder on one of the web front ends you are deploying on.
Next you need to create two files in the same folder ideally as your .wsp file.
Create a new text document and call it DeploySolution.cmd, then add the following lines to it, replacing my_solution.wsp with your solution name.
@setlocal
@pushd.
@set PATH=C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12BIN;%PATH% @cd %~dp0
stsadm.exe -o addsolution -filename my_solution.wsp
stsadm.exe -o deploysolution -name my_solution.wsp -allcontenturls -allowGacDeployment -immediate
stsadm.exe -o execadmsvcjobs
@pause
@popd
@endlocal
Once you have done that, create another text document and call it RetractSolution.cmd, then add the following lines to it, again, replacing my_solution.wsp with your solution name.
@setlocal
@pushd.
@set PATH=C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12BIN;%PATH% @cd %~dp0
stsadm.exe -o retractsolution -name my_solution.wsp -local -allcontenturls -immediate
stsadm.exe -o deletesolution -name my_solution.wsp
stsadm.exe -o execadmsvcjobs
@pause
@popd
@endlocal
Use the first script to deploy your solutions on the server. If you need to update the solution, first use the retract solution script, then re-run the deployment script.
Once you've run the script, you'll most likely have to go into Site Settings > Site Collection Features and turn on the webpart.
Thursday, 19 June 2008
I’ve been trying to create two webparts that communicate with each other in SharePoint. Looking around the web there are a number of good examples of how to create an asp.net 2.0 webpart that communicates with another but there are a couple of things that they don’t tell you.
If you want your webparts to be able to talk to each other, you have to develop them in the same project in Visual Studio, otherwise they won’t compile. Sounds obvious enough but no-one ever actually says to do this.
Once you’ve built the provider webpart, simply add a new webpart into the solution explorer and off you go.
Another thing that is never covered for SharePoint is how to link the webparts once they’ve been developed. Firstly, click edit page, and then click the edit button on either the provider or the consumer webpart.

From here you will see connections, select send ... to, or get ... from, depending on which webpart you’re looking at. Once this relationship has been established, your webparts should communicate perfectly.
Friday, 30 May 2008
I can honestly say that writing a .net 2.0 webpart for sharepoint 2007, that has the sole function of reading data from a database, has been the hardest thing I've ever done in my life!
It took me 14 hours through a combination of trail and error to get it working, finding very few resources online, and not being able to use the coveted visual tools available to asp.net developers. Anyway, I got there, and I'll share how with you.
To start with, the tools used. I'm using visual studio 2005, and have the wsssdk installed, the sharepoint 2007 sdk, and the wss 3.0 extenders for Visual Studio 2005.
Start up Visual Studio and create a new webpart. It'll be called webpart1 by default, lets leave it at that for now. First off, right click the project in the solution explorer, and click add reference. Scroll down and select System.Data. Once you've added this we're ready to begin.
Now, make your code look like this:
using System;
using System.Runtime.InteropServices;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Serialization;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
namespace WebPart1
{
[Guid("493c926d-f885-4965-b72d-ee18e0292630")]
public class WebPart1 : Microsoft.SharePoint.WebPartPages.WebPart
{
private string _sqlStatement = "SELECT * from tblTest";
[WebBrowsable(true),
Personalizable(PersonalizationScope.Shared),
WebDisplayName("SQL Statement"),
WebDescription("Query to return a set of data")]
public string SQLstatement
{
get { return _sqlStatement; }
set { _sqlStatement = value; }
}
protected override void CreateChildControls()
{
if (string.IsNullOrEmpty(SQLstatement)
|| !SQLstatement.ToUpper().TrimStart().StartsWith("SELECT")
|| SQLstatement.Contains(";"))
{
Literal lit = new Literal();
lit.Text = "Only single SELECT statement allowed"; Controls.Add(lit); return;
}
DataGrid grid = new DataGrid();
//Attempt connection
try
{
using (SqlConnection conn = new SqlConnection("server=SP-TEST\\databasearea; Initial Catalog=spTest; User ID=sharepoint; Password=password; Trusted_connection=yes;"))
{
SqlCommand cmd = new SqlCommand(SQLstatement, conn);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
grid.DataSource = reader;
grid.AutoGenerateColumns = true;
grid.DataBind();
reader.Close();
conn.Close();
} Controls.Add(grid);
}
catch (Exception exp)
{
Literal errMessage = new Literal();
errMessage.Text = exp.ToString();
Controls.Add(errMessage);
}
}
}
}
Now just build the control and your webpart should be working well. Lets take a look at some of the key parts.
private string _sqlStatement = "SELECT * from tblTest";
[WebBrowsable(true),
Personalizable(PersonalizationScope.Shared),
WebDisplayName("SQL Statement"),
WebDescription("Query to return a set of data")]
public string SQLstatement
{
get { return _sqlStatement; }
set { _sqlStatement = value; }
}
This part sets the SQL query you're about to run.
using (SqlConnection conn = new SqlConnection("server=SP-TEST\\databasearea; Initial Catalog=spTest; User ID=sharepoint; Password=password; Trusted_connection=yes;"))
{
SqlCommand cmd = new SqlCommand(SQLstatement, conn);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
grid.DataSource = reader;
grid.AutoGenerateColumns = true;
grid.DataBind();
reader.Close();
conn.Close();
} Controls.Add(grid);
This part connects to the database and displays the results in a data grid. Note the server name SP-TEST\\databasearea has two backslashes, this is to counter the escape effect of a backslash.
So that's it really, tiny bit of code with big implications. Hope it opens some doors for you.
Wednesday, 28 May 2008
Lets get something straight, I hate Microsoft SharePoint.
Not because it's a bad product or it's expensive licensing, it's because I'm a web developer being bullied and backed into a corner by it.
I actually think SharePoint is good for some things, its Active Directory integration, it's ease of use and powerful feature set, but it should know it's place.
Microsoft may lead you to believe that it's all powerful with it's Master Pages and .net 2.0 framework construction, but in truth, it is not a good platform to build custom applications into. Even what should be a no brainer for something so powerful, connecting to an SQL database and returning tabulated data, is an absolute chore of the highest calibre.
I'm tasked with building bespoke solutions for a SharePoint portal, and the only way I can do this is through what are called webparts. These webparts are actually quite powerful, if a little limited, in that to build a multi-page application, you need to build lots of webparts and piece them together in multiple sharepoint pages.
It's a total bind, but I'm warming to them, looking at the positives I can deploy a web part across a huge number of different web portals very quickly, without duplicating any code. That's it for the positives so far, I'll let you know how I get on....