Tuesday, 23 February 2010

Programmatically log in a user, or emulate a user logging in

If you need to log a user on programmatically, that is with no input of password, you can do the following just using their user name:
FormsAuthentication.SetAuthCookie(UserName, True)
Response.Redirect("/somewhere_suitable")
I recently used this to allow a system administrator to login to any user's account as that user by clicking on a button from a list of users. This must be a pretty common thing to do so here's the whole bit of code for the button event:
Protected Sub UsersList_ButtonPress(ByVal sender As Object, ByVal e As ListViewCommandEventArgs) Handles UsersList.ItemCommand

  If e.CommandName = "Login" Then

      Dim userID As Guid = New Guid(e.CommandArgument.ToString)

      Dim user As MembershipUser = Membership.GetUser(userID)
      FormsAuthentication.SetAuthCookie(user.UserName, True)

      Response.Redirect("/somewhere_suitable")

  End If
End Sub
And here's the designer code for the button in the itemtemplate of the listview:
<td>
 <asp:Button ID="LoginButton" runat="server" CommandArgument='<%# Eval("UserID")%>' CommandName="Login" Text="Login" OnClientClick="return confirm('Are you sure you want to login as this user?');" />
</td>
You could of course just send the username as an argument directly from the list, but I didn't do this as the userID just suited some other stuff I've got going on there too!

Thursday, 18 February 2010

SQL convert datetime to string

I found this posted on another site. It's Really Useful, so I though I'd replicate it here for next time.
0Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 0)
102/22/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 1)
206.02.22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 2)
322/02/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 3)
422.02.06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 4)
522-02-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 5)
622 Feb 06CONVERT(CHAR(9), CURRENT_TIMESTAMP, 6)
7Feb 22, 06CONVERT(CHAR(10), CURRENT_TIMESTAMP, 7)
816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 8)
9Feb 22 2006 4:26:08:020PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 9)
1002-22-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 10)
1106/02/22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 11)
12060222CONVERT(CHAR(6), CURRENT_TIMESTAMP, 12)
1322 Feb 2006 16:26:08:020CONVERT(CHAR(24), CURRENT_TIMESTAMP, 13)
1416:26:08:037CONVERT(CHAR(12), CURRENT_TIMESTAMP, 14)
202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 20)
212006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 21)
2202/22/06 4:26:08 PMCONVERT(CHAR(20), CURRENT_TIMESTAMP, 22)
232006-02-22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 23)
2416:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 24)
252006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 25)
100Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 100)
10102/22/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 101)
1022006.02.22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102)
10322/02/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 103)
10422.02.2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 104)
10522-02-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 105)
10622 Feb 2006CONVERT(CHAR(11), CURRENT_TIMESTAMP, 106)
107Feb 22, 2006CONVERT(CHAR(12), CURRENT_TIMESTAMP, 107)
10816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 108)
109Feb 22 2006 4:26:08:067PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 109)
11002-22-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 110)
1112006/02/22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 111)
11220060222CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)
11322 Feb 2006 16:26:08:067CONVERT(CHAR(24), CURRENT_TIMESTAMP, 113)
11416:26:08:067CONVERT(CHAR(12), CURRENT_TIMESTAMP, 114)
1202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 120)
1212006-02-22 16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 121)
1262006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 126)
1272006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 127)
13024 ???? 1427 4:26:08:080PM CONVERT(CHAR(32), CURRENT_TIMESTAMP, 130)
13124/01/1427 4:26:08:080PMCONVERT(CHAR(25), CURRENT_TIMESTAMP, 131)

Friday, 12 February 2010

Programmatically add a stylesheet reference

HtmlLink newStyleSheet = new HtmlLink();       
  newStyleSheet.Href = "css/your.css";               
  newStyleSheet.Attributes.Add("type", "text/css");
  newStyleSheet.Attributes.Add("rel", "stylesheet");
  Page.Header.Controls.Add(newStyleSheet); 

Wednesday, 10 February 2010

Large .suo file causing Visual Studio to hang

Just when I needed it least Visual Studio decided to hang. I restarted it and sat for 10 minutes while it opened my project again. So I restarted the machine, and it did it again.

After a bit of investigation I found that my .suo file was 8.5MB (which is tiny compared to some reports), and renaming this (the safe equivalent of deleting) solved my problems. I lost a few preferences (I haven't fully established what yet, but I run pretty vanilla so there shouldn't be much) but it all works WAY faster than I've become accustomed to.

Perhaps there's a more official way of cleansing the .suo?

Tuesday, 9 February 2010

Installing ELMAH to log unhandled exceptions in asp.net application

ELMAH logs all your uncaptured errors. It's remarkably easy to implement - I followed the simple instructions on these posts here and here. The latter link has more detail but has a couple of typos in the web.config additions which will become obvious if you use it.

Having functionality like this at your fingertips is very reassuring!

Tuesday, 2 February 2010

Using one stored procedure in another

Today I had to call a SPROC from another SPROC by sending it a parameter, storing the results in a temporary table, and then looping through the temp table. After some googling and tweaking I came up with this which seems to work a treat. I'm no SQL expert though!

--create temp table
 create table #temp (
    idx int identity(1,1),
    field1 int,
    field2 int)

 -- put data into temp table using other SP
 insert into #temp (field1, field2)
 exec myOtherSproc @paramaterToSend
 
 -- loop through temp table
 declare @counter int

 set @counter = 1

 while @counter < (select max(idx) from #temp)
  begin
   --do whatever you want here
   set @counter = @counter + 1
  end
 
 DROP TABLE #temp