Welcome to my blog on all things SharePoint. I have a range of articles that will interest you if you've made it as far as visiting my blog. I was awarded as an SharePoint MVP by Microsoft in July 2010. I currently live in New York and am an Enterprise Architect at AvePoint Inc.. I co founded www.NothingButSharePoint.com with Mark Miller in 2010.

MVP AwardJeremy Thake Profile Photo

Whitepapers

NBSP

Check out my articles on NothingButSharePoint.com

Solution Development in SharePoint 2007

This series was inspired by the chatter amongst SharePoint blogs on the best ways to approach customisations in SharePoint using Solutions.

Part 1 - Part 2 - Part 3 - Part 4 - Part 5 - Part 6 - Part 7 - Part 8

Leveraging the SharePoint Platform

This series was inspired by a discussion had with Andrew Coates at a Perth SharePoint User Group meeting. This then turned into a 6 part series on Arno Nell's SharePointMagazine.net web site.

Initial post - Part 1 - Part 2 - Part 3 - Part 4 - Part 5 - Part 6

Webcasts

I have recorded various web casts that I present at User Groups or just on a specific topic by request:
How ASP.NET Developers can leverage SharePoint webcast
SPSource Webcast: Reverse engineer Lists to ListTemplates and much more
SharePoint Development with Unit Testing webcast
Perth SharePoint UG Web Cast on approaches to deploying artefacts (SPSource)
More...


Podcasts

I have been interviewed about Leveraging the SharePoint Platform by the SharePoint Pod Show: listen here .

RSS Feed Feed your read!

Archives

November 2012 (6)
October 2012 (8)
September 2012 (4)
August 2012 (7)
July 2012 (13)
June 2012 (4)
March 2012 (1)
February 2012 (1)
January 2012 (5)
September 2011 (2)
August 2011 (1)
July 2011 (3)
June 2011 (7)
May 2011 (3)
April 2011 (3)
March 2011 (3)
February 2011 (2)
January 2011 (1)
December 2010 (4)
September 2010 (4)
July 2010 (5)
June 2010 (4)
May 2010 (6)
April 2010 (7)
March 2010 (5)
February 2010 (7)
January 2010 (3)
December 2009 (1)
November 2009 (6)
October 2009 (9)
September 2009 (7)
August 2009 (6)
July 2009 (13)
June 2009 (4)
May 2009 (12)
April 2009 (4)
March 2009 (4)
February 2009 (13)
January 2009 (4)
December 2008 (4)
November 2008 (11)
October 2008 (16)
September 2008 (4)
August 2008 (5)
July 2008 (4)
June 2008 (8)
May 2008 (5)
April 2008 (9)
March 2008 (5)
February 2008 (6)
January 2008 (1)
November 2007 (11)
October 2007 (8)
September 2007 (24)
August 2007 (5)
July 2007 (2)
May 2007 (1)
April 2007 (1)
March 2007 (1)
February 2007 (3)
January 2007 (4)
November 2006 (7)
October 2006 (7)
September 2006 (18)
August 2006 (14)
June 2006 (3)
May 2006 (8)
April 2006 (4)
March 2006 (38)
February 2006 (30)
January 2006 (2)
December 2005 (3)
November 2005 (28)
May 2005 (1)
April 2005 (5)
March 2005 (1)
November 2004 (1)
August 2004 (11)
July 2004 (1)
Failed to render control: An error occurred during a call to extension function 'createMonthUrl'. See InnerException for a complete description of the error.

Links

Tag Cloud

Ajax, Apple, DotNetNuke, Enterprise Content Management, Error Resolution, Gadgets, General, Governance, Microsoft .Net Development, Mobile, SharePoint, Sharepoint Business Forms, Sharepoint Business Intelligence, Sharepoint Collaboration, SharePoint Development, Sharepoint Enterprise Content Management, Sharepoint Enterprise Search, Sharepoint Portal, US Migration, Web 2.0, Workflow
Aug 302007

Sharepoint Team Development & Continuous Integration

