Thursday, October 29, 2009

Site Under Maintenance with ASP.Net 2.0

If you have worked with deploying websites onto production/test environments, you might have wanted to show a 'Site Under Maintenance' or a similar message to all those who tries to access the website. To achieve this, people used to resort to all kinds of  setups ranging from HttpModules to setting up a html page as default page of the application.

Now in Asp.Net 2.0 onwards we have a simple way of acheiving this. Just put a file NAMED app_offline.htm in the root folder of the application and : voilĂ !! all new requests will be redirected to that html page. 

To revert back, just rename the file to some other name. Neat & clean. 


[Edit 04 Aug 2010 ] This might not be good idea as ASP.Net responds with a 404 http code. Ideally it should have been 200.

Monday, October 12, 2009

Simple way to check time consumed by a piece of code using stopwatch class

TimeSpan ts;
string elapsedTime;
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start();
//DO SOME LENGTHY OPERATION
ts = stopWatch.Elapsed;
elapsedTime =
                    String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                    ts.Hours, ts.Minutes, ts.Seconds,
                    ts.Milliseconds / 10);
 stopWatch.Reset();
 stopWatch.Stop();

Use XML with SQL

Declare @doc xml

set @doc ='


'
Declare @handle int

Exec sp_xml_prepareDocument @handle output, @doc

Select ImageName, date From openXML(@handle, N'/r/i') with (ImageName varchar(20) 'n', date datetime 'm')
Select ImageName,date From openxml(@handle,'/r/t') with (ImageName varchar(20) 'n', date datetime 'm')

Exec sp_xml_removeDocument @handle

Thursday, July 23, 2009

Executing a stored procedure with output parameter doesnt return any value.

When you use a DataReader object to read data from SqlServer, the parameter passed in as output parameter doesnot get assigned even after excuting the reader.

Solution:- Close the DataReader and your value will get returned.

Reason:- The output parameter is returned at the end of the data stream when you use a DataRader.

Reference:- http://support.microsoft.com/kb/308621

Wednesday, April 8, 2009

Sql Server 2005 Linked Server Scripting issue

I generated the 'CREATE' script of a linked server in my DB and got the following script

EXEC master.dbo.sp_addlinkedserver @server = N'MYSERVERNAME', @provider=N'SQLNCLI', @datasrc=N'MYINSTANCENAME, @catalog=N'SOMENAME'

I dropped the same and tried to add it with the above script and it gave me the error

Msg 15429, Level 16, State 1, Procedure sp_addlinkedserver, Line 42
'(null)' is an invalid product name.

Solution :- Add the product name also in the sp parameters.

An sp_helptext on the sp showed this:-

create procedure sys.sp_addlinkedserver
@server sysname, -- server name
@srvproduct nvarchar(128) = NULL, -- product name (dflt to ss)
@provider nvarchar(128) = NULL, -- oledb provider name
@datasrc nvarchar(4000) = NULL, -- oledb datasource property
@location nvarchar(4000) = NULL, -- oledb location property
@provstr nvarchar(4000) = NULL, -- oledb provider-string property
@catalog sysname = NULL -- oledb catalog property
as


etc etc ...

The Script Linked Server as Create To command somehow missed the @srvproduct parameter.

So the modified sql statement will be

EXEC master.dbo.sp_addlinkedserver @server=N'MYSERVERNAME', @srvproduct=N'MSSQLSERVER', @provider=N'SQLNCLI', @datasrc=N'MYINSTANCENAME, @catalog=N'SOMENAME'

Wednesday, March 4, 2009

Regex for matching relative URLs

This Regex will match the following Relative URLs
REGEX
-----
^(/[a-zA-Z0-9]+)+(\.[a-zA-Z]{2,4})((\?\w*=?\w*)(\&\w+=\w+)*)?$

URLs
----
/folder1/page.ax
/folder1/page.php
/folder1/folder2/page.aspx
/folder1/page.aspx?qstring1=value1 (likewise n number of query strings)

Will not match

/folder1?/page.aspx
/folder1/page.aspx?=value1
/folder1/page.aspx?qstring1=value1?qstring2=value2


^(/[a-zA-Z0-9]+)+(\.[a-zA-Z]{2,4})((\?\w*=?\w*)(\&\w+=\w+)*)?$

Friday, February 27, 2009

LINQ ERROR

I was working with a LINQ sample and stumbled upon the following error.
"The non-generic type 'System.Collections.IEnumerable' cannot be used with type arguments"

XML file I was using :-


Code used :-


//The application is a ASP.net page
XDocument xDoc = XDocument.Load(HttpContext.Current.Server.MapPath("Persons.xml"));

IEnumerable queryNew = from e in xDoc.Descendants("Person")

select new Person{
FirstName = e.Element("FirstName").Value,
LastName = e.Element("LastName").Value,
Salary = Convert.ToInt32(e.Element("Salary").Value)
};


Solution :- IEnumerable is present in both System.Collections.Generic and System.Collections name spaces. The query returns a generic collection. So in this case We should use System.Collections.Generic. So when I provided a "using System.Collections.Generic;" on top of the page, it did the trick for me.