Coming from a .Net development background I am used to and promote the Continuous Integration paradigm. The benefits are just worth the intial effort, especially so in team development projects.
There are lots of benefits but the main one is the encourage users to develop solutions that work more than just "on their machine", so that when the build server builds the solution and deploys it to an preview environment we know it's all documented and there isn't any manual tweaks or hidden steps. You can go overboard on how far you take this automation and how far you go across automating these builds to clean fresh environments, rather than just redeploying but that's another story.
 
Ari has made some great comments on Mark Jones technical article on developing and engineering processes.
 
At the bootcamp with Clayton James the other week I highlighted the concern of the seperation of development work being done in Sharepoint Designer (e.g. editing master pages) and the versioning being held within Sharepoint versioning AND the work being done in Visual Studio for producing Site Templates, Web Parts, Event Listeners etc. and these being deployed using Features and being versioned inside SourceSafe/Team Foundation Server.
Sezai has gone to the scary point of pulling all master pages and changes made in Sharepoint Designer into Feature deployment and scripting absolutely everything so you can just delete a Site Collection and recreate everything from a script. This has some huge overhead and some serious headaches in XML editing for various files required! At this stage, short of comparing Site Collections that everyone is working on and scripting the differences I don't see a way around this step.
 
Sooner or later you will become unstuck and a setting will get omitted...or it'll become a real pain to keep creating new environments for developers and in the long run it's better to get these things setup at the start and build from these.
 
I'm predicting someone will write a tool pretty soon that will just point at a Site Collection and do all this scripting automatically. Until that point, typing in XML manually could be the only true answer.
Published: 8/30/2007  5:05 PM | 0  Comments | 0  Links to this post

Apr 232007

Naming standards

You can never have enough naming standards guides. I've been working on a project for the last nine months with about 15 other developers. We're coding in C# in VS2005 and the standards that were provided covered camel casing, pascal casing etc. But one thing that really bugs me is the use of Manager, Editor, Factory so randomly throughout. Also methods called CreateBlah(), InsertBlah() and AddBlah(). Just makes things hard to find quickly when searching for  the method to actually insert something to the database in a class! </rant>

 I guess next time I'll mention these things up front, but it just helps with consistency and keeps things tidy! Nazi that I am.
 

Published: 4/23/2007  12:00 AM | 0  Comments | 0  Links to this post

Feb 262007

ComboBox SelectedValue()

<NoteToSelf>

 
I had some issues with SelectedValue() on a WinForms ComboBox when adding values dynamically to it and used this:

public class ComboValues
{
        private string _key;

        private string _value;

        public string Value
        {
            get { return _value; }
            set { _value = value; }
        }     

        public string Key
        {
            get { return _key; }
            set { _key = value; }
        }

        public ComboValues(string key, string value)
        {
            this._key = key;
            this._value = value;
        }
    }

 

IList<ComboValues> numbers = new List<ComboValues>();
numbers.Add(new ComboValues("", ""));
numbers.Add(new ComboValues("1", "One"));
numbers.Add(new ComboValues("2", "Two"));
numbers.Add(new ComboValues("3", "Three"));
cmbCaseType.DataSource = numbers;
cmbCaseType.DisplayMember = "Value";
cmbCaseType.ValueMember = "Key";

 

if (cboFileStatus.SelectedValue != null)
    fileStatus = ((ComboValues)(this.cboFileStatus.SelectedItem)).Key;

 

Published: 2/26/2007  12:00 AM | 0  Comments | 0  Links to this post

Feb 152007

JoinView for DataTables

We've been doing a lot of work with DataSets recently on this project and have had some issues on standards for creating new DataTables and TableAdapters. We have tried to enforce having DataTables with TableAdapters that directly reflect the base tables in a DataSet so that you can use the default Insert, Update, Delete, Select methods provided.

Complex Procedures

One problem occurs when you have specific database functions that process specific updates where you want to update a subset of data, not necessarily just from one underlying table. The first option is to select it using TableAdapters and then modifying the data in the DataTable and then calling the Update method on it.

The second option is to pass the criteria as parameters to a Stored Procedure or create a custom query method off the TableAdapter. Things start to get messy when you attach methods/procedures off of a TableAdapter that are related to the underlying Table that the DataTable represents, but is also related to other tables that may not even be in the DataSet. Mistakes start to happen where people look in different places for these methods and duplication occurs. 

Views

Another problem occurs when you want to display a view of data, up until now we have been creating new DataTables with the main query for columns being the view required. A naming standard is useful to indicate this is a view and not a underlying table and this prevents people adding methods to the DataTable that are doing inserts, deletes etc. which obviously should not be done on a view and only selects. This does lead to confusion and also duplicate DataTables for various tasks.

This problem also means that if new columns are added to this view and Inserts are attached to it the Insert methods will have more parameters and the whole solution will need modifying! 

The JoinView class allows you to take two DataTables and join them in a view in a very similar way to what you would do in a view at the SQL level. Issues occur on where these joins should be created. If they are put in the Broker level (between the client app and the data layer) it gives flexibility of what columns are needed and prevents the Data Layer becoming too complexed with all these different methods for different views required by the Client application. The Data Layer then is still just a representation of the underlying Tables in the database. It will mean that you have to call a few methods in the Data Layer to get all the tables required, but the Broker layer could keep cached versions of particular reference data tables that are frequently joined to.

Published: 2/15/2007  12:00 AM | 0  Comments | 0  Links to this post

Feb 122007

Strongly Typed datasets command timeout

I have been doing a lot of work recently with Strongly typed datasets and table adapters. We have found that the standard 40 seconds for some methods just wasn't enough...mainly due to big batch processes that call in large amounts of data in a view from various tables. I found a great article which has helped us out on this issue.

It demonstrates how extensible the standard datasets are and I'm sure there are plenty of other neat little extras that could help over time. 

Published: 2/12/2007  12:00 AM | 0  Comments | 0  Links to this post

Jan 182007

Generic Lists

I'm sure this is an obvious one, but this is a nice use of the new List with Generics:

            List<DirectDebitsRequestPayment> payments = new List<DirectDebitsRequestPayment>();

            DirectDebitsRequestPayment payment = new DirectDebitsRequestPayment();
            payment.Amount = new decimal();
            payment.FromAccountName = string.Empty; 


            payments.Add(payment);

            request.Payment = payments.ToArray();

instead of sticking with Arrays using:

 
            DirectDebitsRequestPayment[] payments = new DirectDebitsRequestPayment[1];

            DirectDebitsRequestPayment payment = new DirectDebitsRequestPayment();
            payment.Amount = new decimal();
            payment.FromAccountName = string.Empty;
            payments[0] = payment;

            request.Payment = payments;

etc. when you want to add more than one.

 

Published: 1/18/2007  12:00 AM | 0  Comments | 0  Links to this post

Jan 162007

Asynchronous SQL stored procedure command execution in .NET 2.0

I was looking for a way to call a stored procedure asynchronously and Keyvan Nayyeri's article which does just that. This can come in handy where you do not want to increase the timeout of a stored procedure but have some serious processing going on in the database. I'm currently doing a lot of work on batch processes which are triggered when messages are dropped on queues and this should suit me just fine!
Published: 1/16/2007  12:00 AM | 0  Comments | 0  Links to this post

Nov 262006

VS2005: Rebuild selected project

You can add your own custom shortcut to build only the current project (and its dependencies). Go to Tools | Options and under Environment, click Keyboard. Type Build.RebuildSelection in the ‘Show commands containing:’ text box. Then type in your desired shortcut in the ‘Press shortcut keys:’ text box (mine was CTRL+B, CTRL+P). Finally, click the Assign button. Apparently the C# keyboard mapping template has this shortcut baked in, but I don’t know what else will change if I move to that.

There's lots of other actions there also.     

Published: 11/26/2006  12:00 AM | 0  Comments | 0  Links to this post

Nov 212006

SQL Temp tables vs. Variable tables

Cursors are the bane of performance life for me at the moment! I've been looking at rewriting some stored procedures with temp tables and found this article which clarifys things for me a bit more between variable tables and temp tables.
Published: 11/21/2006  12:00 AM | 0  Comments | 0  Links to this post

Nov 072006

Dependency Injection

Big talk around this area which I have recently experienced first hand on the project I am on...this article has a great explanation of it. Most definately the way to develop code.
Published: 11/7/2006  12:00 AM | 0  Comments | 0  Links to this post

 Next >>