<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-13221527</id><updated>2011-12-01T06:52:08.137-05:00</updated><category term='ASP.NET 4.0'/><category term='with (nolock)'/><category term='IIS 7.0'/><category term='ASP.NET 2.0'/><category term='XSRF'/><category term='MVC'/><category term='javascript'/><category term='Rackspace Problems'/><category term='CLR Stored Procedure'/><category term='production'/><category term='SQL Server'/><category term='hacker attack'/><category term='Web site security'/><category term='Permissions'/><category term='VB.NET'/><category term='Encryption'/><category term='Parsing'/><category term='Web Forms'/><category term='scrollable table'/><category term='Visual Studio .NET'/><category term='ASP.NET'/><category term='Unit Tests'/><category term='Problems with RackSpace'/><category term='Hosting'/><category term='nolock'/><category term='IIS 6.0'/><category term='Remote Desktop Connection'/><category term='CSRF'/><category term='SqlDependency'/><category term='Web site'/><category term='intellisense'/><category term='.NET 2.0'/><category term='web.config'/><category term='Windows 7'/><category term='Full-Text search'/><category term='Boolean Search'/><category term='hack'/><category term='Error handling'/><category term='Resume'/><category term='Google Maps API'/><category term='SQL Server 2005'/><category term='migration'/><category term='XML'/><category term='RegEx'/><category term='Web parts'/><category term='C#'/><category term='Windows Server'/><category term='Unicode'/><category term='Google Analytics'/><category term='HttpModule'/><category term='Select Hints'/><category term='WCF'/><category term='Collation'/><category term='Sequential GUID'/><category term='Google Desktop'/><category term='SqlCacheDependency'/><category term='software development business'/><category term='HTML'/><category term='RDC'/><category term='SQL Hints'/><category term='float double single precision'/><category term='XSS'/><category term='ASP.NET 3.5'/><category term='.NET'/><category term='Serialization'/><title type='text'>Development tips</title><subtitle type='html'>Development tips by Dennis Gorelik</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>98</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13221527.post-3549980688474987673</id><published>2011-05-19T20:07:00.007-04:00</published><updated>2011-05-19T20:24:44.998-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Permissions'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Role-based permissions vs. Enterprise permissions</title><content type='html'>&lt;h2&gt;The problem&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://www.postjobfree.com"&gt;My application&lt;/a&gt; has multiple features. For example:&lt;br /&gt;1) &lt;a href="http://www.postjobfree.com/resume/mqnlee/postjobfree-net-developer-oracle-c-jacksonville-fl"&gt;View resume&lt;/a&gt;.&lt;br /&gt;2) Sending message to resume poster.&lt;br /&gt;3) Viewing contact information on a resume.&lt;br /&gt;My application has multiple users. For example:&lt;br /&gt;1) Anonymous&lt;br /&gt;2) Fred Lurker&lt;br /&gt;3) Paul Generous&lt;br /&gt;I want to allow some users to have access to one set of features and other users to have access to another set of features.&lt;br /&gt;For example I want:&lt;br /&gt;1) Anonymous users to have ability to view resume&lt;br /&gt;2) Fred Lurker to be able to view resume and to send messages to resume poster.&lt;br /&gt;3) Paul Generous to be able to see resume, send messages, and be able to see contact information on the resume.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Direct Permissions Mapping&lt;/h3&gt;&lt;br /&gt;The most direct approach would be to make every feature check a user who tries to access it. For example:&lt;pre&gt;If (User is “Fred Lurker” or User is “Paul Generous”)&lt;br /&gt;{&lt;br /&gt;    Allow user to send a message.&lt;br /&gt;}&lt;br /&gt;If (User is “Paul Generous”)&lt;br /&gt;{&lt;br /&gt;    Allow user to view resume contact information.&lt;br /&gt;}&lt;/pre&gt;That’s very direct and simple, but does not scale at all. My application has thousands of users, new users are added to the system, old users are deleted, and existing users are getting access more or less features over time. In order to deal with all that code would have to constantly change which is not feasible.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Role-based Permissions&lt;/h2&gt;&lt;br /&gt;Better approach would be to introduce roles. For example:&lt;br /&gt;1) “Recruiters” role that has access to “Sending message to resume poster” feature.&lt;br /&gt;2) “PayingUsers” role that has access to “Viewing contact information on a resume” feature.&lt;br /&gt;Then:&lt;br /&gt;1) Add “Fred Lurker” user to “Recruiters” role.&lt;br /&gt;2) Add “Paul Generous” user to “PayingUsers” role.&lt;br /&gt;With such approach software developers would define what roles have access to what features. They would define it in code (e.g. in C#, C++ or Java).&lt;br /&gt;Application administrator would define roles that users have access to.&lt;br /&gt;When Paul Generous pays his membership fee, administrator would simply add Paul to “PayingUsers” role. Administrator does not need to explicitly define what features Paul would have access to, because it’s already defined by developers in application code for “PayingUsers” role.&lt;br /&gt;To summarize:&lt;br /&gt;1) Roles introduce one intermediate step in mapping users to features.&lt;br /&gt;2) Developers map roles to features&lt;br /&gt;3) Administrators map users to roles.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Enterprise Permissions&lt;/h2&gt;&lt;br /&gt;What if I want my application to be more flexible and allow administrator to map groups of users to features without asking developers to modify code?&lt;br /&gt;That could be setup like this:&lt;br /&gt;1) My enterprise system would still have Users.&lt;br /&gt;2) I’d add Groups, so administrator would be able to add users to groups.&lt;br /&gt;3) Developer would add Privileges, so administrator would be able to map groups to privileges.&lt;br /&gt;4) Developer would code features in such a way that one feature would be mapped to one privileges in my code:&lt;pre&gt;If (user.HasPrivilege(“ViewResume”))&lt;br /&gt;{&lt;br /&gt;    ShowResume()&lt;br /&gt;}&lt;/pre&gt;5) Administrator would create and delete Groups and map these groups.&lt;br /&gt;Enterprise Permissions system gives lots of flexibility to application administrators. It’s very appealing for IT department management to be able to tweak users’ permissions without need to wait for developers releasing new version of the app. That’s why such enterprise permissions systems are so popular.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Disadvantages of Enterprise Permissions&lt;/h2&gt;&lt;br /&gt;Unfortunately in real life flexible enterprise permissions system causes nothing but pain.&lt;br /&gt;Here’s why:&lt;br /&gt;&lt;b&gt;1) With any flexibility comes added complexity.&lt;/b&gt;&lt;br /&gt;Having “Users-Groups-Privileges-Features” chain instead of shorter “Users-Roles-Features” chain  – significantly complicates the number of possible combinations of how permissions to access features can be granted to end users.&lt;br /&gt;That means permissions could be granted to a user in several different ways through multiple groups. So it’s hard to revoke user’s permissions if necessary simply because it’s hard to figure out what permissions does the user really have.&lt;br /&gt;&lt;b&gt;2) It’s very hard for administrators to grasp what group should map to what privileges.&lt;/b&gt;&lt;br /&gt;Administrator focuses on the end user. Administrator knows what groups user should belong to. But administrators have only vague idea about what privilege allows user to do in the application. &lt;br /&gt;End result: developer is setting up the permissions anyway. &lt;br /&gt;&lt;b&gt;3) Enterprise permissions are much harder for developers.&lt;/b&gt;&lt;br /&gt;Developers know what features should be available to what role (see Role-based Permissions above). Developers can map features to roles in their code.&lt;br /&gt;Can developers map features to privileges and then map privileges to groups?&lt;br /&gt;Yes, they can. But it’s harder. It’s more work. It requires both coding in C#/Java and scripting in SQL. Or even worse approach – mapping groups to privileges in the UI (error-prone deployment nightmare).&lt;br /&gt;Administrators can setup new groups that developers do not know about. Administrators can delete groups that developers originally created. All that can quickly bring system to its knees. That’s why in the end administrators are afraid to create and delete groups and that defeats original purpose of enterprise system to give more flexibility to application administrators.&lt;br /&gt;&lt;b&gt;4) It’s hard to trace changes in Enterprise Permissions.&lt;/b&gt;&lt;br /&gt;In role based system roles-features mapping is coded in C#/Java and is stored under source control. Code changes history helps to find out when and why this role was mapped to that feature.&lt;br /&gt;Not so with mapping between groups and privileges. Such mapping is stored in database and is wiped out without trace every time when administrator changes the mapping.&lt;br /&gt;There are no comments on why groups-features mapping was done the way it was done. There is simply no place to put such comment (unlike roles-features mapping that can be commented in C#/Java code).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;br /&gt;The most robust way of handing permissions in most of applications is with role-based permissions (Users-Roles-Features).&lt;br /&gt;In spite of “flexibility” appeal of enterprise-based permissions (Users-Groups-Privileges-Features), such system has serious disadvantages and virtually no real advantages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-3549980688474987673?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/3549980688474987673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=3549980688474987673' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/3549980688474987673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/3549980688474987673'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2011/05/role-based-permissions-vs-enterprise.html' title='Role-based permissions vs. Enterprise permissions'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6966515253965822240</id><published>2011-01-25T14:40:00.003-05:00</published><updated>2011-01-25T14:49:57.684-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='scrollable table'/><title type='text'>Fixed headers scrollable content in HTML table</title><content type='html'>It's a tough problem to create HTML table in such a way that supports all of the following requirements simultaneously:&lt;br /&gt;1) Has scrollable table body with content.&lt;br /&gt;2) Has fixed table column headers.&lt;br /&gt;3) Has header columns automatically aligned with body columns.&lt;br /&gt;&lt;br /&gt;I looked through multiple solutions on the internet, and the best option so far is &lt;a href="http://farinspace.com/jquery-scrollable-table-plugin/"&gt;jquery.tablescroll.js plugin by Dimas Begunoff&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It allowed me:&lt;br /&gt;1) Not to specify columns width explicitly.&lt;br /&gt;2) Have multi-row headers with some cells spanning across several columns. The only trick is that first header row should have the same number of cells as body row.&lt;br /&gt;&lt;br /&gt;While it's the best solution I could find -- it's still not perfect.&lt;br /&gt;If table is pretty busy, and table content pushes column borders pretty hard -- header columns do not align perfectly with body columns.&lt;br /&gt;&lt;br /&gt;If anybody knows better solution -- please let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6966515253965822240?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6966515253965822240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6966515253965822240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6966515253965822240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6966515253965822240'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2011/01/fixed-headers-scrollable-content-in.html' title='Fixed headers scrollable content in HTML table'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-7393350403084923430</id><published>2010-10-18T00:18:00.003-04:00</published><updated>2010-10-18T00:59:29.312-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Full-Text search'/><category scheme='http://www.blogger.com/atom/ns#' term='Boolean Search'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Parsing'/><title type='text'>Boolean Search to SQL CONTAINS</title><content type='html'>Today I rolled out &lt;a href="http://postjobfree.blogspot.com/2010/10/boolean-search.html"&gt;Boolean Search&lt;/a&gt; feature for &lt;a href="http://www.postjobfree.com"&gt;PostJobFree&lt;/a&gt;.&lt;br /&gt;PostJobFree uses SQL Server backend, so it seems obvious to use Full-Text search that SQL Server have to process boolean search queries from users.&lt;br /&gt;Unfortunately it's not as easy:&lt;br /&gt;Full-Text search CONTAINS query is pretty strict, and crashes the whole SELECT statement if CONTAINS clause syntax is not correct. For example: &lt;blockquote&gt;asp sql&lt;/blockquote&gt; query would crash SQL Server's SELECT command if the query would be passed into CONTAINS clause as-is. Correct syntax would be: &lt;blockquote&gt;asp AND sql&lt;/blockquote&gt; So I need to write a parser that parses user's search input into boolean search query object hierarchy and then renders CONTAINS query for SQL Server from that hierarchy.&lt;br /&gt;Here's how I designed it.&lt;br /&gt;Search object hierarchy consist of the following parts:&lt;br /&gt;1) Word. It consists only of letters, digits, dots, and dashes. Dashes can be only be inside the word, between letters/digits. Dash outside the word is considered as negation.&lt;br /&gt;2) Phrase. Phrase can have any chars wrapped in quotes.&lt;br /&gt;3) OrList. OrList consists from two or more elements, separated by "or". For example:&lt;blockquote&gt;("sql server" or oracle or DB2)&lt;/blockquote&gt;4) AndList. AndList consists from two or more elements, separated by "and" or "and not" operators. For example: &lt;blockquote&gt;sql and asp and not oracle&lt;/blockquote&gt;This query would be rendered into AndList that consists of 3 elements.&lt;br /&gt;Both OrList and AndList could consist not only from atomic pieces (such as Word and Phrase), but also from OrList and AndList subelements.&lt;br /&gt;&lt;br /&gt;Parsing logic:&lt;br /&gt;1) Split input query by quote char ('"'). Basically even elements in this split list are phrases. Everything else does not contain phrases.&lt;br /&gt;2) After phrases are extracted, partially processed list consists of strings and Phrase objects.&lt;br /&gt;3) Next step is to extract parenthesis that are not wrapped by other parentheses. Consider example:&lt;blockquote&gt;(one and (two or three)) or four&lt;/blockquote&gt; "one and (two or three)" would be extracted from original query, and then recursively processed again.&lt;br /&gt;The recursion ends when there are no more parentheses.&lt;br /&gt;4) When recursion is so deep, that there are no parentheses left in a subquery, then that subquery is split by "or" word (or "|" char).&lt;br /&gt;5) Last major step is to split remaining subquery into AndList. The trick here would be to appropriately assign negation if subquery was preceded by negation orerator "not", "!", or leading dash ("-").&lt;br /&gt;&lt;br /&gt;After query is fully parsed, it's time to get final CONTAINS query for SQL Server.&lt;br /&gt;It can be accomplished by overriding ToString() method for Word, Phrase, OrList, and AndList:&lt;br /&gt;1) Word just converting containing text to UpperCase.&lt;br /&gt;2) Phrase's ToString() overload converts InnerText to UpperCase and wraps it by quotes.&lt;br /&gt;3) AndList joins all elements into single string using "&amp;" separator or "&amp;!" separator if one of AndList's subqueries was negated.&lt;br /&gt;4) OrList joins all elements into single string using "|" separator. Then it wraps the result by parenthesis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-7393350403084923430?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/7393350403084923430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=7393350403084923430' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/7393350403084923430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/7393350403084923430'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/10/boolean-search-to-sql-contains.html' title='Boolean Search to SQL CONTAINS'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-4735105363363029850</id><published>2010-09-23T10:00:00.002-04:00</published><updated>2010-09-23T10:06:53.011-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>How to set executionTimeout for individual requests?</title><content type='html'>You probably know that you can change http request processing timeout for specific page like this:&lt;br /&gt;&lt;pre&gt; &amp;lt;location path="MyLongRunningHttpHandler.ashx"&amp;gt;&lt;br /&gt;  &amp;lt;system.web&amp;gt;&lt;br /&gt;   &amp;lt;httpRuntime executionTimeout="600" /&amp;gt;&lt;br /&gt;  &amp;lt;/system.web&amp;gt;&lt;br /&gt; &amp;lt;/location&amp;gt;&lt;/pre&gt;But what if you want to set it up for a control or just a function and do not have predefined list of pages to specify it in web.config?&lt;br /&gt;Of maybe you don't want to pollute web.config with junk like that?&lt;br /&gt;&lt;br /&gt;There should be some way to do it in C# code, right?&lt;br /&gt;Right.&lt;br /&gt;Here's how you do it:&lt;pre&gt;    HttpContext.Current.Server.ScriptTimeout = 600; // 10 minutes&lt;/pre&gt;If that's what you were looking for, you probably want to test it.&lt;br /&gt;I tried to test it too, and it turned out to be tricky.&lt;br /&gt;&lt;br /&gt;First I set web.config's timeout to 2 seconds:&lt;br /&gt;    &amp;lt;httpRuntime executionTimeout="2" /&amp;gt;&lt;br /&gt;&lt;br /&gt;Then I put 10 seconds delay to my ashx handler's code-behind:&lt;br /&gt;    System.Threading.Thread.Sleep(10000); // 10 seconds&lt;br /&gt;&lt;br /&gt;Then I commented this line:&lt;br /&gt;    // HttpContext.Current.Server.ScriptTimeout = 600; // 10 minutes&lt;br /&gt;&lt;br /&gt;and opened my ashx handler's url in browser.&lt;br /&gt;&lt;br /&gt;I expected it to crash with timeout error... but it did not happen.&lt;br /&gt;:-O&lt;br /&gt;Few experiments showed that executionTimeout works only if all of the following is true:&lt;br /&gt;1) Domain name is not localhost (to test timeout you should use "YourComputerName" instead of "localhost").&lt;br /&gt;2) Project is compiled in Release mode.&lt;br /&gt;3) &amp;lt;compilation debug="false"&amp;gt;&lt;br /&gt;If any of the above is not true then executionTimeout length is virtually unlimited.&lt;br /&gt;On top of that IIS typically times out later than executionTimeout limit asks it too.&lt;br /&gt;When I set executionTimeout=2 and made my page request to sleep for 10 seconds, I was getting "Request timed out." response only in ~40% of requests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-4735105363363029850?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/4735105363363029850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=4735105363363029850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4735105363363029850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4735105363363029850'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/09/how-to-set-executiontimeout-for.html' title='How to set executionTimeout for individual requests?'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-8013628950995973066</id><published>2010-09-13T15:34:00.005-04:00</published><updated>2010-09-14T08:08:21.552-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Sneaky MaxItemsInObjectGraph attribute in WCF</title><content type='html'>I spent almost couple of days trying to figure out what caused WCF service to crash (in a weird way) when it was tried to return large resultset.&lt;br /&gt;Initially the problem expressed itself on the WCF client side. When number of records in returning results was close to 5000 – WCF client generated &lt;br /&gt;Meaningless "An existing connection was forcibly closed by the remote host." exception.&lt;br /&gt;Google search for '"An existing connection was forcibly closed by the remote host." WCF size' brought up&lt;br /&gt;&lt;a href="http://forums.asp.net/p/1517757/4075511.aspx"&gt;WCF issues sending large data&lt;/a&gt; forum discussion.&lt;br /&gt;The right answer (maxItemsInObjectGraph) was mentioned there, but it was buried under pile of misleading suggestions.&lt;br /&gt;&lt;br /&gt;One step toward the solution was to use soapUI utility to make the requests (instead of calling WCF service from another .NET client).&lt;br /&gt;That helped to determine that the problem is on the WCF server side -- soapUI simply couldn't get any response (when number of returning dataset rows was ~5000+).&lt;br /&gt;&lt;br /&gt;What really helped to find the final answer -– was enabling WCF diagnostic by adding this to web.config on server side:&lt;pre&gt;&amp;lt;system.diagnostics&amp;gt;&lt;br /&gt;    &amp;lt;sources&amp;gt;&lt;br /&gt;      &amp;lt;source name="System.ServiceModel" switchValue="Warning, ActivityTracing"&lt;br /&gt;        propagateActivity="true"&amp;gt;&lt;br /&gt;        &amp;lt;listeners&amp;gt;&lt;br /&gt;          &amp;lt;add type="System.Diagnostics.DefaultTraceListener" name="Default"&amp;gt;&lt;br /&gt;            &amp;lt;filter type="" /&amp;gt;&lt;br /&gt;          &amp;lt;/add&amp;gt;&lt;br /&gt;          &amp;lt;add name="ServiceModelTraceListener"&amp;gt;&lt;br /&gt;            &amp;lt;filter type="" /&amp;gt;&lt;br /&gt;          &amp;lt;/add&amp;gt;&lt;br /&gt;        &amp;lt;/listeners&amp;gt;&lt;br /&gt;      &amp;lt;/source&amp;gt;&lt;br /&gt;    &amp;lt;/sources&amp;gt;&lt;br /&gt;    &amp;lt;sharedListeners&amp;gt;&lt;br /&gt;      &amp;lt;add initializeData="app_tracelog.svclog"&lt;br /&gt;        type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, &lt;br /&gt;        Culture=neutral, PublicKeyToken=b77a5c561934e089"&lt;br /&gt;          name="ServiceModelTraceListener" traceOutputOptions="Timestamp"&amp;gt;&lt;br /&gt;        &amp;lt;filter type="" /&amp;gt;&lt;br /&gt;      &amp;lt;/add&amp;gt;&lt;br /&gt;    &amp;lt;/sharedListeners&amp;gt;&lt;br /&gt;  &amp;lt;/system.diagnostics&amp;gt;&lt;/pre&gt;Then app_tracelog.svclog revealed much more specific error message:&lt;br /&gt;---&lt;br /&gt;Maximum number of items that can be serialized or deserialized in an object graph is '65536'. Change the object graph or increase the MaxItemsInObjectGraph quota. '&lt;br /&gt;---&lt;br /&gt;Quick googling for "maxItemsInObjectGraph" brought me to &lt;a href="http://blog.hill-it.be/2007/08/22/maxitemsinobjectgraph-and-keeping-references-when-serializing-in-wcf-2/"&gt;MaxItemsInObjectGraph and keeping references when serializing in WCF&lt;/a&gt; blog post which recommended to add the following section to WCF server web.config:&lt;pre&gt;&amp;lt;behaviors&amp;gt;&lt;br /&gt;  &amp;lt;serviceBehaviors&amp;gt;&lt;br /&gt;    &amp;lt;behavior name="LargeServiceBehavior"&amp;gt;&lt;br /&gt;      &amp;lt;dataContractSerializer maxItemsInObjectGraph="100000"/&amp;gt;&lt;br /&gt;    &amp;lt;/behavior&amp;gt;&lt;br /&gt;  &amp;lt;/serviceBehaviors&amp;gt;&lt;br /&gt;&amp;lt;/behaviors&amp;gt;&lt;/pre&gt;and this section to WCF client web.config:&lt;pre&gt;&amp;lt;behaviors&amp;gt;&lt;br /&gt;  &amp;lt;endpointBehaviors&amp;gt;&lt;br /&gt;    &amp;lt;behavior name="LargeEndpointBehavior"&amp;gt;&lt;br /&gt;      &amp;lt;dataContractSerializer maxItemsInObjectGraph="100000"/&amp;gt;&lt;br /&gt;    &amp;lt;/behavior&amp;gt;&lt;br /&gt;  &amp;lt;/endpointBehaviors&amp;gt;&lt;br /&gt;&amp;lt;/behaviors&amp;gt;&lt;/pre&gt;That worked.&lt;br /&gt;I used VS.NET 2008 / .NET Framework 3.5, but I think that is applicable to .NET 4.0 too.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-8013628950995973066?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/8013628950995973066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=8013628950995973066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/8013628950995973066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/8013628950995973066'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/09/sneaky-maxitemsinobjectgraph-attribute.html' title='Sneaky MaxItemsInObjectGraph attribute in WCF'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-4531974666909917671</id><published>2010-09-09T10:36:00.001-04:00</published><updated>2010-09-09T10:37:40.797-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RDC'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Remote Desktop Connection'/><title type='text'>How to allow multiple users in RDC in Windows 7 64 bit</title><content type='html'>&lt;a href="http://www.missingremote.com/index.php?option=com_content&amp;task=view&amp;id=3692&amp;Itemid=232"&gt;Guide: How to Enable Concurrent Sessions in Windows 7 RTM&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-4531974666909917671?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/4531974666909917671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=4531974666909917671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4531974666909917671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4531974666909917671'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/09/how-to-allow-multiple-users-in-rdc-in.html' title='How to allow multiple users in RDC in Windows 7 64 bit'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6987156436255249452</id><published>2010-06-03T14:49:00.000-04:00</published><updated>2010-06-03T14:59:43.687-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>How to preserve data during processing HttpRequest in ASP.NET?</title><content type='html'>The answer to it is &lt;a href="http://www.mikeduncan.com/3-hot-uses-for-httpcontextcurrentitems-they-wont-tell-you-about/"&gt;HttpContext.Current.Items&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm planning to use HttpContext.Current.Items for preserving pointers to controls that would render final javascript on the pages.&lt;br /&gt;Or may be preserve javascript itself and then make these controls to retrieve the javascript from   HttpContext.Current.Items["BottomScriptBuilder"] and HttpContext.Current.Items["HeadScriptBuilder"]?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx"&gt;System.Web.HttpContext.Current.Items is actually pretty old thing in ASP.NET&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6987156436255249452?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6987156436255249452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6987156436255249452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6987156436255249452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6987156436255249452'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/06/how-to-preserve-data-during-processing.html' title='How to preserve data during processing HttpRequest in ASP.NET?'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-7448628752738628844</id><published>2010-05-16T17:27:00.001-04:00</published><updated>2010-05-16T17:42:43.272-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='HttpModule'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>How to include JavaScript tracking code into head control in asp.net</title><content type='html'>Google Analytics team recommends to include &lt;a href="http://code.google.com/apis/analytics/docs/tracking/asyncTracking.html"&gt;Asynchronous Google Analytics tracking javascript code&lt;/a&gt; right before closing &amp;lt;/head&amp;gt; tag.&lt;br /&gt;So, how to include that script into every page on your web site without modifying every page?&lt;br /&gt;&lt;br /&gt;I considered multiple solutions:&lt;br /&gt;&lt;br /&gt;1) Cut&amp;paste into every page (the worst).&lt;br /&gt;&lt;br /&gt;2) Create HeadScriptControl.cs server control and cut&amp;paste it into every page (slightly better, but still requires lots of cut&amp;paste).&lt;br /&gt;Here's an example of HeadScriptControl code:&lt;pre&gt;using System;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;public class HeadScriptControl : Control&lt;br /&gt;{&lt;br /&gt; private const string GoogleAnalyticsFirtsPartScript = @"&lt;br /&gt;&amp;lt;script type=""text/javascript""&amp;gt;&lt;br /&gt;var _gaq = _gaq || [];&lt;br /&gt;_gaq.push(['_setAccount', 'UA-XXXXXX-2']);&lt;br /&gt;_gaq.push(['_trackPageview']);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;";&lt;br /&gt; protected override void Render(HtmlTextWriter writer)&lt;br /&gt; {&lt;br /&gt;  writer.Write(GoogleAnalyticsFirtsPartScript);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3) Create PageWithHeadScript.cs, inherit it from Page control, inherit every page on your web site from PageWithHeadScript.cs and render HeadScriptControl in PageWithHeadScript.cs like this:&lt;pre&gt;public class PageWithHeadScript : Page&lt;br /&gt;{&lt;br /&gt; protected override void Render(HtmlTextWriter writer)&lt;br /&gt; {&lt;br /&gt;  this.Header.Controls.Add(new HeadScriptControl());&lt;br /&gt;  base.Render(writer);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;That approach requires even less cut&amp;paste, but still every page on your web site needs to be touched.&lt;br /&gt;&lt;br /&gt;4) Using HttpHandler.&lt;br /&gt;I think that's the best approach, because it's not necessary to modify pages at all.&lt;br /&gt;Here’s how I do it.&lt;br /&gt;&lt;br /&gt;4.1. Create HttpModule:&lt;pre&gt;public sealed class MyHttpModule : IHttpModule&lt;br /&gt;{&lt;br /&gt; void IHttpModule.Init(HttpApplication application)&lt;br /&gt; {&lt;br /&gt;  application.PreRequestHandlerExecute += new EventHandler(application_PreRequestHandlerExecute); &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; void application_PreRequestHandlerExecute(object sender, EventArgs e)&lt;br /&gt; {&lt;br /&gt;  RegisterPagePreRenderEventHandler();&lt;br /&gt; }&lt;br /&gt; private void RegisterPagePreRenderEventHandler()&lt;br /&gt; {&lt;br /&gt;  if (HttpContext.Current.Handler.GetType().ToString().EndsWith("_aspx"))&lt;br /&gt;  { // Register PreRender handler only on aspx pages.&lt;br /&gt;   Page page = (Page)HttpContext.Current.Handler;&lt;br /&gt;   page.PreRender += new EventHandler(page_PreRender);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; void page_PreRender(object sender, EventArgs e)&lt;br /&gt; {&lt;br /&gt;  System.Web.UI.Page page = (Page)sender;&lt;br /&gt;  page.Header.Controls.Add(new PostJobFree.WebUI.Controls.HeadScriptControl());&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; void Application_BeginRequest(object sender, EventArgs e)&lt;br /&gt; {&lt;br /&gt;  DosAttackAnalyzer.AnalyzeHttpRequest(Ijs.Misc.BrowserIPAddress);&lt;br /&gt;  // DenyIpAddress.DenyAccessToCurrentIpAddressIfBlacklisted();&lt;br /&gt; }&lt;br /&gt;  void IHttpModule.Dispose()&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4.2. Register HttpModule in web.config:&lt;pre&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt; &amp;lt;system.webServer&amp;gt;&lt;br /&gt;  &amp;lt;modules&amp;gt;&lt;br /&gt;   &amp;lt;remove name="DenyIpAddressModule"/&amp;gt;&lt;br /&gt;  &amp;lt;/modules&amp;gt;&lt;br /&gt; &amp;lt;/system.webServer&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note that it's &lt;a href="http://forums.asp.net/t/1439126.aspx"&gt;impossible to add controls into page straight in PreRequestHandlerExecute event handler&lt;/a&gt;.&lt;br /&gt;That's why I subscribe for Page.PreRender event.&lt;br /&gt;&lt;br /&gt;Please let me know what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-7448628752738628844?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/7448628752738628844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=7448628752738628844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/7448628752738628844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/7448628752738628844'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/05/how-to-include-javascript-tracking-code.html' title='How to include JavaScript tracking code into head control in asp.net'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-1231353681170110727</id><published>2010-05-16T00:08:00.000-04:00</published><updated>2010-05-16T00:22:13.579-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migration'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 3.5'/><title type='text'>ValidationSummary control is not red anymore</title><content type='html'>We upgraded &lt;a href="http://www.postjobfree.com"&gt;PostJobFree.com&lt;/a&gt; to ASP.NET 4.0.&lt;br /&gt;Then we discovered that ValidationSummary controls are not red anymore.&lt;br /&gt;&lt;br /&gt;It turned out that &lt;a href="http://www.asp.net/%28S%28ywiyuluxr3qb2dfva1z5lgeg%29%29/learn/whitepapers/aspnet4/breaking-changes"&gt;The BaseValidator class and validation controls that derive from it no longer render red text by default&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Why did ASP.NET team make that breaking change?&lt;br /&gt;Because they wanted to &lt;a href="http://blog.hmobius.com/post/2010/03/03/ASPNET-Part-9-Rendering-Cleaner-HTML.aspx"&gt;render cleaner and more CSS compliant HTML&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Anyway, here's the solution:&lt;br /&gt;Add ~/App_Themes/Default/Default.skin&lt;br /&gt;Put there: &lt;pre&gt;    &amp;lt;asp:ValidationSummary runat="server" ForeColor="Red" /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That worked for PostJobFree.&lt;br /&gt;Hope it would help you too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-1231353681170110727?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/1231353681170110727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=1231353681170110727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/1231353681170110727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/1231353681170110727'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/05/validationsummary-control-is-not-red.html' title='ValidationSummary control is not red anymore'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6325990195430535125</id><published>2010-05-15T13:49:00.009-04:00</published><updated>2010-12-20T11:54:09.467-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Resume'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>ASP-NET-SQL-XML-Dennis-Gorelik-Resume</title><content type='html'>&lt;p class="c1"&gt;&lt;span class="c0"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;table cellpadding="0" cellspacing="0" class="c2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="c3"&gt;&lt;p class="c5"&gt;&lt;img height="104.0" src="http://docs.google.com/File?id=dfxd8zqg_9g7wg7brx_b" width="224.0"&gt;&lt;/p&gt;&lt;/td&gt;&lt;td class="c3"&gt;&lt;p class="c5"&gt;&lt;span class="c0"&gt;Dennis Gorelik&lt;/span&gt;&lt;/p&gt;&lt;p class="c5"&gt;&lt;span class="c0"&gt;E-mail: &lt;/span&gt;&lt;/p&gt;&lt;p class="c5"&gt;&lt;span class="c0"&gt;blogresume @ dennisgorelik.com&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;You describe your business problem – I deliver technical solution&lt;br /&gt;Objective&lt;br /&gt;&lt;br /&gt;Team Lead / Architect / Senior Software Developer for the position that requires deep technical knowledge as well as good understanding of underlying business processes.&lt;br /&gt;&lt;br /&gt;Please ask me:&lt;br /&gt;- How to deploy program changes without interruptions in web site work (which is 24/7 service).&lt;br /&gt;- How to improve web site usability.&lt;br /&gt;- How to use A/B testing in Google WebSite Optimizer.&lt;br /&gt;- How to track web site performance and usage (Google Analytics, IIS Logs, custom logs, …).&lt;br /&gt;- How to use Google AdSense and Google AdWords.&lt;br /&gt;- How to integrate your solution with Google Checkout (payment system).&lt;br /&gt;- How to add maps to your web site using Google Maps API.&lt;br /&gt;- How ASP.NET Membership provider helps to keep users passwords reliably encrypted.&lt;br /&gt;- Practical way to setup data exchange with other web sites using XML web services.&lt;br /&gt;- How to quickly implement Full-Text search using SQL Server 2008.&lt;br /&gt;- How to make Web Application and background Windows Service to communicate with each other using WCF.&lt;br /&gt;- What physical tiers and logical layers I recommend to use for your application and why.&lt;br /&gt;Background&lt;br /&gt;&lt;br /&gt;Team Lead / Architect / Senior ASP.NET Developer. Over 10 years of experience in analysis, design and software development.&lt;br /&gt;Full system life cycle experience: design, coding, testing, bug fixing, deployment, documentation and maintenance.&lt;br /&gt;Preferences in Agile/RAD methodologies.&lt;br /&gt;Technical skills&lt;br /&gt;&lt;br /&gt;Languages: C# 4.0, VB.NET, T-SQL (DDL, DML), VB script, JavaScript, JQuery, HTML/DHTML, XML, ...&lt;br /&gt;&lt;br /&gt;Technologies: ASP.NET 4.0, ADO.NET, WCF (Windows Communication Foundation), XML Web Services, Unit test, WPF …&lt;br /&gt;&lt;br /&gt;Databases: MS SQL Server, Oracle, DB2 …&lt;br /&gt;Development Tools: Google Search, Visual Studio.NET 2005 Team Edition, Microsoft SQL Server Management Studio, Nant, Toad VI, MS Visio, Google Docs, MS Office, Google Maps API.&lt;br /&gt;Web Development: ASP.NET, XML Web Services, IIS, JavaScript, HTML, DHTML, CSS, ...&lt;br /&gt;Reporting Tools: Microsoft Reporting Services, Crystal Reports.&lt;br /&gt;Version and Source Control: TFS, Visual Source Safe, Subversion, VisualSVN, ...&lt;br /&gt;Operating Systems: Windows 7, Windows Server 2008, MS Windows XP/2000/NT, Windows 95/98/Me, Windows 3.xx, MS DOS.&lt;br /&gt;Projects history&lt;br /&gt;&lt;br /&gt;May 2008 - Present. Team Lead, www.postjobfree.com, Jacksonville, FL&lt;br /&gt;&lt;br /&gt;Tools and technologies: VS.NET 2010 (ASP.NET, WCF, AJAX, JQuery, Unit Tests, Web Tests, MembershipProvider …), C# 4.0, SQL Server 2008, VisualSVN, NDepend, Reflector, Google Analytics, AdWords, AdSense.&lt;br /&gt;&lt;br /&gt;- Architected and implemented www.postjobfree.com.&lt;br /&gt;- Integrated PostJobFree with external systems: job search aggregators, Google and search engines, Twitter, … (XML Services, API calls).&lt;br /&gt;- Designed and lead implementation of search alerts, including immediate match delivery.&lt;br /&gt;- Analyzed users’ feedback and prioritized development features.&lt;br /&gt;- SEO (Search Engine Optimization):&lt;br /&gt;- Implemented RESTful architecture: Made all content available through direct HTTP GET requests (direct URLs to every bit of information without need to clicking buttons (HTTP POST)).&lt;br /&gt;- Exposed PostJobFree web content through Site Maps to Google and Yahoo search engines.&lt;br /&gt;- Designed &amp; implemented strategy to fight spam and duplicates.&lt;br /&gt;- Designed database structure to accommodate business requirements.&lt;br /&gt;September 2010 - December 2010. Senior ASP.NET developer, Lender Processing Services, Jacksonville, FL&lt;br /&gt;&lt;br /&gt;http://www.lpsvcs.com - Tax Desktop application -- tax oriented component of Loan Processing System.&lt;br /&gt;Tools &amp; Technologies: ASP.NET 3.5, C#, VS.NET 2008, MS SQL Server 2008, T-SQL Stored Procedures, WCF web services, JavaScript, JQuery, TFS.&lt;br /&gt;Accomplishments:&lt;br /&gt;Extended business functionality (Loan details, Tax Lines).&lt;br /&gt;Refactored spaghetti code into object oriented muti-tier/multi-layer solution with:&lt;br /&gt;- DAO (Data Access Object -- client consuming WCF service)&lt;br /&gt;- WCF service (Windows Communication Foundation)&lt;br /&gt;- BLL (Business Logic Layer)&lt;br /&gt;- DAL (Data Access Layer) that faces LINQ-to-SQL designer.&lt;br /&gt;Eliminated the need of updating web references and minimized WCF client footprint in web.config, which improved code maintainability.&lt;br /&gt;Identified SQL Connection leak and implemented solution that fixes it.&lt;br /&gt;&lt;br /&gt;- September 2005 – May 2008. Senior ASP.NET &amp; database developer, National Flood Services, Kalispell, MT&lt;br /&gt;http://www.nfsmt.com/ - the company works in flood insurance business.&lt;br /&gt;Conversion from Legacy system (AS-400/DB2/VB6/ASP/ASP.NET/MS SQL2000) to new ASP.NET 2005 / MS SQL 2005 application.&lt;br /&gt;&lt;br /&gt;Tools &amp; Technologies: ASP.NET 2.0, VS.NET 2005, C# 2.0, SSRS (SQL Server Reporting Services), Generics, Provider Model, User Controls, Master pages, GridView, Web parts, ADO.NET, Web Forms, XML Web Services, MS SQL Server 2000, Validation controls, JavaScript, Telerik controls, HTML/DHTML, CSS, VSS, Web Forms.&lt;br /&gt;&lt;br /&gt;Achievements:&lt;br /&gt;&lt;br /&gt;- Data Warehouse: Architected and developed system that imports data from legacy database (DB2) in form of flat files. Incoming data is parsed, scrubbed for errors, and loaded into final database in denormalized form for fast reports performance.&lt;br /&gt;&lt;br /&gt;Data Correction Application: Designed and developed application that allows to review and fix incorrect data that was imported into Data Warehouse (Winforms, C#, Web Services, SQL Server 2005).&lt;br /&gt;&lt;br /&gt;Insight Reports: Architected and developed web application for report requests – users can customize reports according to their requirements (ASP.NET 2.0, MS SQL 2005, SSRS (SQL Server Reporting Services), Web Services, JavaScript, HTML/DHTML, Telerik controls,&lt;br /&gt;DB2, SQuirreL SQL 2.1).&lt;br /&gt;- Developed custom Membership and Role providers to access legacy database (ASP.NET 2.0, Provider Model, MS SQL 2000, DB2).&lt;br /&gt;- Developed custom localization provider (C# 2.0, Reflector. Namespaces: System.Reflection, System.Resources, System.Web.Compilation, System.IO).&lt;br /&gt;Developed User Management system + Web site administration (MS SQL 2005, ASP.NET 2.0 Login controls).&lt;br /&gt;- Developed several Flood Service providers (C# 2.0, HttpWebRequest).&lt;br /&gt;- Developed UI for testing various Flood Service providers (ASP.NET, C# 2.0, GridView, ObjectDataSource, Session, ViewState).&lt;br /&gt;- Helped others to solve technical problems.&lt;br /&gt;June 2005 – August 2005. Senior ASP.NET developer, IBM Global Services, Indianapolis, IN&lt;br /&gt;&lt;br /&gt;http://www.ibm.com/services/&lt;br /&gt;This is fast paced project for Wells Fargo bank (http://www.wellsfargo.com/). The project was about making web portal for managing vendor evaluation scorecards.&lt;br /&gt;Snapshots: http://www.dennisgorelik.com/resume/IbmGlobalServices&lt;br /&gt;Tools &amp; Technologies: ASP.NET, C#.NET, ASP.NET User Controls, ADO.NET, Web Forms, MS SQL Server 2000, Validation controls, JavaScript, HTML/DHTML, CSS, VSS, RapTier codegenerator.&lt;br /&gt;&lt;br /&gt;Achievements:&lt;br /&gt;- Analyzed business requirement.&lt;br /&gt;- Defined technical details of the solution.&lt;br /&gt;- Developed scorecard template functionality edit/view/report (ASP.NET, C#, MS SQL, Stored Procedures, RapTier, CSS, HTML).&lt;br /&gt;- Implemented making and handling web-page snapshorts in “Web archive, single file (*.mht)” format:&lt;br /&gt;- Developed functionality for saving web pages snapshots into database (used CDO functionality).&lt;br /&gt;- Developed functionality for viewing saved snapshots.&lt;br /&gt;Saved images into database and showed images from database on web pages.&lt;br /&gt;Implemented Scorecard View with dynamical load of heterogeneous user controls into the web page.&lt;br /&gt;Developed several appendices for Scorecard functionality:&lt;br /&gt;- Designed database tables.&lt;br /&gt;- Created stored Procedures / Views / User defined functions&lt;br /&gt;- Created middle-tier DB classes (C#).&lt;br /&gt;- Created AppendixControl_Base.cs as a base for “Appendix” user controls. This base class was used by me and other developers in the team.&lt;br /&gt;- Created user controls (*.ascx / C#).&lt;br /&gt;Tested, fixed, and modified application according to changes in user requirements.&lt;br /&gt;December 2004 – June 2005. Senior ASP.NET developer, Cendant Mobility, Danbury, CT&lt;br /&gt;&lt;br /&gt;http://www.cendantmobility.com/&lt;br /&gt;&lt;br /&gt;Tools &amp; Technologies: ASP.NET, C#.NET, ASP.NET User Controls, ADO.NET, Web Forms, Win Forms, MS SQL Server, Remoting, Validation controls, JavaScript, HTML/DHTML, CSS, Nant, VSS.&lt;br /&gt;Analyzed business requirements.&lt;br /&gt;- Developed Template Request module (ASP.NET, C#, JavaScript, ADO.NET) and integrated it with existing application https://atlas.cendantmobility.com/.&lt;br /&gt;- Template finder.&lt;br /&gt;- Multiple container pages.&lt;br /&gt;- Various template list screens with "multiple rows add" and "multiple rows remove" functionality (ASP.NET, JavaScript). (“Template associations”, “Template list”).&lt;br /&gt;- “Update” screens (document template update, package template update).&lt;br /&gt;- Developed ASP.NET User controls, including:&lt;br /&gt;- Template list ASP user control - with Middle tier call, page navigation (paging), and sorting all columns.&lt;br /&gt;- Navigation ASP user control.&lt;br /&gt;- Created unit tests (WinForms).&lt;br /&gt;- Used the following techniques:&lt;br /&gt;- Nested pages (iframe), including nesting iFrames.&lt;br /&gt;- Popup pages (Template finder, Product selection)&lt;br /&gt;- Style sheets (*.css)&lt;br /&gt;- Wrote stored procedures.&lt;br /&gt;- Set up Nant --- tool for automatic build generation (for daily build).&lt;br /&gt;- Helped other developers to solve technical problems.&lt;br /&gt;&lt;br /&gt;August 2004 – December 2004. Senior ASP.NET developer, MPS Group, Jacksonville, FL&lt;br /&gt;http://www.mpsgroup.com/&lt;br /&gt;“Knowledge Spring” web portal project development.&lt;br /&gt;Developed portlets(ASP.NET user controls) for multi-tier web system.&lt;br /&gt;Tools &amp; Technologies: VS.NET, ASP.NET, User Controls, Portlets, Repeater, DataList, Validator Controls, JavaScript, C#.NET, VB.NET, WebForms, WinForms, Oracle 9.2, LLBLGen Pr- Engine, Toad VI, SQL Plus, VB Script, PL/SQL script, ADO.NET, XML Web Services, MS VSS 6.0d, ComponentArt TreeView.&lt;br /&gt;&lt;br /&gt;Projects:&lt;br /&gt;- Directory Browser (recursive browsing through database items + Properties PopUp)&lt;br /&gt;- MessageSet Editor &amp; Message Editor (used repeater and Cute Editor control)&lt;br /&gt;- Role Editor, UserSelectionControl, Actions Editor PopUp&lt;br /&gt;- Attribute Editor, Portlet type editor, User Control editor, Item Types editor, DomainMappings editor, Audiences editor, Actions editor (repeater, JavaScript including passing data between main and popup windows, Web Validation Controls)&lt;br /&gt;- SubstitutionVariables editor (used RegEx expressions)&lt;br /&gt;- FileReportViewer (including NTFS permissions check through Advapi32.dll and Kernel32.dll API)&lt;br /&gt;- Developed Windows services (C#).&lt;br /&gt;- Developed win forms test app.&lt;br /&gt;- Site Directory View 3-layers tree (ComponentArt TreeView).&lt;br /&gt;- Configurations loading (VB Script, PL/SQL script, *.lst files).&lt;br /&gt;May 2004 – July 2004. .NET architect, Yellow Pepper, Boston, MA&lt;br /&gt;&lt;br /&gt;http://www.yellowpepper.com/&lt;br /&gt;Tools &amp; Technologies: VS.NET, ASP.NET, C#.NET, VB.NET, WebForms, WinForms, MS SQL 2000, ADO.NET, XML Web Services, MS Visual Source Safe, Groove.&lt;br /&gt;&lt;br /&gt;Projects:&lt;br /&gt;- Shazam web service wrapper.&lt;br /&gt;- SMS Tracker – tracks information about SMS messages delivery.&lt;br /&gt;- SMS Games – games based on sending/receiving SMS text messages to/from cell phone.&lt;br /&gt;- Phone number look up – look up information about specified phone number (Carrier, Gate, IsWireless, City, State, Country, Switch).&lt;br /&gt;August 2003 – April 2004. Senior .Net Software developer, Wurzburg, Memphis, TN&lt;br /&gt;&lt;br /&gt;Tools &amp; Technologies: ASP.NET, C#.NET, WebForms, WinForms, MS SQL 2000, ADO.NET, Microsoft Application Block, Remoting, Crystal Reports, XML Web Services, User controls, Server Controls, MS Visual Source Safe, MS Project, MS Visio.&lt;br /&gt;&lt;br /&gt;Projects: &lt;br /&gt;Development of various functionalities for warehouse project.&lt;br /&gt;&lt;br /&gt;Web-site security&lt;br /&gt;Designed and developed security framework for the web application: User authentication and authorization, Cross-applications calls.&lt;br /&gt;&lt;br /&gt;UPS address validation project&lt;br /&gt;Designed and developed mail address validation program. The program interface is exposed through web-page interface (and .csv file) and through XML Web Service (http://www.wurzburg.com/UPS/UpsValidation.asmx).&lt;br /&gt;Technologies: ASP.NET, IIS, C#, XML, XML Web Services.&lt;br /&gt;The program prepares XML-request and send it to UPS.&lt;br /&gt;&lt;br /&gt;The program is based on UPS EDI functionality exposed here:&lt;br /&gt;https://www.ups.com/ups.app/xml/AV&lt;br /&gt;&lt;br /&gt;Reports project&lt;br /&gt;Developed various business reports. Reports are provided in PDF-format, HTML-format, and can be printed directly to the specified printer. Reports functionality is exposed as to end users (through web-pages) as to other developers (in form of XML web services).&lt;br /&gt;Technologies: IIS, ASP.NET, C#, Crystal Reports, ADO.NET, MS SQL Server 2000 (stored procedures, views, functions), XML Web Services, IE 6.&lt;br /&gt;&lt;br /&gt;Catalogue project&lt;br /&gt;Designed catalogue module, including ASP.NET and MS SQL database design. Developed shopping card functionality.&lt;br /&gt;&lt;br /&gt;Label printing project&lt;br /&gt;Designed and developed program to print bar-code labels. Program is tightly integrated with the company’s database. For instance, user which prints a label is associated with it’s own label printer.&lt;br /&gt;Technologies: IIS, ASP.NET, C#, Crystal Reports, ADO.NET, MS SQL Server 2000 (stored procedures, views, functions), IE 6.&lt;br /&gt;&lt;br /&gt;Deployment&lt;br /&gt;Worked out fast and reliable deployment method. This method allows to deploy development changes to Production every day. Automated deployment SQL-script preparation.&lt;br /&gt;In case of emergency deployment can be made even more often (in extreme cases up to 4 times per day).&lt;br /&gt;Technologies: VS.NET, Database project, VSS, ASP.NET.&lt;br /&gt;Performance&lt;br /&gt;After initial prototyping and user evaluation I improved performance of "bottle-neck" applications. Modified SQL-queries, used MS SQL Query analyzer and SQL Profiler.&lt;br /&gt;&lt;br /&gt;Other responsibilities&lt;br /&gt;Was responsible for managing project documentation and for Visual Source Safe administration.&lt;br /&gt;&lt;br /&gt;April 2003 – August 2003. Team leader. Global Consulting Group, Cincinnati, OH&lt;br /&gt;&lt;br /&gt;Tools &amp; Technologies: Visual Studio .NET, VB.NET, C#.NET, WebForms, WinForms, ADO.NET, MS SQL 2000, MS Visual Source Safe, MS Project, MS Visio.&lt;br /&gt;&lt;br /&gt;Responsibilities: Lead team of 3 developers.&lt;br /&gt;Achievements:&lt;br /&gt;&lt;br /&gt;- Analyzed business requirements.&lt;br /&gt;- Designed application architecture.&lt;br /&gt;- Wrote technical specification.&lt;br /&gt;Coached team members.&lt;br /&gt;- Implemented logical and physical database design.&lt;br /&gt;- Created SQL-queries (T-SQL).&lt;br /&gt;- Developed web UI forms (ASP.NET, WebForms).&lt;br /&gt;- Implemented data exchange (ADO.NET).&lt;br /&gt;- Created business components (C#.NET).&lt;br /&gt;- Created reports (Crystal Reports 9.0).&lt;br /&gt;- Created XML Web services.&lt;br /&gt;- Created XSL transformations.&lt;br /&gt;May 2002 - April 2003. Application Developer, Scala&lt;br /&gt;&lt;br /&gt;http://www.scala.net/&lt;br /&gt;Tools &amp; Technologies:&lt;br /&gt;&lt;br /&gt;Visual Studio.NET, VB.NET, ASP.NET, WinForm, WebForms, Visual Basic 6.0, MS XML Parser, SOAP, Crystal Reports, MS SQL Server, Oracle, VC++, VB Script, Syncr- VSS, Source of Site and Visual Source Safe for version control.&lt;br /&gt;MS Project for time tracking.&lt;br /&gt;Benjamin (http://benjamin.scala.se/) - for tracking bugs and features.&lt;br /&gt;MS Office, Rational Rose diagrams – for documentation purposes.&lt;br /&gt;&lt;br /&gt;Responsibilities: Migration of legacy VB6 application into new .NET application. Reports development, XML services development for ERP (Enterprise Resource Planning) system. Retail sales, Warehousing, and Accounting modules development.&lt;br /&gt;&lt;br /&gt;Achievements:&lt;br /&gt;- Converted existing VB6 application into VB.NET application.&lt;br /&gt;- Developed WinForms (VB.NET).&lt;br /&gt;- Developed WebForms (ASP.NET).&lt;br /&gt;- Implemented business logic (VB.NET).&lt;br /&gt;- Created and modified SQL-queries.&lt;br /&gt;- Developed several XML services for iScala (see: http://www.scala.net/scalasap/scalasap.asp):&lt;br /&gt;- Created XSD, XDR schemas and XML samples. (Used XML Spy http://www.xmlspy.com/).&lt;br /&gt;- Created XSLT transformations. Used Xselerator http://www.vbxml.com/xselerator/.&lt;br /&gt;- Created business reports (Crystal Reports).&lt;br /&gt;- Created and maintained tools for development process:&lt;br /&gt;- Universal AutoTest program for testing iScala XML-services.&lt;br /&gt;- Wrote documentation for AutoTest program.&lt;br /&gt;- XML validator – allows quick checking is XML document valid or not.&lt;br /&gt;- XML service registrator – copies all necessary components of specified XML service on tester’s computer and registers them under COM+ server.&lt;br /&gt;- Created and modified type libraries (*.idl, *.tlb).&lt;br /&gt;- Designed Work Flow diagrams for iScala.&lt;br /&gt;October 2001 - April 2002: System analyst/Software developer, Egar Technology Corporation&lt;br /&gt;&lt;br /&gt;http://www.egartech.com/&lt;br /&gt;Tools &amp; Technologies: MS SQL 2000, VB 6.0, Data Environment, ADO, Far Point Spread 2.5 (data grid), Crystal Reports 8.0, VSS 6.0, Visual InterDev 6.0, ASP, Rational ClearQuest and MS Outlook.&lt;br /&gt;&lt;br /&gt;Responsibilities:&lt;br /&gt;Development of the Collateral module for financial system. Data Modeling. ER-diagrams (ERwin).&lt;br /&gt;Full Application consists of more than 300 database tables, 200 views, 500 stored procedures, 1000 VB-forms and modules&lt;br /&gt;&lt;br /&gt;Achievements:&lt;br /&gt;- Developed Back End of the Collateral module (tables, constraints, views and stored procedures).&lt;br /&gt;- Developed VB user interface (Designed client forms and wrote VB-code).&lt;br /&gt;- Created various financial reports (Crystal Reports 8.0).&lt;br /&gt;- Developed Web interface (ASP).&lt;br /&gt;- Wrote SQL-script for database deployment on customer computer.&lt;br /&gt;- Used Rational ClearQuest to track defects and change requests.&lt;br /&gt;- Used Visual InterDev for DB-scripts (SP and view) handle and version tracking and control via VSS.&lt;br /&gt;November 2000 – September 2001: Software developer, Granat International Inc., Cleveland, OH&lt;br /&gt;&lt;br /&gt;http://www.granatinternational.com/&lt;br /&gt;Tools &amp; Technologies:&lt;br /&gt;VB 6.0, MTS, Visual Source Safe 6.0, InterDev, IIS, ADO, MS SQL 7.0 (MS SQL Query Analyzer, MS SQL Enterprise manager), Microsoft Transaction Server 2.0, Crystal Reports 8.0, VB-script (MS-Word 2000), Windows 2000.&lt;br /&gt;&lt;br /&gt;Project: Loan Inventory Control System. Migration from Clipper to VB6.&lt;br /&gt;Application consists of more than 200 forms and reports. It is 3-tier application.&lt;br /&gt;&lt;br /&gt;Responsibilities:&lt;br /&gt;The task was complete transferring the business logic from the existing file-server application (AS400, Clipper) to the Windows 3-tier architecture. Customer is the “Leader Mortgage” co., USA, OH (http://www.mortgagemag.com/guide/c008/c008630.htm).&lt;br /&gt;&lt;br /&gt;Achievements:&lt;br /&gt;- Investigated behavior of DOS-application and its source code (Clipper).&lt;br /&gt;- Created DTS-package for conversion *.dbf into MS SQL database.&lt;br /&gt;- Developed SQL-queries and business logic (COM+ components).&lt;br /&gt;- Created reports (Crystal Reports 8) and forms for view and update database information.&lt;br /&gt;- Developed VB-script (MS Word 2000), which helps to convert large fragments of clipper source code to VB code.&lt;br /&gt;- Developed VB-script (MS Word 2000), which helps to convert large fragments of clipper source code to VB code.&lt;br /&gt;- Developed Web interface (ASP).&lt;br /&gt;Certification&lt;br /&gt;&lt;br /&gt;Microsoft&lt;br /&gt;&lt;br /&gt;http://www.microsoft.com/learning/mcp/transcripts&lt;br /&gt;Transcript ID: 663106&lt;br /&gt;Access Code: dennisgorelik&lt;br /&gt;- 070-320 exam (Developing XML Web Services and Server Components with Microsoft Visual C#.NET and the Microsoft .NET Framework).&lt;br /&gt;Score: 981.&lt;br /&gt;- 080-316 exam (Developing and Implementing Windows-based Applications with Microsoft Visual C#.NET and Microsoft Visual Studio.NET).&lt;br /&gt;Score: 917.&lt;br /&gt;- 080-315 exam (Developing and Implementing Web Applications with Microsoft Visual C#.NET and Microsoft Visual Studio.NET).&lt;br /&gt;Score: 916.&lt;br /&gt;Brainbench&lt;br /&gt;&lt;br /&gt;- 2004 Brainbench certification ASP.NET.&lt;br /&gt;- 2004 Brainbench certification C#.NET.&lt;br /&gt;- 2004 Brainbench certification VB.NET.&lt;br /&gt;http://www.dennisgorelik.com/resume/BrainbenchNetCertification.htm&lt;br /&gt;- 2000 Brainbench certification in MS SQL 7.0.&lt;br /&gt;- 2000 Brainbench certification in VB 6.0.&lt;br /&gt;- 2000 Brainbench certification in Active Server Pages (ASP).&lt;br /&gt;- 2000 Brainbench certification in MS Visual Interdev 6.0.&lt;br /&gt;Education&lt;br /&gt;&lt;br /&gt;1997 - 2000 MS degree in Economic and Management. South-Ural State University, Chelyabinsk, Russia.&lt;br /&gt;1991 - 1997 MS degree in Automatic Control Systems. Chelyabinsk State Technical University, Chelyabinsk, Russia.&lt;br /&gt;Personal&lt;br /&gt;&lt;br /&gt;Excellent analytical, problem solving, technical, interpersonal and communication skills with a strong entrepreneurial drive.&lt;br /&gt;References&lt;br /&gt;&lt;br /&gt;Wurzburg&lt;br /&gt;&lt;br /&gt;Keywords&lt;br /&gt;ASP.NET, C#, SQL, MS SQL Server, Microsoft SQL Server, Visual Basic, VB, JavaScript, JQuery, Microsoft developer, Microsoft technologies, Visual Studio 6.0, Visual Studio.NET, VC++, XML, MS XML Parser, XML services, XML Web Services, SOAP, EDI (Electronic Data Interchange), BizTalk, XSLT, XPath, XSD schemas, XDR schemas, OAGIS, Active Server Pages, ASPX, Visual InterDev, Visual Source Safe, VSS, VSS 6.0d, IIS, Internet Information Server, MS Office, Microsoft Office, Perl, Microsoft Access, Microsoft Word VBA, Microsoft Excel VBA, Outlook VBA, Windows 2000, Windows XP, Windows NT, Windows 98, Windows 95, Object Orienting Programming, OOP, Component Object Model, COM, COM+ Server, MTS Server, RDBMS, UML, Rational Rose, Rational ClearQuest, Crystal Reports 9.0, MSDN Library, AS400, XML Spy, ERP, Microsoft Office VBA, Microsoft Query Analyzer, Microsoft Enterprise Manager, Profiler, XSelerator, OAGIS, *.idl, *.tlb, mIDL, DLL, VB6, VB.NET, ASP.NET, User controls, Server Controls, Portlets, Repeater, DataList, DataGrid, Components, ActiveX controls, ADO, OLE DB, MS Project, MS Visio, Work Flow diagrams, The Far manager, The Bat, Grid, True DB grid, FarPoint Spread, MSN, ICQ, Email, VB script, Java script, HTML, DHTML, programmer, data modeling, ER-diagrams, Erwin, Database technologies, Database developer, System Analyst, DBA, stored procedures, SP, Views, Triggers, MS IE, eCommerce, Microsoft Internet Explorer, MCAD, NTFS permissions check, Oracle 9.2, Toad VI, SQL Plus, ComponentArt TreeView, LLBLGet, RapTier codegenerator, mht, CDO, WCF, WPF.&lt;br /&gt;&lt;br /&gt;Willing to relocate to: Tampa, FL; Saint Petersburg, FL; Orlando, FL; Jacksonville, FL; Miami, FL; Atlanta, GA; Dallas, TX; Houston, TX; Austin, TX; San Antonio, TX; Raleigh, NC; Memphis, TN; Chattanooga, TN; Nashville, TN, Phoenix, AZ; Kansas, KS; San Diego, CA; San Francisco, CA; Oakland, CA, Los Angeles, CA; Orange County, CA; SC; AL; LA; CO; AR; MS; NM; OK and some other warm places.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6325990195430535125?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6325990195430535125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6325990195430535125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6325990195430535125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6325990195430535125'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/05/asp-net-sql-xml-dennis-gorelik-resume.html' title='ASP-NET-SQL-XML-Dennis-Gorelik-Resume'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-8288721829560583049</id><published>2010-04-13T13:47:00.002-04:00</published><updated>2010-04-13T13:51:19.438-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio .NET'/><category scheme='http://www.blogger.com/atom/ns#' term='intellisense'/><title type='text'>Extreme intellisense</title><content type='html'>Scott Guthrie's team is working on &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/04/08/javascript-intellisense-improvements-with-vs-2010.aspx"&gt;technology that allows to build intellisense based on executing underlying JavaScript code&lt;/a&gt;.&lt;br /&gt;It's not available in Visual Studio yet, but looks like it would be available soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-8288721829560583049?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/8288721829560583049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=8288721829560583049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/8288721829560583049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/8288721829560583049'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/04/extreme-intellisense.html' title='Extreme intellisense'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-8727867347174462210</id><published>2010-04-11T22:49:00.003-04:00</published><updated>2010-04-11T23:02:51.427-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='float double single precision'/><title type='text'>Cast from float to double error</title><content type='html'>I was surprised to find out that this line of code fails:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    Assert.AreEqual(0.1d, (double)0.1f);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(double)0.1f is actually the same as ... drumbeat ... 0.100000001490116&lt;br /&gt;&lt;br /&gt;Why does it happen?&lt;br /&gt;Because float and double do NOT represent fractions precisely.&lt;br /&gt;Rounding is always going on.&lt;br /&gt;&lt;br /&gt;How to deal with this?&lt;br /&gt;There are several options:&lt;br /&gt;1) Round double after converting float number into it.&lt;br /&gt;For example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    float f = 0.1f;&lt;br /&gt;    double d = Math.Round(f, 8);&lt;br /&gt;&lt;/pre&gt; would assign 0.1d to d.&lt;br /&gt;&lt;br /&gt;2) Don't use float/Single and use double only.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    double d = 0.1;&lt;br /&gt;&lt;/pre&gt; would assign exactly 0.1d to d.&lt;br /&gt;&lt;br /&gt;3) Use decimal or bigdecimal if you are dealing with money.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    decimal m = 0.1m&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hope it helps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-8727867347174462210?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/8727867347174462210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=8727867347174462210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/8727867347174462210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/8727867347174462210'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/04/cast-from-float-to-double-error.html' title='Cast from float to double error'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6918651771842174304</id><published>2010-01-23T21:15:00.008-05:00</published><updated>2010-01-25T12:19:51.645-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Forms'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 3.5'/><title type='text'>ASP.NET: MVC Framework vs Web Forms Framework</title><content type='html'>It looks like &lt;a href="http://codebetter.com/blogs/karlseguin/archive/2010/01/22/the-webforms-rant.aspx"&gt;"MVC vs Web Forms" debate heats up&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's my take on it:&lt;br /&gt;1) Last time I checked, MVC required 50+% overhead (relative to Web Forms) in terms of the amount of code required to implement the same functionality.&lt;br /&gt;Was that fundamental problem fixed yet?&lt;br /&gt;&lt;br /&gt;Let's consider an example of business requirements:&lt;br /&gt;Create a page that allows user enter text, click "Save" button, and then call existing business layer method BusinessLayer.Save().&lt;br /&gt;With Web Forms approach it would take:&lt;br /&gt;- 1 line of ASPX code for textbox &lt;br /&gt;- 1 line of ASPX code for Save button (including Save_Click() call).&lt;br /&gt;- 3 lines of code-behind:&lt;br /&gt;void Save_Click() {&lt;br /&gt;BusinessLayer.Save(Input.Text);&lt;br /&gt;}&lt;br /&gt;Total: 5 lines of code.&lt;br /&gt;&lt;br /&gt;How many lines of code that task would get in MVC?&lt;br /&gt;&lt;br /&gt;2) Now about why it's important to minimize number of lines of code:&lt;br /&gt;Lines of code is the best available metric of project complexity.&lt;br /&gt;Yes I know that different lines have different complexity attached to it, but by default I assume that complexity of Web Forms’ line is about the same as complexity of MVC's line of code.&lt;br /&gt;&lt;br /&gt;3) Many developers say that it's good to know MVC even if you don't use it (just to be familiar with available options to be ready to jump on it).&lt;br /&gt;I agree. Sort of.&lt;br /&gt;The trick is to know what to learn. There are so many technologies out there so it's not possible to learn them all.&lt;br /&gt;How do I know that MVC would have good return on my time invested?&lt;br /&gt;I don't know it yet. Many developers are passionate about MVC, but relying just on buzz around new technology methodology is too risky: for example, RUP (Rational Unified Process) is nowhere now after all that buzz 10 years ago. Learning it (aside of the most basic concepts) would be mostly waste of time.&lt;br /&gt;And lines of code overhead really kills my enthusiasm about MVC.&lt;br /&gt;&lt;br /&gt;I'm open to change my mind though. Especially considering that MVC is getting more mature every year.&lt;br /&gt;&lt;br /&gt;See also: Scott Guthrie chimed in with great &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/01/24/about-technical-debates-both-in-general-and-regarding-asp-net-web-forms-and-asp-net-mvc-in-particular.aspx"&gt;"About Technical Debate" post and even better follow up comments about advantages of Web Forms vs Advantages of MVC Framework&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6918651771842174304?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6918651771842174304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6918651771842174304' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6918651771842174304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6918651771842174304'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2010/01/aspnet-mvc-framework-vs-web-forms.html' title='ASP.NET: MVC Framework vs Web Forms Framework'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-7830618840536814099</id><published>2009-09-26T22:24:00.003-04:00</published><updated>2009-09-26T22:34:18.859-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio .NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Unit Tests'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Unable to obtain public key for StrongNameKeyPair</title><content type='html'>You are using Visual Studio 2008 (SP1 or not -- doesn't matter).&lt;br /&gt;You have test project that is signed with strong key and that strong key has a password on it.&lt;br /&gt;You are trying to create a unit test for private method and are trying to create accessor.&lt;br /&gt;You have an error like that:&lt;br /&gt;"Creation of the private accessor for Xyz failed"&lt;br /&gt;&lt;br /&gt;You have that error because you excluded "Test References" folder and YourProject.accessor file from your test project.&lt;br /&gt;&lt;br /&gt;The reason why you excluded YourProject.accessor file from your project is that you were getting a compilation error:&lt;br /&gt;"Unable to obtain public key for StrongNameKeyPair".&lt;br /&gt;&lt;br /&gt;The reason why you are getting that error is that VS 2008 SP1 and even VS 2010 Beta 1 have a bug.&lt;br /&gt;&lt;br /&gt;Workaround for that bug is to turn off strong key signing on your test project.&lt;br /&gt;&lt;br /&gt;Read more here:&lt;br /&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/tfsbuild/thread/d07846c8-0644-44a0-925e-79da02608485"&gt;Unable to obtain public key for StrongNameKeyPair&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-7830618840536814099?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/7830618840536814099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=7830618840536814099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/7830618840536814099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/7830618840536814099'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2009/09/unable-to-obtain-public-key-for.html' title='Unable to obtain public key for StrongNameKeyPair'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6030962551663753711</id><published>2009-05-29T15:49:00.005-04:00</published><updated>2009-06-19T17:32:15.475-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Collation'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Unicode'/><title type='text'>SQL_Latin1_General_Cp850_BIN</title><content type='html'>While working on &lt;a href="http://postjobfree.blogspot.com/2009/06/postjobfree-automoderator.html"&gt;Auto-Moderator&lt;/a&gt; for &lt;a href="http://www.postjobfree.com"&gt;PostJobFree.com&lt;/a&gt; I encountered the following problem: my C# code considered ‘3’ and ‘３’ as different words, but SQL Server considered them the same.&lt;br /&gt;That expressed itself in the following error:&lt;br /&gt;&lt;pre&gt;Cannot insert duplicate key row in object 'dbo.Word' with unique index 'IX_Word'.&lt;/pre&gt;&lt;br /&gt;That was a little bit surprising, considering that I defined Word as Unicode column (nvarchar).&lt;br /&gt;&lt;br /&gt;While searching for the solution, my first thought was to make 'IX_Word' index not unique. That worked, but would have introduced other problems with spam filtering business logic down the road.&lt;br /&gt;&lt;br /&gt;The solution should have been about making SQL Server to compare strings exactly the same way C# code does.&lt;br /&gt;&lt;br /&gt;I started to look into SQL Server Collations, and finally found the solution: use SQL_Latin1_General_Cp850_BIN collation.&lt;br /&gt;&lt;br /&gt;Basically the solution is about to declaring 'Word' column with SQL_Latin1_General_Cp850_BIN collation:&lt;br /&gt;&lt;pre&gt;Create Table Word(&lt;br /&gt; WordId bigint identity(1,1) not null,&lt;br /&gt; Word nvarchar(50) COLLATE SQL_Latin1_General_Cp850_BIN not null,&lt;br /&gt; JobPostCount int not null DEFAULT 0,&lt;br /&gt; JobLogSpamCount int not null DEFAULT 0,&lt;br /&gt; CreateDate datetime not null,&lt;br /&gt; UpdateDate datetime not null,&lt;br /&gt; CONSTRAINT PK_Word Primary Key Clustered&lt;br /&gt; (&lt;br /&gt;  WordId ASC&lt;br /&gt; )&lt;br /&gt;)&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;Create Unique Index IX_Word ON Word&lt;br /&gt;(&lt;br /&gt; Word&lt;br /&gt;)&lt;br /&gt;GO&lt;/pre&gt;&lt;br /&gt;Possible drawbacks of the solution: using SQL_Latin1_General_Cp850_BIN collation may cause weird sorting in SQL queries, but sorting collation can be easily redefined like this:&lt;br /&gt;&lt;pre&gt;select * from Word&lt;br /&gt;order by Word COLLATE SQL_Latin1_General_CP1_CI_AS&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Moreover, the sorting it provided by binary collation (SQL_Latin1_General_Cp850_BIN) looks quite reasonable. &lt;br /&gt;&lt;br /&gt;You may also use SQL_Latin1_General_Cp850_BIN2 collation for better sorting.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here’s SQL sample to you to play with:&lt;br /&gt;&lt;pre&gt;--drop table t;&lt;br /&gt;select N'３' as Word&lt;br /&gt;into t;&lt;br /&gt;&lt;br /&gt;insert into t&lt;br /&gt;select '3' as Word;&lt;br /&gt;&lt;br /&gt;select * from t&lt;br /&gt;where Word = N'3';&lt;br /&gt;&lt;br /&gt;select * from t&lt;br /&gt;where Word = N'３' &lt;br /&gt;&lt;br /&gt;select * from t&lt;br /&gt;where Word = N'3' collate SQL_Latin1_General_Cp850_BIN;&lt;br /&gt;&lt;br /&gt;select * from t&lt;br /&gt;where Word = N'３' collate SQL_Latin1_General_Cp850_BIN&lt;/pre&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6030962551663753711?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6030962551663753711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6030962551663753711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6030962551663753711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6030962551663753711'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2009/05/sqllatin1generalcp850bin.html' title='SQL_Latin1_General_Cp850_BIN'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-2665746261753297702</id><published>2009-04-05T17:30:00.003-04:00</published><updated>2009-04-05T17:52:05.036-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web.config'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS 6.0'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 3.5'/><title type='text'>web.config in IIS 7.0</title><content type='html'>IIS 7.0 treats Web Application differently from how IIS 6.0 treats Virtual Directory connected to Application pool.&lt;br /&gt;The difference is in how web.config properties are inherited from parent application.&lt;br /&gt;If Virtual Directory in IIS 6.0 is physically located outside of parent web application, then web.config properties are not inherited. Even if logically Virtual Directory is inside parent web application.&lt;br /&gt;So, even if from end user URL looks like this:&lt;br /&gt;http://www.parentwebapp.com/virtualdirectory -- virtualdirectory web app does not inherit web.config properties from parentwebapp.com&lt;br /&gt;&lt;br /&gt;IIS 7.0 is smarter than IIS 6.0.&lt;br /&gt;Even if parentwebapp.com and virtualdirectory from above example are mapped to different physical folders like this:&lt;br /&gt;http://www.parentwebapp.com/ -- c:\parentwebapp&lt;br /&gt;http://www.parentwebapp.com/virtualdirectory/ -- c:\virtualdirectory&lt;br /&gt;&lt;br /&gt;IIS 7.0 still recognizes that http://www.parentwebapp.com/virtualdirectory/ inherits all web.config settings from http://www.parentwebapp.com/&lt;br /&gt;&lt;br /&gt;Such inheritance sometimes causes undesired effects.&lt;br /&gt;For example, if you added HttpModules to parent web app code, but didn't add them to child virtual directory, you may end up with "Could not load type ..." run-time error.&lt;br /&gt;&lt;br /&gt;In order to get rid of this error you need from inherited settings.&lt;br /&gt;You can do it like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;system.web&amp;gt;&lt;br /&gt;  &amp;lt;httpModules&amp;gt;&lt;br /&gt;   &amp;lt;remove name="DenyIpAddressModule"/&amp;gt;&lt;br /&gt;  &amp;lt;/httpModules&amp;gt;&lt;br /&gt; &amp;lt;/system.web&amp;gt;&lt;br /&gt; &amp;lt;system.webServer&amp;gt;&lt;br /&gt;  &amp;lt;pages theme=""&amp;gt;&lt;br /&gt;  &amp;lt;modules&amp;gt;&lt;br /&gt;   &amp;lt;remove name="DenyIpAddressModule" /&amp;gt;&lt;br /&gt;  &amp;lt;/modules&amp;gt;&lt;br /&gt; &amp;lt;/system.webServer&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note, that in this example I remove "DenyIpAddressModule" twice.&lt;br /&gt;The reason for that is that I added "DenyIpAddressModule" module to parent web.config twice: once as regular httpmodule, and another time as integrated pipeline module.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-2665746261753297702?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/2665746261753297702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=2665746261753297702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2665746261753297702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2665746261753297702'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2009/04/webconfig-in-iis-70.html' title='web.config in IIS 7.0'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6596258423748203368</id><published>2009-04-01T15:10:00.003-04:00</published><updated>2009-04-01T15:19:04.784-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Maps API'/><title type='text'>Google Maps API team joke</title><content type='html'>Google Maps API rolled out unpleasant joke on April 1st day.&lt;br /&gt;Google Maps javascript stopped working today.&lt;br /&gt;&lt;br /&gt;There is a quick fix available: switching back to older, more carefully tested version.&lt;br /&gt;(from "v=2.x" to "v=2").&lt;br /&gt;&lt;br /&gt;There is a good lesson here: don't use the latest "bleeding edge" version of the code in production environment. Even if it comes from Google.&lt;br /&gt;&lt;br /&gt;Technical details are here:&lt;br /&gt;&lt;a href="http://groups.google.com/group/Google-Maps-API/browse_thread/thread/193fbebd8066f19f/7fecbfed5908d29e"&gt;http://groups.google.com/group/Google-Maps-API/browse_thread/thread/193fbebd8066f19f/7fecbfed5908d29e&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6596258423748203368?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6596258423748203368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6596258423748203368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6596258423748203368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6596258423748203368'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2009/04/google-maps-api-team-joke.html' title='Google Maps API team joke'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-2045851412287664967</id><published>2009-03-03T12:36:00.007-05:00</published><updated>2009-03-03T13:20:34.739-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Serialization'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Serialize and Deserialize objects in .NET</title><content type='html'>I'm not sure why XML standard doesn't allow certain characters to be encoded into XML... and it causes problems.&lt;br /&gt;&lt;br /&gt;This C# code:&lt;pre class="csharpcode"&gt;&lt;br /&gt;            XmlSerializer xs = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T));&lt;br /&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (MemoryStream memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(StringToUTF8ByteArray(objString)))&lt;br /&gt;            {&lt;br /&gt;                obj = xs.Deserialize(memoryStream);&lt;br /&gt;            }&lt;/pre&gt;&lt;br /&gt;crashes with exception:&lt;blockquote&gt;System.InvalidOperationException: There is an error in XML document (1, 50). ---&gt;  System.Xml.XmlException: '', hexadecimal value 0x0C, is an invalid character. Line 1, position 50.&lt;/blockquote&gt;&lt;br /&gt;Here's the fix and the fully working version (note that XmlTextReader is used in between MemoryStream and XmlSerializer:&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: Consolas, "Courier New", Courier, Monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;        [TestMethod()]&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SerializeDeserializeObjectTest()&lt;br /&gt;        {&lt;br /&gt;            SerializeDeserializeObjectTest(&lt;span class="str"&gt;"test"&lt;/span&gt;);&lt;br /&gt;            SerializeDeserializeObjectTest(&lt;span class="str"&gt;"\f"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SerializeDeserializeObjectTest(&lt;span class="kwrd"&gt;string&lt;/span&gt; input)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; serialized = Serializer.SerializeObject(input);&lt;br /&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; deserialized = Serializer.DeserializeObject&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(serialized);&lt;br /&gt;            Assert.AreEqual(input, deserialized, input);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Serializer&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; SerializeObject(Object obj)&lt;br /&gt;        {&lt;br /&gt;            MemoryStream memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;            XmlSerializer xs = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlSerializer(obj.GetType());&lt;br /&gt;            XmlTextWriter xmlTextWriter = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextWriter(memoryStream, Encoding.UTF8);&lt;br /&gt;            xs.Serialize(xmlTextWriter, obj);&lt;br /&gt;            memoryStream = (MemoryStream)xmlTextWriter.BaseStream;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; UTF8ByteArrayToString(memoryStream.ToArray());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; T DeserializeObject&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt; objString)&lt;br /&gt;        {&lt;br /&gt;            Object obj = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;            XmlSerializer xs = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T));&lt;br /&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (MemoryStream memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(StringToUTF8ByteArray(objString)))&lt;br /&gt;            {&lt;br /&gt;                XmlTextReader xtr = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(memoryStream);&lt;br /&gt;                obj = xs.Deserialize(xtr);&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (T)obj;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; UTF8ByteArrayToString(&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] characters)&lt;br /&gt;        {&lt;br /&gt;            UTF8Encoding encoding = &lt;span class="kwrd"&gt;new&lt;/span&gt; UTF8Encoding();&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; encoding.GetString(characters);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] StringToUTF8ByteArray(&lt;span class="kwrd"&gt;string&lt;/span&gt; xmlString)&lt;br /&gt;        {&lt;br /&gt;            UTF8Encoding encoding = &lt;span class="kwrd"&gt;new&lt;/span&gt; UTF8Encoding();&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; encoding.GetBytes(xmlString);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks to Tom Goff for &lt;a href="http://tjoe.wordpress.com/2007/08/23/xml-serialization-sorrows/"&gt;XML Serialization Sorrows&lt;/a&gt; article.&lt;br /&gt;&lt;br /&gt;Thanks to Andrew Gunn for &lt;a href="http://andrewgunn.blogspot.com/2008/06/xml-serialization-in-cnet.html"&gt;XML Serialization in C#&lt;/a&gt; article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-2045851412287664967?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/2045851412287664967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=2045851412287664967' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2045851412287664967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2045851412287664967'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2009/03/serialize-and-deserialize-objects.html' title='Serialize and Deserialize objects in .NET'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-2584014275692336147</id><published>2009-01-09T00:31:00.010-05:00</published><updated>2009-01-09T11:07:33.217-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SqlCacheDependency'/><category scheme='http://www.blogger.com/atom/ns#' term='SqlDependency'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Troubleshooting SqlCacheDependency in SQL Server 2008 and SQL Server 2005</title><content type='html'>"Getting immediate notification from SQL Server when data changes" is a very attractive feature, but unfortunately it's not easy to implement.&lt;br /&gt;(It took me full day to identify and fix all issues...).&lt;br /&gt;&lt;br /&gt;SQL Server Query Notification framework is quite fragile and may not work for multiple reasons.&lt;br /&gt;If you get error messages -- consider youself lucky. Sometimes there will be no error messages, but notifications simply would refuse to work.&lt;br /&gt;&lt;br /&gt;There are two major steps in troubleshooting SqlCacheDependency notifications:&lt;br /&gt;Step 1: Make SqlCacheDependency clean up ASP.NET Cache item.&lt;br /&gt;Step 2: Prevent SqlCacheDependency from cleaning up ASP.NET Cache item when it's inapropriate.&lt;br /&gt;&lt;br /&gt;Both steps are hard, but Step 1 is the hardest.&lt;br /&gt;&lt;br /&gt;I strongly recommend iterative approach: implement the easiest possible solution first, and then make it more advanced one small step at a time. Test every little step.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Business context&lt;/h4&gt;&lt;br /&gt;In this example I use SqlCacheDependency in order to get list of blocked IP addresses on my web site &lt;a href="http://www.postjobfree.com"&gt;PostJobFree.com&lt;/a&gt;.&lt;br /&gt;From time to time I delete bad users and write their IP addresses into BlackListIpAddress table.&lt;br /&gt;&lt;br /&gt;I can retrieve the list of recently blocked IP addresses like that:&lt;blockquote&gt;&lt;br /&gt;CREATE Procedure spGetBlockedIpList&lt;br /&gt; @cutDate datetime&lt;br /&gt;AS&lt;br /&gt;&lt;br /&gt;set nocount on&lt;br /&gt;select IpAddress&lt;br /&gt;from BlackListIpAddress with (nolock)&lt;br /&gt;where (DecisionDate &gt; @cutDate)&lt;br /&gt;group by IpAddress&lt;br /&gt;having count(1) &gt; 1&lt;br /&gt;GO&lt;/blockquote&gt;&lt;br /&gt;When anybody opens web page -- I check if current web page request came from that list of blocked IP addresses.&lt;br /&gt;I created C# function that does that check:&lt;blockquote&gt;public static bool IsBlackListed(string ipAddress)&lt;br /&gt; {&lt;br /&gt; bool cached;&lt;br /&gt; if (GetBlockedIpAddresses(out cached).Contains(ipAddress)) return true;&lt;br /&gt; return false;&lt;br /&gt; }&lt;/blockquote&gt;&lt;br /&gt;Because I run IsBlackListed() on every page, I don't want to run spGetBlockedIpList without need.&lt;br /&gt;So, I keep database results in ASP.NET Cache object and use SqlCacheDependency to clean up Cache object as soon as new IP address is blacklisted in BlackListIpAddress table.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Implementation&lt;/h4&gt;&lt;blockquote&gt;public static List&lt;string&gt; GetBlockedIpAddresses(out bool cached)&lt;br /&gt;{&lt;br /&gt; HttpContext context = HttpContext.Current;&lt;br /&gt; List&lt;string&gt; blockedIPs = (List&lt;string&gt;)context.Cache["BlockedIPAddresses"];&lt;br /&gt; if (blockedIPs == null)&lt;br /&gt; {&lt;br /&gt; SqlCommand cmdDependency = new SqlCommand(@"select IpAddress from dbo.BlackListIpAddress where DecisionDate &gt; @cutDate",&lt;br /&gt; SqlUtilities.GetSqlConnection("PostJobFreeConnectionString"));&lt;br /&gt; SqlUtilities.AddInputParameter(cmdDependency, "@cutDate", DateTime.UtcNow.AddMinutes(-1), SqlDbType.DateTime);&lt;br /&gt; SqlCacheDependency dependency = new SqlCacheDependency(cmdDependency);&lt;br /&gt; SqlUtilities.ExecuteNonQuery(cmdDependency, "PostJobFreeConnectionString");&lt;br /&gt; blockedIPs = LoadBlockedIPsFromDatabase();&lt;br /&gt; // Cache retrieved blockedIPs in ASP.NET Cache object:&lt;br /&gt; context.Cache.Insert("BlockedIPAddresses", blockedIPs, dependency);&lt;br /&gt; cached = false;&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt; cached = true;&lt;br /&gt; }&lt;br /&gt; return blockedIPs;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Note, that almost always blockedIPs will be retrieved from ASP.NET Cache.&lt;br /&gt;But if Cache["BlockedIPAddresses"] is empty -- I execute two SQL queries instead of one query.&lt;br /&gt;&lt;br /&gt;I run simple query "select IpAddress from dbo.BlackListIpAddress where DecisionDate &gt; @cutDate" in order to make SqlCacheDependency work.&lt;br /&gt;I then run more complex query LoadBlockedIPsFromDatabase() (it runs spGetBlockedIpList) in order to get data I need.&lt;br /&gt;spGetBlockedIpList is too complex to work with SqlCacheDependency.&lt;br /&gt;&lt;br /&gt;Simple query is not smart enough to give me the data I need.&lt;br /&gt;&lt;br /&gt;When you debug your own code -- dump more complex query and use only simple one.&lt;br /&gt;Remember -- first step is to make SqlCacheDependency clean up ASP.NET Cache item.&lt;br /&gt;If SqlCacheDependency cleans up your ASP.NET Cache -- you are about 70% done.&lt;br /&gt;&lt;br /&gt;You may even start with even simpler SQL query. For example: "select IpAddress from dbo.BlackListIpAddress". You would polish it later.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Preparations&lt;/h4&gt;&lt;br /&gt;1) Make sure that when your Web Application start, you run SqlDependency.Start().&lt;br /&gt;I do it this way:&lt;blockquote&gt;public sealed class DenyIpAddressModule : IHttpModule&lt;br /&gt;{&lt;br /&gt; void IHttpModule.Init(HttpApplication application)&lt;br /&gt; {&lt;br /&gt; string connectionString = WebConfigurationManager.&lt;br /&gt; ConnectionStrings["PostJobFreeConnectionString"].ConnectionString;&lt;br /&gt; SqlDependency.Start(connectionString);&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;If you forget to do that, you would get "When using SqlDependency without providing an options value, SqlDependency.Start() must be called prior to execution of a command added to the SqlDependency instance." error message.&lt;br /&gt;&lt;br /&gt;2) Enable Service Brocker on your database.&lt;br /&gt;I do it like this in SQL Server Management Studio (SSMS):&lt;blockquote&gt;use PostJobFree;&lt;br /&gt;alter database PostJobFree set ENABLE_BROKER;&lt;/blockquote&gt;&lt;br /&gt;The trick here is to kill all existing connections prior to altering your database.&lt;br /&gt;Use these SQL commands in SSMS:&lt;blockquote&gt;sp_Who2&lt;br /&gt;kill 52 -- or whatever SPID is&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You may check your Service Broker setting like this:&lt;blockquote&gt;use PostJobFree;&lt;br /&gt;select is_broker_enabled from sys.databases where database_id=db_id()&lt;/blockquote&gt;&lt;br /&gt;1 - Enabled; 0 - Disabled (default).&lt;br /&gt;&lt;br /&gt;3) Make sure that permissions in your database are not out of whack. SQL Server 2005 and SQL Server 2008 have unpleasant bug that [almost] silently kills Queue Notifications:&lt;br /&gt;"You cannot run a statement or a module that includes the EXECUTE AS clause after you restore a database in SQL Server 2005" http://support.microsoft.com/kb/913423&lt;br /&gt;&lt;br /&gt;I fixed it by running this command:&lt;blockquote&gt;use PostJobFree&lt;br /&gt;GO&lt;br /&gt;sp_changedbowner [MyServerName\dennis]&lt;/blockquote&gt;&lt;br /&gt;You may check current database settings by this command:&lt;blockquote&gt;sp_helpdb PostJobFree&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Troubleshooting&lt;/h4&gt;&lt;br /&gt;1) If you are still unable to make SqlCacheDependency to invalidate your ASP.NET Cache, I recommend you great article "Using and Monitoring SQL 2005 Query Notification"&lt;br /&gt;&lt;a href="http://www.simple-talk.com/sql/sql-server-2005/using-and-monitoring-sql-2005-query-notification/&lt;br /&gt;"&gt;http://www.simple-talk.com/sql/sql-server-2005/using-and-monitoring-sql-2005-query-notification/&lt;/a&gt;&lt;br /&gt;Sanchan explains how to use SQL Profiler to see what's going on with query notifications.&lt;br /&gt;2) Using Profiler helped me to find the following errors in SQL Profiler:&lt;br /&gt;- An exception occurred while enqueueing a message in the target queue. Error: 33009, State: 2. The database owner SID recorded in the master database differs from the database owner SID recorded in database 'PostJobFree'. You should correct this situation by resetting the owner of database 'PostJobFree' using the ALTER AUTHORIZATION statement.&lt;br /&gt;- Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.&lt;br /&gt;That gave me an idea to run:&lt;blockquote&gt;sp_changedbowner [MyServerName\dennis]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;3) These couple of queries would let you take a look at what active Query Notification Subscriptions you currently have:&lt;blockquote&gt;select * from sys.dm_qn_subscriptions&lt;br /&gt;select * from sys.transmission_queue&lt;/blockquote&gt;&lt;br /&gt;4) I didn't need that step, but while troubleshooting I did it anyway.&lt;br /&gt;Grant these permissions to the user account that runs your web application (it's usually either "aspnet" or "NT AUTHORITY\NETWORK SERVICE").&lt;blockquote&gt;use PostJobFree&lt;br /&gt;GRANT CREATE PROCEDURE TO [MyServerName\aspnet]&lt;br /&gt;GRANT CREATE QUEUE TO [MyServerName\aspnet]&lt;br /&gt;GRANT CREATE SERVICE TO [MyServerName\aspnet]&lt;br /&gt;GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [MyServerName\aspnet]&lt;br /&gt;GRANT SELECT ON OBJECT::dbo.BlackListIpAddress TO [MyServerName\aspnet]&lt;br /&gt;GRANT SELECT ON OBJECT::dbo.T TO [MyServerName\aspnet]&lt;br /&gt;GRANT RECEIVE ON QueryNotificationErrorsQueue TO [MyServerName\aspnet]&lt;br /&gt;ALTER DATABASE PostJobFree SET TRUSTWORTHY ON&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Clean up Cache only when needed&lt;/h4&gt;&lt;br /&gt;I assume that at this point you are done with the hardest part ("Make SqlCacheDependency object clean up Cache").&lt;br /&gt;There is still some work ahead.&lt;br /&gt;For example I noticed that my SqlCacheDependency code when I was playing with it -- always invalidated ASP.NET Cache. It didn't matter if I updated underlying BlackListIpAddress table or not.&lt;br /&gt;By using trial &amp; error approach I found that the problem was caused by using inapropriate version of SQL query.&lt;br /&gt;I found that:&lt;br /&gt;- "group by" doesn't work no matter what.&lt;br /&gt;- "top 10" doesn't work.&lt;br /&gt;- "with (nolock)" hint doesn't work.&lt;br /&gt;- passing @cutDate parameter to the query _does_ work.&lt;br /&gt;&lt;br /&gt;See documentation on SELECT statements that are supported by Query Notification: &lt;a href="http://msdn.microsoft.com/en-us/library/ms181122(SQL.90).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms181122(SQL.90).aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Other useful resources&lt;/h4&gt;&lt;br /&gt;1) More tips about SQL Server Query Notification:&lt;br /&gt;&lt;a href="http://rusanu.com/2006/06/17/the-mysterious-notification/"&gt;http://rusanu.com/2006/06/17/the-mysterious-notification/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) Troubleshooting Query Notifications &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms177469.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms177469.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3) If you are lucky and expect everything to go smooth - use this articles:&lt;br /&gt;&lt;a href="http://davidhayden.com/blog/dave/archive/2006/04/29/2929.aspx"&gt;SqlCacheDependency using ASP.NET 2.0 and SQL Server 2005&lt;/a&gt;&lt;br /&gt;&lt;a href="http://moshiur.wordpress.com/2008/02/18/sql-2005-and-sql2008-enabling-notifications-sql-chache-dependancy-part-i/"&gt;SQL 2005 and SQL2008 Enabling Notifications. SQL Chache Dependancy Part-I&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Keywords:&lt;/b&gt;&lt;br /&gt;ASP.NET 2.0, ASP.NET 3.5, C#&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-2584014275692336147?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/2584014275692336147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=2584014275692336147' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2584014275692336147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2584014275692336147'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2009/01/troubleshooting-sqlcachedependency-in.html' title='Troubleshooting SqlCacheDependency in SQL Server 2008 and SQL Server 2005'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6041347598779179584</id><published>2008-09-24T11:09:00.001-04:00</published><updated>2009-01-10T11:27:17.386-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSRF'/><category scheme='http://www.blogger.com/atom/ns#' term='XSS'/><category scheme='http://www.blogger.com/atom/ns#' term='XSRF'/><title type='text'>Cross Site Scripting and Cross Site Request Forgery</title><content type='html'>Jeff Atwood wrote a good article &lt;a href="http://www.codinghorror.com/blog/archives/001171.html"&gt;explaining the danger of XSRF and XSS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1) I want to confirm that checking UrlReferrer [hoping to prevent XSRF attack] is a waste of time. UrlReferrer can be spoofed by malicious user. Such spoofing can be done by combination of XSS and XSRF attack: injecting javascript into HTML output (XSS) on one web page and producing forged request (XSRF) pointing to another page of the same web site. &lt;br /&gt;Jeff is also correct that legitimate users may have empty UrlReferrer. Rejecting such users is a mistake.&lt;br /&gt;&lt;br /&gt;2) I agree that introducing parameters cuts off the most obvious XSRF attacks.&lt;br /&gt;But if one of your pages is XSS vulnerable (allows javascript injection), then even if you have dynamic parameters to prevent XSRF (on another page), javascript can still read these dynamic parameters and re-submit them, so the request would succeed.&lt;br /&gt;That's how Gmail was hacked -- the hacker used XSS vulnerability on some obscure Google's web site site in order to exploit XSRF vulnerability in Gmail).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6041347598779179584?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6041347598779179584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6041347598779179584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6041347598779179584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6041347598779179584'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2008/09/cross-site-scripting-and-cross-site.html' title='Cross Site Scripting and Cross Site Request Forgery'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-2517826250908989657</id><published>2008-08-25T11:20:00.002-04:00</published><updated>2009-11-11T21:57:49.859-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Select Hints'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Hints'/><category scheme='http://www.blogger.com/atom/ns#' term='with (nolock)'/><category scheme='http://www.blogger.com/atom/ns#' term='nolock'/><title type='text'>Cure for "deadlocked!": learning to use proper SQL hints</title><content type='html'>Jeff Atwood's article &lt;a href="http://www.codinghorror.com/blog/archives/001166.html"&gt;Deadlocked!&lt;/a&gt; made me recall my painful experience with default locking settings in SQL Server.&lt;br /&gt;Default select queries with (readcommitted) just don't work reliably in real life (because they cause deadlocks on regular basis).&lt;br /&gt;&lt;br /&gt;It was hard to ignore scary stuff from SQL theoreticians about "dirty data", but eventually I've learned to  use "with (nolock)" hint for most of my SELECT queries.&lt;br /&gt;That doesn't mean that all queries should be written with nolock, but most of SQL queries should.&lt;br /&gt;Especially if I'm writing web app.&lt;br /&gt;&lt;br /&gt;In some situations I want to be sure that the data is consistent no matter what. In this case I use different locking hints. Which hints to use heavily depends on particular situation.&lt;br /&gt;&lt;br /&gt;It's important to clearly understand what exactly locking does.&lt;br /&gt;The locking model is relatively simple, however most of SQL Server locking tutorials are just terrible.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt; How-To learn SQL Server locking Tutorial&lt;/h4&gt;The best approach to learn about locking is to experiment:&lt;br /&gt;&lt;br /&gt;1) Open three separate windows in SQL Management Studio.&lt;br /&gt;Window One: for lock diagnostic sp_lock&lt;br /&gt;Window Two: for pending transaction with Update/Delete/Insert query.&lt;br /&gt;Window Three: for SELECT statements with different locking hints.&lt;br /&gt;&lt;br /&gt;2) In Window One write and execute:&lt;br /&gt;exec sp_lock&lt;br /&gt;Take a look at the results.&lt;br /&gt;Note what locks are there (these locks are generated by sp_lock itself).&lt;br /&gt;Learn about what these locks mean (Google is your friend).&lt;br /&gt;&lt;br /&gt;3) In Window Two (that's separate connection to SQL server) write and execute:&lt;br /&gt;============&lt;br /&gt;begin transaction&lt;br /&gt;update MyTestTable set MyColumn = 1&lt;br /&gt;-- rollback transaction&lt;br /&gt;============&lt;br /&gt;Note, that "rollback transaction" is commented out, so transaction won't complete.&lt;br /&gt;&lt;br /&gt;4) Return back to Window One and execute sp_lock.&lt;br /&gt;Note what additional locks you see in sp_lock results.&lt;br /&gt;&lt;br /&gt;5) In Window Three execute:&lt;br /&gt;select * from MyTestTable with (updlock)&lt;br /&gt;The query won't complete, because it's locked by pending transaction in Window Two.&lt;br /&gt;&lt;br /&gt;6) Switch to Window Two and cancel transaction by executing "rollback transaction"&lt;br /&gt;Make sure that SELECT transaction in Window Three is completed now.&lt;br /&gt;&lt;br /&gt;7) Try different combinations of locks (readcommitted), (nolock), (updlock), (repeatableread), (serializable), ... in Window Three.&lt;br /&gt;Try other different update/insert/delete statements in Window Two.&lt;br /&gt;&lt;br /&gt;8) Try to use "commit transaction" instead of "rollback transaction" in Window Two and see how it would affect SELECT results in Window Three.&lt;br /&gt;&lt;br /&gt;9) Try to run:&lt;br /&gt;   begin transaction&lt;br /&gt;   select * from MyTestTable with (updlock)&lt;br /&gt;in Window Two and:&lt;br /&gt;   select * from MyTestTable with (serializable)&lt;br /&gt;in Window Three.&lt;br /&gt;&lt;br /&gt;10) Keep monitoring locks using sp_Lock in Window One.&lt;br /&gt;&lt;br /&gt;11) Do free-style experimenting and research problem on Google when you are getting unexpected results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-2517826250908989657?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/2517826250908989657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=2517826250908989657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2517826250908989657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2517826250908989657'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2008/08/cure-for-deadlocked-learning-to-use.html' title='Cure for &quot;deadlocked!&quot;: learning to use proper SQL hints'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-4360675747095831543</id><published>2008-08-02T12:17:00.002-04:00</published><updated>2008-08-03T15:52:08.144-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rackspace Problems'/><category scheme='http://www.blogger.com/atom/ns#' term='Problems with RackSpace'/><title type='text'>RackSpace - are they really the best web hosting?</title><content type='html'>About a month ago I switched from Virtual Private Hosting on webhost4life to dedicated hosting on RackSpace.&lt;br /&gt;It was definitely an improvement, but I'm still dissatisfied. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are painful parts of my experience with RackSpace:&lt;br /&gt;&lt;br /&gt;1) RackSpace wanted me to sign paper contract (WebHost4Life didn't require that). That paperwork took almost a day (several hours of my efforts + some wait time). Sales guy couldn't open several versions of "Microsoft Office Image Writer" that I emailed to him, so I had to resend the document in different format.&lt;br /&gt;&lt;br /&gt;2) It is a little unpleasant to deal with RackSpace sales guys. They forget (or "forget") to answer some of my questions; use some slightly unpleasant pushy sales techniques. Is  it typical for any sales reps, not only RackSpace's sales?&lt;br /&gt;&lt;br /&gt;3) After the contract was signed, it took RackSpace almost 4 days to install the server. I signed the contract Wednesday July 3rd 2008 and was hoping that on Saturday-Sunday night I'll be able to move my web site (www.postjobfree.com) to RackSpace. But RackSpace set up my server only on Monday - not convenient time for me and my users to do the move.&lt;br /&gt;&lt;br /&gt;4) RackSpace promised me that they would help with the migration. They gave some tips, but not all of them were good. For example, they suggested me to shut down my web site for few hours while I will copy my database. Not a good approach for 24/7 service. So, basically I was mostly left on my own with the migration.&lt;br /&gt;Fortunately, I used &lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/27/110061.aspx"&gt;advise of Omar Al Zabir about smooth web hosting migration&lt;/a&gt;&lt;br /&gt;Ironically -- it was Omar's recommendation to use RackSpace for web hosting that made me pick them.&lt;br /&gt;&lt;br /&gt;5) Average response to my ticket requests is about few hours (2-3 may be?). Sometimes ticket response time is shorter; sometimes it's longer (up to a day or even more in some cases). It's an improvement in comparison with WebHost4Life, but is that really the best in hosting industry?&lt;br /&gt;&lt;br /&gt;6) Most of the time responses are good, rarely great, and in some cases responses are incompetent :-(&lt;br /&gt;For example, I asked RackSpace if it would be a good idea to run SMTP server on separate IP address (same physical machine). A RackSpace guy replied that it would be a good idea. So we did the switch. But it turned out that RackSpace cannot monitor ports on another IP addresses (only on primary IP address). So we updated SMTP server settings again to allow listen both IP addresses. That caused SMTP server to use primary IP address to send emails, but at this point smtp.postjobfree.com DNS record was pointing to second IP address, and this caused painful issues with spam filters on some servers. In the end we returned back to using primary IP for SMTP, but went through some pain because of incompetent advice.&lt;br /&gt;&lt;br /&gt;7) RackSpace seems to be not really good in analyzing past problems. They simply ignored my request about digging into this incompetent SMTP advice. Nothing like "sorry, we screwed up and would do this and that to prevent it in the future". Nothing like "sorry, it was misunderstanding and you (me) should do this and that to avoid problems in the future". I would understand if cheap hosting provider would skip such "past failure analysis". But if hosting provider claims "fanatical support" - I expect to do a little better.&lt;br /&gt;Well, may be it happenned because I still didn't have a chance to talk with my account manager. RackSpace doesn't have one for me yet (after being with RackSpace for a month):&lt;br /&gt;&lt;br /&gt;8) Rackspace's ticketing system creates unneeded noise. For example, after I create a ticket on my.rackspace.com, it adds meaningless auto-response to the ticket and sends me notification email. If I update a ticket, I get notification email again. Why would I need notification about ticket updates I made myself? That's distracting.&lt;br /&gt;&lt;br /&gt;9) Maintenance downtime. :-(&lt;br /&gt;I mentioned already that RackSpace considered few hours web site downtime during migration as "ok" practice. That attitude goes toward other maintenance things too. Today they installed hardware firewall on my server. They brought down my server for almost an hour (!). Could anybody explain me why installation of hardware firewall should bring server down for almost an hour? It should be less than a minute downtime, or preferably zero downtime. That was disappointing. I managed to migrate web server from different hosting with no downtime (I copied 4 GB database between WebHost4Life and RackSpace and still managed to avoid downtime) and now trivial installation of hardware firewall caused almost an hour downtime:&lt;br /&gt;&lt;br /&gt;10) The hardware firewall installation caused another issue as well -- my web site was not able to send out emails after the firewall installation. RackSpace didn't notice that, because their SMTP port monitoring didn't catch the issue. We noticed it few hours later and reported in a ticket. We got no reply for couple of hours, so I had to call RackSpace and remind that the issue is still there. They were not very good in pinpointing the issue. They were trying to re-test SMTP server and it worked. So we (at PostJobFree) had to find it out the problem ourselves. The problem was that smtp.postjobfree.com could be pinged from every computer, but not from my server itself, because hardware firewall didn't resolve the request from my server back to the server itself.&lt;br /&gt;RackSpace techies couldn't grasp that for a while even after I pointed them into that direction. Eventually they recommended to update my application and made it use my new 192.168.x.x IP address for sending emails. Imagine that: update and redeploy my application web app to accommodate to hardware changes. And do it in the hurry after(!) hardware firewall is installed.&lt;br /&gt;I suggested better solution: simply add one record to C:\WINDOWS\system32\drivers\etc\hosts:&lt;br /&gt;127.0.0.1       smtp.postjobfree.com&lt;br /&gt;RackSpace techies still cannot grasp that solution and comment on it. Fortunately my solution works so far.&lt;br /&gt;&lt;br /&gt;11) There were few other minor issues, but I think my saga is getting too long already.&lt;br /&gt;&lt;br /&gt;On the bright side:&lt;br /&gt;&lt;br /&gt;1) When my server works (and it usually works) it works really fast. I'm happy with the speed so far. Though I'm not sure if I should attribute it to RackSpace or to dedicated server. With WebHost4Life SQL server was shared with 4 other clients and in the end I was getting 50+ timeouts/day.&lt;br /&gt;&lt;br /&gt;2) Some RackSpace folks taught me some useful stuff, for example about DNS [re-]configuration.&lt;br /&gt;&lt;br /&gt;3) RackSpace is expensive, but it's not THAT expensive. I got my server + SQL Server license + hardware firewall for a little over $600/mo (with 1 year contract)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, what do you think, is it typical to have issues like these with any hosting provider, or there are better hosting providers out there?&lt;br /&gt;&lt;br /&gt;Any other comments?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Update (2008 August 03):&lt;br /&gt;Problems with RackSpace are getting worse.&lt;br /&gt;&lt;br /&gt;RackSpace technician configured my SMTP server as open relay&lt;br /&gt;:-(&lt;br /&gt;&lt;br /&gt;That's how it sounded on the ticket:&lt;br /&gt;"We did find a setting in your SMTP that was set incorrectly, and we corrected that."&lt;br /&gt;&lt;br /&gt;In fact, SMTP server was configured properly and the problem was with DNS configuration. Instead of fixing DNS (after installing Hardware Firewall) RackSpace guys made the problems much worse by turning my SMTP server into spam-machine and enabling prompt access to all spammers through newly installed hardware firewall.&lt;br /&gt;&lt;br /&gt;Crazy stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-4360675747095831543?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/4360675747095831543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=4360675747095831543' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4360675747095831543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4360675747095831543'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2008/08/rackspace-are-they-really-best-web.html' title='RackSpace - are they really the best web hosting?'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-4032295639238538641</id><published>2008-04-03T19:18:00.001-04:00</published><updated>2008-04-08T17:39:57.730-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development business'/><title type='text'>TechCrunch pushes Start-ups to fail</title><content type='html'>If you want to announce your start-up on TechCrunch50 the only thing you need to do is to &lt;s&gt;sell your soul to the Devil&lt;/s&gt; deny your prospective customers access to your web site. Here's the quote: &lt;blockquote&gt;&lt;a href="http://www.techcrunch50.com/2008/the-rules/"&gt;Rules of participation in TechCrunch50&lt;/a&gt;&lt;br /&gt;&lt;i&gt;Until its presentation on stage at the conference, a company will keep its site password protected with limited private access to alpha or beta users for testing purposes.&lt;/i&gt;&lt;/blockquote&gt;That means that you have to decrease your popularity, get less testing and less feedback, get less word of mouth, and ultimately get less revenue.&lt;br /&gt;&lt;br /&gt;On the other hand, your participation in TechCrunch50 would be free.&lt;br /&gt;&lt;br /&gt;Free is good, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-4032295639238538641?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/4032295639238538641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=4032295639238538641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4032295639238538641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4032295639238538641'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2008/04/techcrunch-pushes-start-ups-to-fail.html' title='TechCrunch pushes Start-ups to fail'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-2909554803549564347</id><published>2008-03-26T19:51:00.000-04:00</published><updated>2008-03-26T19:57:33.328-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Encryption'/><title type='text'>Encrypt App.config</title><content type='html'>// Run "Encryption.EncryptConnectionStrings();" in the beginning of your winservice or winforms app.&lt;br /&gt;// You need to add .NET reference to System.configuration.dll&lt;br /&gt;using System.Configuration;&lt;br /&gt;    public static class Encryption&lt;br /&gt;    {&lt;br /&gt;        public static void EncryptConnectionStrings()&lt;br /&gt;        {&lt;br /&gt;            Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);&lt;br /&gt;            ConfigurationSection section = configuration.GetSection("connectionStrings");&lt;br /&gt;            if (!section.SectionInformation.IsProtected)&lt;br /&gt;            {&lt;br /&gt;                section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");&lt;br /&gt;                section.SectionInformation.ForceSave = true;&lt;br /&gt;                configuration.Save(ConfigurationSaveMode.Modified);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static void DecryptConnectionStrings()&lt;br /&gt;        {&lt;br /&gt;            Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);&lt;br /&gt;            ConfigurationSection section = configuration.GetSection("connectionStrings");&lt;br /&gt;            if (section.SectionInformation.IsProtected)&lt;br /&gt;            {&lt;br /&gt;                section.SectionInformation.UnprotectSection();&lt;br /&gt;                section.SectionInformation.ForceSave = true;&lt;br /&gt;                configuration.Save(ConfigurationSaveMode.Modified);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-2909554803549564347?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/2909554803549564347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=2909554803549564347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2909554803549564347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2909554803549564347'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2008/03/encrypt-appconfig.html' title='Encrypt App.config'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-940796673713211242</id><published>2008-03-26T19:48:00.001-04:00</published><updated>2009-01-10T11:43:00.442-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Encryption'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 2.0'/><title type='text'>How to encrypt and decrypt string in .NET application</title><content type='html'>using System;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Security.Cryptography;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace MyCompany.Library&lt;br /&gt;{&lt;br /&gt;    public class Encryption&lt;br /&gt;    {&lt;br /&gt;        public static string EncryptString(string valueToEncrypt)&lt;br /&gt;        {&lt;br /&gt;            return EncryptString(valueToEncrypt, "My password key");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static string DecryptString(string valueToDecrypt)&lt;br /&gt;        {&lt;br /&gt;            return DecryptString(valueToDecrypt, "My password key");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static string EncryptString(string valueToEncrypt, string secretPhrase)&lt;br /&gt;        {&lt;br /&gt;            CryptoStream encryptStream = null;       // Stream used to encrypt&lt;br /&gt;            RijndaelManaged rijndael = null;         // Rijndael provider&lt;br /&gt;            ICryptoTransform rijndaelEncrypt = null; // Encrypting object&lt;br /&gt;            MemoryStream memStream = new MemoryStream(); // Stream to contain data&lt;br /&gt;            byte[] key;&lt;br /&gt;            byte[] IV;&lt;br /&gt;            GenerateKey(secretPhrase, out key, out IV);&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                if( valueToEncrypt.Length &gt; 0 )&lt;br /&gt;                {&lt;br /&gt;                    // Create the crypto objects&lt;br /&gt;                    rijndael = new RijndaelManaged();&lt;br /&gt;                    rijndael.Key = key;&lt;br /&gt;                    rijndael.IV = IV;&lt;br /&gt;                    rijndaelEncrypt = rijndael.CreateEncryptor();&lt;br /&gt;                    encryptStream = new CryptoStream(&lt;br /&gt;                        memStream, rijndaelEncrypt, CryptoStreamMode.Write);&lt;br /&gt;&lt;br /&gt;                    // Write the encrypted value into memory&lt;br /&gt;                    byte[] input = Encoding.UTF8.GetBytes(valueToEncrypt);&lt;br /&gt;                    encryptStream.Write(input, 0, input.Length);&lt;br /&gt;                    encryptStream.FlushFinalBlock();&lt;br /&gt;&lt;br /&gt;                    // Retrieve the encrypted value and return it&lt;br /&gt;                    return Convert.ToBase64String(memStream.ToArray());&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    return "";&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                if (rijndael != null) rijndael.Clear();&lt;br /&gt;                if (rijndaelEncrypt != null) rijndaelEncrypt.Dispose();&lt;br /&gt;                if (memStream != null) memStream.Close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static string DecryptString(string valueToDecrypt, string secretPhrase)&lt;br /&gt;        {&lt;br /&gt;            CryptoStream decryptStream = null;       // Stream used to decrypt&lt;br /&gt;            RijndaelManaged rijndael = null;         // Rijndael provider&lt;br /&gt;            ICryptoTransform rijndaelDecrypt = null; // decrypting object&lt;br /&gt;            MemoryStream memStream = null; // Stream to contain data&lt;br /&gt;            byte[] key;&lt;br /&gt;            byte[] IV;&lt;br /&gt;            GenerateKey(secretPhrase, out key, out IV);&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                if( valueToDecrypt.Length &gt; 0 )&lt;br /&gt;                {&lt;br /&gt;                    // Create the crypto objects&lt;br /&gt;                    rijndael = new RijndaelManaged();&lt;br /&gt;                    rijndael.Key = key;&lt;br /&gt;                    rijndael.IV = IV;&lt;br /&gt;&lt;br /&gt;                    //Now decrypt the previously encrypted message using the decryptor&lt;br /&gt;                    // obtained in the above step.&lt;br /&gt;&lt;br /&gt;                    // Write the encrypted value into memory&lt;br /&gt;                    byte[] encrypted = Convert.FromBase64String(valueToDecrypt);&lt;br /&gt;                    memStream = new MemoryStream(encrypted);&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;                    rijndaelDecrypt = rijndael.CreateDecryptor();&lt;br /&gt;                    decryptStream = new CryptoStream(memStream, rijndaelDecrypt, CryptoStreamMode.Read);&lt;br /&gt;&lt;br /&gt;                    byte[] fromEncrypt = new byte[encrypted.Length];&lt;br /&gt;&lt;br /&gt;                    //Read the data out of the crypto stream.&lt;br /&gt;                    decryptStream.Read(fromEncrypt, 0, fromEncrypt.Length);&lt;br /&gt;&lt;br /&gt;                    // Retrieve the encrypted value and return it&lt;br /&gt;                    string decryptedString = new string(Encoding.UTF8.GetChars(fromEncrypt));&lt;br /&gt;                    return decryptedString.TrimEnd(new char[] {'\0'});&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    return "";&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                if (rijndael != null) rijndael.Clear();&lt;br /&gt;                if (rijndaelDecrypt != null) rijndaelDecrypt.Dispose();&lt;br /&gt;                if (memStream != null) memStream.Close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// Generates an encryption key based on the given phrase.  The &lt;br /&gt;        /// phrase is hashed to create a unique 32 character (256-bit) &lt;br /&gt;        /// value, of which 24 characters (192 bit) are used for the&lt;br /&gt;        /// key and the remaining 8 are used for the initialization vector (IV).&lt;br /&gt;        private static void GenerateKey(string secretPhrase, out byte[] key, out byte[] IV)&lt;br /&gt;        {&lt;br /&gt;            // Initialize internal values&lt;br /&gt;            key = new byte[24];&lt;br /&gt;            IV = new byte[16]; &lt;br /&gt;&lt;br /&gt;            // Perform a hash operation using the phrase.  This will &lt;br /&gt;            // generate a unique 32 character value to be used as the key.&lt;br /&gt;            byte[] bytePhrase = Encoding.ASCII.GetBytes(secretPhrase);&lt;br /&gt;            SHA384Managed sha384 = new SHA384Managed();&lt;br /&gt;            sha384.ComputeHash(bytePhrase);&lt;br /&gt;            byte[] result = sha384.Hash;&lt;br /&gt; &lt;br /&gt;            // Transfer the first 24 characters of the hashed value to the key&lt;br /&gt;            // and the remaining 8 characters to the intialization vector.&lt;br /&gt;            for (int index=0; index&lt;24; index++) key[index] = result[index];&lt;br /&gt;            for (int index=24; index&lt;40; index++) IV[index-24] = result[index];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-940796673713211242?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/940796673713211242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=940796673713211242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/940796673713211242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/940796673713211242'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2008/03/how-to-encrypt-and-decrypt-string-in.html' title='How to encrypt and decrypt string in .NET application'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-2999122333442528546</id><published>2008-03-11T00:00:00.000-04:00</published><updated>2008-03-11T00:46:17.423-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sequential GUID'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2005'/><title type='text'>Generate Sequential GUIDs for SQL Server 2005 in C#</title><content type='html'>&lt;h3&gt;Why generate sequential GUID in C#?&lt;/h3&gt;Originally, uniqueidentifier (GUID) column in SQL Server was not supposed to be sequential. But in my case, having sequential GUID is quite useful.&lt;br /&gt;My application needs to know, what record was inserted first.&lt;br /&gt;&lt;br /&gt;Fortunately, SQL Server 2005 supports "default newsequentialid()" constraint, that makes uniqueidentifier column grow sequentially [with every inserted record].&lt;br /&gt;&lt;br /&gt;That worked quite well for me, until I decided to generate sequential GUID in C#.&lt;br /&gt;(I needed it, because I use SqlBulkCopy and try to save two tables that share the same generated GUID key).&lt;br /&gt;&lt;br /&gt;That turned out to be a tricky task. The reason -- .NET and SQL Server treat GUIDs quite different. In particular, they sort them quite differently.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Searching for solution&lt;/h3&gt;Alberto Ferrari's post &lt;a href="http://sqlblog.com/blogs/alberto_ferrari/archive/2007/08/31/how-are-guids-sorted-by-sql-server.aspx"&gt;How are GUIDs sorted by SQL Server?&lt;/a&gt; gave me a good idea about how to handle the problem.&lt;br /&gt;&lt;br /&gt;I used modified Alberto's SQL code to find out what C#.NET GUID bytes are more [or less] significant from SQL Server 2005 ORDER BY clause perspective.&lt;br /&gt;&lt;span style="font-size:x-small;font-family:Consolas;"&gt;&lt;br /&gt;With UIDs As (&lt;br /&gt;            Select ID =  3, UID = cast ('01000000-0000-0000-0000-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID =  2, UID = cast ('00010000-0000-0000-0000-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID =  1, UID = cast ('00000100-0000-0000-0000-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID =  0, UID = cast ('00000001-0000-0000-0000-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID =  5, UID = cast ('00000000-0100-0000-0000-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID =  4, UID = cast ('00000000-0001-0000-0000-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID =  7, UID = cast ('00000000-0000-0100-0000-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID =  6, UID = cast ('00000000-0000-0001-0000-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID =  8, UID = cast ('00000000-0000-0000-0100-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID = 9, UID = cast ('00000000-0000-0000-0001-000000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID = 10, UID = cast ('00000000-0000-0000-0000-010000000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID = 11, UID = cast ('00000000-0000-0000-0000-000100000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID = 12, UID = cast ('00000000-0000-0000-0000-000001000000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID = 13, UID = cast ('00000000-0000-0000-0000-000000010000' as uniqueidentifier)&lt;br /&gt;    Union   Select ID = 14, UID = cast ('00000000-0000-0000-0000-000000000100' as uniqueidentifier)&lt;br /&gt;    Union   Select ID = 15, UID = cast ('00000000-0000-0000-0000-000000000001' as uniqueidentifier)&lt;br /&gt;)&lt;br /&gt;Select * From UIDs Order By UID&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note, that first line with ID=3 corresponds to:&lt;br /&gt; new Guid(new bytes[16]{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }&lt;br /&gt;That means:&lt;br /&gt;   (new Guid("01000000-0000-0000-0000-000000000000").ToByteArray()[3] == 1)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, when I run modified Alberto's query, I'm getting the following sequence:&lt;br /&gt;3, 2, 1, 0, 5, 4, 7, 6, 9, 8, 15, 14, 13, 12, 11, 10 &lt;br /&gt;&lt;br /&gt;That means, that GUID's byte #3 is the least significant and GUID's byte #10 is the most significant [from SQL Server ORDER BY clause perspective].&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Final solution&lt;/h3&gt;Now we're ready to write C# code, that would sequentially increment any given GUID.&lt;br /&gt;I also made it more convenient to increment GUID, by using "++" operator.&lt;br /&gt;Here's how it's used:&lt;br /&gt;&lt;span style="font-size:small;font-family:Consolas;"&gt;&lt;br /&gt;private void Test()&lt;br /&gt;{&lt;br /&gt;   SequentialGuid = new SequentialGuid(Guid.Empty);&lt;br /&gt;   SequentialGuid++;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and C# code that increments GUIDs sequentially:&lt;br /&gt;&lt;span style="font-size:small;font-family:Consolas;"&gt;&lt;br /&gt;    public class SequentialGuid&lt;br /&gt;    {&lt;br /&gt;        Guid _CurrentGuid;&lt;br /&gt;        public Guid CurrentGuid&lt;br /&gt;        {&lt;br /&gt;            get { return _CurrentGuid; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public SequentialGuid()&lt;br /&gt;        {&lt;br /&gt;            _CurrentGuid = Guid.NewGuid();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public SequentialGuid(Guid previousGuid)&lt;br /&gt;        {&lt;br /&gt;            _CurrentGuid = previousGuid;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static SequentialGuid operator ++(SequentialGuid sequentialGuid)&lt;br /&gt;        {&lt;br /&gt;            byte[] bytes = sequentialGuid._CurrentGuid.ToByteArray();&lt;br /&gt;            for (int mapIndex = 0; mapIndex &lt; 16; mapIndex++)&lt;br /&gt;            {&lt;br /&gt;                int bytesIndex = SqlOrderMap[mapIndex];&lt;br /&gt;                bytes[bytesIndex]++;&lt;br /&gt;                if (bytes[bytesIndex] != 0)&lt;br /&gt;                {&lt;br /&gt;                    break; // No need to increment more significant bytes&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            sequentialGuid._CurrentGuid = new Guid(bytes);&lt;br /&gt;            return sequentialGuid;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static int[] _SqlOrderMap = null;&lt;br /&gt;        private static int[] SqlOrderMap&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                if (_SqlOrderMap == null)&lt;br /&gt;                {&lt;br /&gt;                    _SqlOrderMap = new int[16] { 3, 2, 1, 0, 5, 4, 7, 6, 9, 8, 15, 14, 13, 12, 11, 10 };&lt;br /&gt;                    // 3 - the least significant byte in Guid ByteArray [for SQL Server ORDER BY clause]&lt;br /&gt;                    // 10 - the most significant byte in Guid ByteArray [for SQL Server ORDERY BY clause]&lt;br /&gt;                }&lt;br /&gt;                return _SqlOrderMap;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-2999122333442528546?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/2999122333442528546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=2999122333442528546' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2999122333442528546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/2999122333442528546'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2008/03/generate-sequential-guids-for-sql.html' title='Generate Sequential GUIDs for SQL Server 2005 in C#'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-7029648752938038312</id><published>2008-01-10T19:49:00.000-05:00</published><updated>2008-01-11T17:22:07.145-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio .NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='CLR Stored Procedure'/><title type='text'>SqlBulkCopy in CLR SQL Stored Procedure</title><content type='html'>When I was trying to run SqlBulkCopy in CLR (C#) SQL Stored Procedure, I've got at exception:&lt;blockquote&gt;System.InvalidOperationException: The requested operation is not available on the context connection.&lt;br /&gt;System.InvalidOperationException: &lt;br /&gt;   at System.Data.SqlClient.SqlBulkCopy.CreateOrValidateConnection(String method)&lt;br /&gt;   at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServer(Int32 columnCount)&lt;br /&gt;   at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)&lt;br /&gt;   at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;It seems that it's impossible to run SqlBulkCopy within "context connection" ...&lt;br /&gt;&lt;br /&gt;Here's the only tip I was able to find:&lt;blockquote&gt;&lt;br /&gt;&lt;a href="http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-clr/9/SqlBulkInsert"&gt;http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-clr/9/SqlBulkInsert&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&gt; Does SqlBulkInsert  not run in CLR? Why does not?&lt;br /&gt;&lt;br /&gt;Nope. It (BulkInsert) uses a different provider library if I'm understanding&lt;br /&gt;things correctly.&lt;/blockquote&gt; &lt;br /&gt;Not much ... I guess CLR Stored Procedures work fast enough already...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Batch Update doesn't work in CLR Stored Procedures [on context connection] either.&lt;/h3&gt;&lt;br /&gt;When I tried to execute this code:&lt;blockquote&gt;SqlDataAdapter da = new SqlDataAdapter();&lt;br /&gt;cmd.UpdatedRowSource = UpdateRowSource.None;&lt;br /&gt;da.UpdateCommand = cmd;&lt;br /&gt;da.UpdateBatchSize = 1000;&lt;br /&gt;da.Update(table);&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I got this exception:&lt;blockquote&gt;"Batching updates is not supported on the context connection."&lt;/blockquote&gt; Note the grammar: "... updates IS not supported ..."&lt;br /&gt;&lt;br /&gt;It seems that nobody really cares about batch functionality in CLR SP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What do you think? Please, let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-7029648752938038312?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/7029648752938038312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=7029648752938038312' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/7029648752938038312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/7029648752938038312'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2008/01/sqlbulkcopy-in-clr-sql-stored-procedure.html' title='SqlBulkCopy in CLR SQL Stored Procedure'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6571397909824777999</id><published>2007-12-14T16:46:00.000-05:00</published><updated>2007-12-14T16:47:57.830-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='production'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Error handling'/><title type='text'>Let's count errors</title><content type='html'>Did you count how many mistakes developers of http://www.pepperidgefarm.com/ProductDetail.aspx?catID=730 page made?&lt;br /&gt;I found 4:&lt;br /&gt;1) No custom error page.&lt;br /&gt;2) They compiled and deployed ASP.NET project in Debug mode (had to deploy in Release mode).&lt;br /&gt;3) They didn't set error notification by email and don't look into production error log. That's why this errors is hanging there for so long.&lt;br /&gt;4) ProductDetail.aspx page cannot handle missing item.&lt;br /&gt;&lt;br /&gt;Do they have any excuse for that?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6571397909824777999?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6571397909824777999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6571397909824777999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6571397909824777999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6571397909824777999'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2007/12/lets-count-errors.html' title='Let&apos;s count errors'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-319731586657929205</id><published>2007-08-13T23:19:00.001-04:00</published><updated>2007-08-13T23:28:28.200-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='production'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='Web site'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Web site in production</title><content type='html'>Omar Al Zabir wrote great article about his experience dealing with web site production issues:&lt;br /&gt;&lt;a href="http://www.codeproject.com/install/13disasters.asp"&gt;13 disasters for production web sites and their solutions&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-319731586657929205?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/319731586657929205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=319731586657929205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/319731586657929205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/319731586657929205'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2007/08/web-site-in-production_13.html' title='Web site in production'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6489298777535934961</id><published>2007-08-13T23:19:00.000-04:00</published><updated>2007-08-13T23:24:00.429-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='production'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='Web site security'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Web site in production</title><content type='html'>Omar Al Zabir has great article about his experience dealing with web site production issues:&lt;br /&gt;&lt;a href="http://www.codeproject.com/install/13disasters.asp"&gt;13 disasters for production web sites and their solutions&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6489298777535934961?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6489298777535934961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6489298777535934961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6489298777535934961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6489298777535934961'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2007/08/web-site-in-production.html' title='Web site in production'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-4651710696122374485</id><published>2007-06-09T17:35:00.000-04:00</published><updated>2007-06-09T17:43:45.795-04:00</updated><title type='text'>Why Common Bus projects fail</title><content type='html'>&lt;h3&gt;What is "Common Bus" project?&lt;/h3&gt;"Common Bus" project is such project which does not implement business requirements directly, but helps other projects to implement business requirements.&lt;br /&gt;&lt;br /&gt;Examples of "Common Bus" projects:&lt;br /&gt;1) Programming language.&lt;br /&gt;2) Development environment.&lt;br /&gt;3) Database management system (like Oracle or SQL Server).&lt;br /&gt;4) COM (Component Object Model).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Reasons why Common Bus projects usually fail&lt;/h3&gt;1) Common Bus project is more abstract than regular projects.&lt;br /&gt;More abstract means more complex.&lt;br /&gt;&lt;br /&gt;2) When you design Common Bus project, you must not just understand Common Bus project itself, but also design or all business projects consuming Common Bus project.&lt;br /&gt;&lt;br /&gt;3) It's harder to test abstract  projects, because such projects don't have clear goals.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;What are the goals of Development Environment project?&lt;br /&gt;How would you test it?&lt;br /&gt;&lt;br /&gt;It's hard to come up with test cases for "Common Bus" projects.&lt;br /&gt;&lt;br /&gt;4) Because Common Bus project is hard to understand, development can easily go into wrong direction for months or even years unnoticed. That drains money from the budget and eats time.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Can Common Bus project be successful?&lt;/h3&gt;Implementing "Common bus" projects is possible, but it requires the following:&lt;br /&gt;1) Very bright business analysts.&lt;br /&gt;2) Very strong developers and architects.&lt;br /&gt;3) Very strong testers.&lt;br /&gt;4) Experience with developing similar "Common Bus" projects.&lt;br /&gt;Note, that custom software development is considerably different from "Common Bus" software development.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;I got Common Bus project. What do I do?&lt;/h3&gt;What to do if you are not good enough for "Common Bus" project, but&lt;br /&gt;you have to do it anyway:&lt;br /&gt;1) Simplify business requirements as much as possible.&lt;br /&gt;2) Drop all "Common Bus" / "Abstract" requirements unless they are absolutely vital for your customer.&lt;br /&gt;3) Build clear plan of how you are going to test your project.&lt;br /&gt;Every test case must be easy to understand and test.&lt;br /&gt;If you cannot come up with the set of clear test cases for your project -- that's quite reliable sign that your project is doomed. Find another project and cancel your Common Bus project ASAP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-4651710696122374485?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/4651710696122374485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=4651710696122374485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4651710696122374485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/4651710696122374485'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2007/06/why-common-bus-projects-fail.html' title='Why Common Bus projects fail'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-1123878622788226134</id><published>2007-05-10T23:45:00.000-04:00</published><updated>2007-05-11T00:12:33.603-04:00</updated><title type='text'>Receive and parse email in .NET</title><content type='html'>&lt;h4&gt;How to: Receive email through pop3 and parse mime message into From, To, Subject and Body parts&lt;/h4&gt;This task is not as trivial as it seemed to be.&lt;br /&gt;Reasons:&lt;br /&gt;1) .NET framework does not have classes which handle POP3&lt;br /&gt;2) Email is sent in MIME format, which is quite tricky. In particular, email can have recursive attachments embedded into raw MIME email.&lt;br /&gt;&lt;br /&gt;So far my research recommends two approaches: &lt;br /&gt;&lt;h4&gt;Approach 1: Use an open source project.&lt;/h4&gt;It seems that the best open source MIME project is&lt;br /&gt;&lt;a href="http://www.lumisoft.ee/lsWWW/download/downloads/Net/LumiSoft.Net.zip"&gt;LumiSoft .NET MIME parser&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://www.lumisoft.ee/lsWWW/download/downloads/Net/"&gt;You may browse all content here&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lumisoft.ee/Forum/"&gt;Lumisoft Forum&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lumisoft.ee/lsWWW/download/downloads/Net/Help/html/514b64ce-9d15-7dcf-0ea8-acf46e4e3f26.htm"&gt;Pop3 client retrieval &amp; parsing sample&lt;/a&gt;&lt;br /&gt;using(POP3_Client c = new POP3_Client()){&lt;br /&gt;    c.Connect("ivx",110);&lt;br /&gt;    c.Authenticate("test","test",true);&lt;br /&gt;&lt;br /&gt;    POP3_MessagesInfo mInf = c.GetMessagesInfo();&lt;br /&gt;&lt;br /&gt;    // Get first message if there is any&lt;br /&gt;    if(mInf.Count &gt; 0){&lt;br /&gt;        byte[] messageData = c.GetMessage(mInf[0]);&lt;br /&gt;&lt;br /&gt;        // Parse message&lt;br /&gt;        Mime m = Mime.Parse(messageData);&lt;br /&gt;        string from = m.MainEntity.From;&lt;br /&gt;        string subject = m.MainEntity.Subject;            &lt;br /&gt;        // ... &lt;br /&gt;    }        &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Approach 2: Buy a component&lt;/h4&gt;It seems that the best .NET Mime component available on the market so far is:&lt;br /&gt;&lt;a href="http://www.mime4.net/"&gt;MIME4NET&lt;/a&gt; "True .Net Mime Parser".&lt;br /&gt;The cost: $50&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-1123878622788226134?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/1123878622788226134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=1123878622788226134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/1123878622788226134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/1123878622788226134'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2007/05/receive-and-parse-email-in-net.html' title='Receive and parse email in .NET'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-570729061068069937</id><published>2007-03-06T20:48:00.000-05:00</published><updated>2007-03-06T21:01:06.823-05:00</updated><title type='text'>This report requires a default or user-defined value for the report parameter</title><content type='html'>I just spent couple of hours fighting "This report requires a default or user-defined value for the report parameter" error.&lt;br /&gt;Report worked fine in report designer, but refused to properly render in serverReport.Render(...) method.&lt;br /&gt;&lt;br /&gt;I tried Google Search and all voodoo magic, including:&lt;br /&gt;- Renaming my parameter;&lt;br /&gt;- Set default value for my parameter;&lt;br /&gt;- Restarting VS.NET;&lt;br /&gt;- Re-creating my report from scratch.&lt;br /&gt;Nothing helped.&lt;br /&gt;I even though about manual rebuilding OLAP cube in Analysis Server ... &lt;br /&gt;&lt;br /&gt;But then I simply changed "Available values" [for my parameter] from "From query" to "Non-queried".&lt;br /&gt;&lt;br /&gt;That helped.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;:-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Keywords: VS 2005, VS2005, Visual Studio .NET 2005, OLAP, Microsoft Reporting Services, Microsoft Analysis Services, Microsoft SQL Server 2005, C#, VB.NET.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-570729061068069937?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/570729061068069937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=570729061068069937' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/570729061068069937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/570729061068069937'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2007/03/this-report-requires-default-or-user.html' title='This report requires a default or user-defined value for the report parameter'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-6072217342284535362</id><published>2007-02-23T00:39:00.000-05:00</published><updated>2007-02-23T00:47:24.317-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='hacker attack'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='RegEx'/><category scheme='http://www.blogger.com/atom/ns#' term='XSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Web site security'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Google Desktop can be hacked</title><content type='html'>This very interesting article explains in details how cross site scripting can be used to hack google desktop (if new version of Google desktop in not installed yet):&lt;br /&gt;&lt;a href="http://www.watchfire.com/resources/Overtaking-Google-Desktop.pdf"&gt;Overtaking-Google-Desktop.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This demo shows how potential hacker can operate:&lt;br /&gt;&lt;a href="http://download.watchfire.com/googledesktopdemo/index.htm"&gt;Demonstration of Google Desktop vulnerability&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The article is pretty impressive and made me think about XSS vulnerability of my own &lt;a href="http://www.postjobfree.com"&gt;postjobfree.com&lt;/a&gt; web site.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Keywords: XSS, Web site security, javascript, hacker attack, XSS, RegEx, hack, Google Desktop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-6072217342284535362?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/6072217342284535362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=6072217342284535362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6072217342284535362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/6072217342284535362'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2007/02/google-desktop-can-be-hacked.html' title='Google Desktop can be hacked'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-8557600534903586720</id><published>2007-02-22T19:40:00.000-05:00</published><updated>2007-02-22T19:41:17.789-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development business'/><title type='text'>Geeks Rule and MBAs</title><content type='html'>Eric Sink (SourceGear) recommends to start software company with developers only.&lt;br /&gt;====&lt;br /&gt;&lt;a href="http://software.ericsink.com/bos/Geeks_Rule.html"&gt;Geeks Rule and MBAs Drool&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is common to see software companies starting out with two founders, a geek and an MBA. Do you really need the MBA?&lt;br /&gt;&lt;br /&gt;If I were to oversimplify the message of this article, I would make two statements: &lt;br /&gt;&lt;br /&gt;Developers add more value to a software company than anybody else. &lt;br /&gt;The truth of statement 1 is inversely correlated with the size of the company. &lt;br /&gt;When a company is very small or just getting started, nobody can add value as well as a developer because there isn't really much other stuff that needs to be done. You don't have customers yet.&lt;br /&gt;====&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-8557600534903586720?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/8557600534903586720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=8557600534903586720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/8557600534903586720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/8557600534903586720'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2007/02/geeks-rule-and-mbas.html' title='Geeks Rule and MBAs'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-116974623143916558</id><published>2007-01-25T11:41:00.000-05:00</published><updated>2007-01-25T12:54:54.106-05:00</updated><title type='text'>Health Monitoring in ASP.NET 2.0</title><content type='html'>Health Monitoring in ASP.NET 2.0 helps monitor problems in your application. Here's nice MSDN article about it:&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998306.aspx"&gt;How To: Use Health Monitoring in ASP.NET 2.0&lt;/a&gt;&lt;br /&gt;In particular,&lt;br /&gt;System.Web.Management.SqlWebEventProvider works quite good out of the box.&lt;br /&gt;&lt;br /&gt;Note, that Health Monitoring designed for web forms applications and does not target winforms applications.&lt;br /&gt;For example, if you want logging Windows Services, Log4Net 3rd party component, or through embedded System.Diagnostics.EventLog component are the ways to go.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you want to get error messages from your site through email, read this:&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms227553(vs.80).aspx"&gt;How to: Send E-mail for Health Monitoring Notifications&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note, however, that SimpleMailWebEventProvider has some unpleasant limitations:&lt;br /&gt;1) You cannot send emails using SSL SMTP, so Gmail's SMTP is not available for you. The reason here is that uses standard SMTP ASP.NET provider, and standard SMTP ASP.NET provider is not fully configurable through web.config.&lt;br /&gt;There is no way for you to specify:&lt;br /&gt;smtpClient.EnableSsl = true;&lt;br /&gt;As a result, emails sent through Google's SMTP are simply dissappear.&lt;br /&gt;&lt;br /&gt;2) You cannot override SimpleMailWebEventProvider provider, because it's sealed.&lt;br /&gt;So, you have to write your own mail provider from scratch.&lt;br /&gt;&lt;br /&gt;Implementing your own isn't very hard.&lt;br /&gt;I tried to inherit my EmailEventProvider from MailWebEventProvider, but I couldn't even make the code compile. It seems that MailWebEventProvider if poorly written (yeap, not every developer at MS is good).&lt;br /&gt;&lt;br /&gt;But inheriting from BufferedWebEventProvider worked like a charm.&lt;br /&gt;Here's the C# code:&lt;br /&gt;=======================&lt;br /&gt;using System;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Management;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Collections.Specialized;&lt;br /&gt;&lt;br /&gt;namespace MyNameSpace&lt;br /&gt;{&lt;br /&gt;sealed class EmailEventProvider : BufferedWebEventProvider&lt;br /&gt;{&lt;br /&gt;private string _to;&lt;br /&gt;private string _subject;&lt;br /&gt;&lt;br /&gt;public override void Initialize(string name, NameValueCollection config)&lt;br /&gt;{&lt;br /&gt;GetAndRemoveStringAttribute(config, "to", ref this._to);&lt;br /&gt;GetAndRemoveStringAttribute(config, "subject", ref this._subject);&lt;br /&gt;if (string.IsNullOrEmpty(this._to))&lt;br /&gt;{&lt;br /&gt;throw new ConfigurationErrorsException(string.Format("Recipient must be defined for {0}provider", name));&lt;br /&gt;}&lt;br /&gt;base.Initialize(name, config);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static void GetAndRemoveStringAttribute(NameValueCollection config, string attrib, ref string val)&lt;br /&gt;{&lt;br /&gt;val = config.Get(attrib);&lt;br /&gt;config.Remove(attrib);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public override void ProcessEventFlush(WebEventBufferFlushInfo flushInfo)&lt;br /&gt;{&lt;br /&gt;StringBuilder sb = new StringBuilder();&lt;br /&gt;// Write flushInfo.Events:&lt;br /&gt;foreach (WebBaseEvent wbe in flushInfo.Events)&lt;br /&gt;{&lt;br /&gt;sb.AppendFormat("{0}\r\n", wbe.ToString(true, true));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;SendMail(DateTime.Now.ToString(), _to, _subject, sb.ToString());&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;=======================&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's web.config's code:&lt;br /&gt;----------------&lt;br /&gt;&amp;lt;healthMonitoring enabled="true" heartbeatInterval="0" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;providers&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add name="MyEmailEventProvider" type="MyNameSpace.EmailEventProvider" buffer="false" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; to="xxx@gmail.com" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subject="Crash in MyAspNet app" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/providers&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;rules&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add name="All Errors by Email" eventName="All Errors" provider="MyEmailEventProvider" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/rules&amp;gt;&lt;br /&gt;&amp;lt;/healthMonitoring&amp;gt;&lt;br /&gt;----------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-116974623143916558?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/116974623143916558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=116974623143916558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116974623143916558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116974623143916558'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2007/01/health-monitoring-in-aspnet-20.html' title='Health Monitoring in ASP.NET 2.0'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-116735447494579063</id><published>2006-12-28T20:05:00.000-05:00</published><updated>2006-12-28T20:07:55.930-05:00</updated><title type='text'>Intelligent Job Search</title><content type='html'>&lt;a href="http://www.ijsearch.com"&gt;www.ijsearch.com&lt;/a&gt; allows searching for jobs from several major job portals simultaneously.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-116735447494579063?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/116735447494579063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=116735447494579063' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116735447494579063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116735447494579063'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/12/intelligent-job-search.html' title='Intelligent Job Search'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-116587671256426564</id><published>2006-12-11T17:33:00.000-05:00</published><updated>2006-12-11T17:38:33.063-05:00</updated><title type='text'>ReportViewer Control</title><content type='html'>&lt;a href="http://steveorr.net/articles/ReportViewer.aspx"&gt;Reporting Made Easy&lt;/a&gt; is a nice article about new ReportViewer Control in Visual Studio 2005.&lt;br /&gt;ReportViewer Control allows to create good-looking and robust reports in ASP.NET 2.0.&lt;br /&gt;&lt;br /&gt;Also article discusses relationships between ReportViewer Control and SQL Server 2005 Reporting Services.&lt;br /&gt;&lt;br /&gt;Technologies: ASP.NET 2.0, C#, VB.NET, SQL Server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-116587671256426564?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/116587671256426564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=116587671256426564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116587671256426564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116587671256426564'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/12/reportviewer-control.html' title='ReportViewer Control'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-116405985490546339</id><published>2006-11-20T16:57:00.000-05:00</published><updated>2006-11-20T16:57:35.126-05:00</updated><title type='text'>Scott Guthrie on history of ASP.NET</title><content type='html'>&lt;a href="http://www.skyscrapr.net/blogs/arcasts/default.aspx?ID=418"&gt;ARCast - Scott Guthrie - the man, the myth, the legend&lt;/a&gt;&lt;br /&gt;Scott Guthrie talks about history of developing ASP.NET, importance of prototyping, and more...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-116405985490546339?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/116405985490546339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=116405985490546339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116405985490546339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116405985490546339'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/11/scott-guthrie-on-history-of-aspnet.html' title='Scott Guthrie on history of ASP.NET'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-116294746448015547</id><published>2006-11-07T19:57:00.000-05:00</published><updated>2006-11-07T19:57:45.590-05:00</updated><title type='text'>Inside the ASP.NET user profile mechanism</title><content type='html'>This is nice article about handling user's profile in ASP.NET 2.0:&lt;br /&gt;&lt;a href="http://www.vsj.co.uk/articles/display.asp?id=572"&gt;Inside the ASP.NET user profile mechanism&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The article explains:&lt;br /&gt;- How to enable profile functionality in ASP.NET 2.0 application.&lt;br /&gt;- How to deal with anonymous profile (anonymousIdentification), and migrate anonymous settings to registered user.&lt;br /&gt;- How to handle Role-based profiles.&lt;br /&gt;And more.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Keywords: C#, ASP.NET 2.0, VB.NET 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-116294746448015547?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/116294746448015547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=116294746448015547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116294746448015547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116294746448015547'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/11/inside-aspnet-user-profile-mechanism.html' title='Inside the ASP.NET user profile mechanism'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-116139163654226554</id><published>2006-10-20T20:45:00.000-04:00</published><updated>2006-10-20T20:47:16.813-04:00</updated><title type='text'>ASP.NET 2.0 Remote debugging</title><content type='html'>&lt;a href="http://support.microsoft.com/kb/910448"&gt;How to implement remote debugging in Visual Studio 2005&lt;/a&gt;&lt;br /&gt;Remote debugging setup is greatly simplified in Visual Studio 2005. Although the DEBUG verb is still sent to the Web site to ensure that the remote process is running, all remote debugging scenarios except T-SQL debugging use the Remote Debugging Monitor (Msvsmon.exe). &lt;br /&gt;&lt;br /&gt;Keywords: VB.NET, C#.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-116139163654226554?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/116139163654226554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=116139163654226554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116139163654226554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116139163654226554'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/10/aspnet-20-remote-debugging.html' title='ASP.NET 2.0 Remote debugging'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-116118862500653964</id><published>2006-10-18T12:12:00.000-04:00</published><updated>2006-10-18T12:23:45.663-04:00</updated><title type='text'>Visual Studio for Database Professionals</title><content type='html'>Scott Guthrie announces&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2006/10/18/Visual-Studio-for-Database-Professionals-and-other-Cool-Data-Management-Tools-for-.NET.aspx"&gt;Visual Studio for Database Professionals and other Cool Data Management Tools for .NET&lt;/a&gt;&lt;br /&gt;"VS for Database Professionals has been getting rave reviews, and includes support for database refactorings, schema and data comparisons, database unit testing, and automated data generation."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-116118862500653964?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/116118862500653964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=116118862500653964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116118862500653964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116118862500653964'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/10/visual-studio-for-database.html' title='Visual Studio for Database Professionals'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-116118793904297961</id><published>2006-10-18T12:05:00.000-04:00</published><updated>2006-10-18T12:12:23.573-04:00</updated><title type='text'>Visual Studio .NET 2005 automatization script</title><content type='html'>Scott Allen explains how to &lt;a href="http://codebetter.com/blogs/eric.wise/archive/2006/10/10/Codebetter-does-job-searches-better_2100_.aspx"&gt;automate SiteMap generation&lt;/a&gt; by VB script macro.&lt;br /&gt;&lt;br /&gt;Technologies: ASP.NET 2.0, C#.NET, VB.NET, Web Site Map.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-116118793904297961?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/116118793904297961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=116118793904297961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116118793904297961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116118793904297961'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/10/visual-studio-net-2005-automatization.html' title='Visual Studio .NET 2005 automatization script'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-116070014135817644</id><published>2006-10-12T20:42:00.000-04:00</published><updated>2006-10-12T20:47:18.953-04:00</updated><title type='text'>Beware of HtmlEncode in GridView DataBound fields</title><content type='html'>I tried to use asp:BoundField DataFormatString="{0:d}" in asp:GridView for displaying date in short format.&lt;br /&gt;Unfortunately it didn't work - I still was getting long date format, completely disregarding DataFormatString property value.&lt;br /&gt;&lt;br /&gt;After some googling I found out that HtmlEncode needs to be set to false, in order to allow DataFormatString property work.&lt;br /&gt;&lt;br /&gt;Read this&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.boundfield.dataformatstring.aspx"&gt;MSDN HtmlEncode note&lt;/a&gt;:&lt;br /&gt;"When the HtmlEncode property is true, the value of the field is HTML encoded to its string representation before the formatting string is applied. For some objects, such as dates, you might want to control how the object is displayed with a formatting string. In those cases, you must set the HtmlEncode property to false."&lt;br /&gt;&lt;br /&gt;Technologies: ASP.NET 2.0 ASP.NET 2005 C# VB.NET GridView control DataBound field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-116070014135817644?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/116070014135817644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=116070014135817644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116070014135817644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/116070014135817644'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/10/beware-of-htmlencode-in-gridview.html' title='Beware of HtmlEncode in GridView DataBound fields'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115997691550619624</id><published>2006-10-04T11:48:00.000-04:00</published><updated>2006-10-04T11:48:36.173-04:00</updated><title type='text'>Concurrency problem with auto-binding GridView</title><content type='html'>I always was suspicious about using ObjectDataSource as data source for ASP.NET 2.0 controls. It saves you some C# (or VB.NET) coding, but adds lots of automatically generated ASPX stuff, which is hard to maintain. Plus flexibility of the code is just not there.&lt;br /&gt;&lt;br /&gt;Now I have another good reason not to use ObjectDataSource and automatic binding, because such approach has serious concurrency issues.&lt;br /&gt;Basically if two users are using the same page simultaneously, they could delete rows which they didn’t intend to delete.&lt;br /&gt;&lt;br /&gt;This ugly bug caused by the fact that datagrid is trying to delete rows based on row index, not based on row ID.&lt;br /&gt;Read more details about the issue in: &lt;a href="http://forums.asp.net/thread/1401397.aspx"&gt;Concurrency issues with GridView&lt;/a&gt; by jdcrutchley.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://feeds.feedburner.com/~r/ScottOnWriting/~3/31884698/10054.aspx"&gt;Scott Mitchell provides a workaround (hack)&lt;/a&gt; to this problem, so you still can use ObjectDataSource. However the need of using hacks just kills the whole idea of using ObjecDataSource with automatic GridView binding. The advantage was to make coding easier. Now the coding with ObjecDataSource is getting more complex than straitforward approach which I like to use: &lt;br /&gt;============&lt;br /&gt;&amp;lt;asp:GridView ID="gridView" runat="server" AutoGenerateColumns="false"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Columns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:TemplateField HeaderText="Delete"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:LinkButton ID="Delete" runat="server" Text="Delete" OnCommand=" Delete_Command" CommandArgument='&amp;lt;%# Eval("RowId") /%&amp;gt;' /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;protected void Page_PreRender(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;gridView.DataSource = MyBusinessClass.GetMyData();&lt;br /&gt;&amp;nbsp;&amp;nbsp;gridView.DataBind;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void Delete_Command(object sender, CommandEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;int rowId = int.Parse(e.CommandArgument);&lt;br /&gt;&amp;nbsp;&amp;nbsp;MyBusinessClass.DeleteRow(rowId);&lt;br /&gt;}&lt;br /&gt;============&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115997691550619624?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115997691550619624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115997691550619624' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115997691550619624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115997691550619624'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/10/concurrency-problem-with-auto-binding.html' title='Concurrency problem with auto-binding GridView'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115871995013244181</id><published>2006-09-19T22:39:00.000-04:00</published><updated>2006-09-19T22:39:10.710-04:00</updated><title type='text'>Microsoft "Atlas" Control Toolkit</title><content type='html'>&lt;a href="http://atlas.asp.net/atlastoolkit/"&gt;Microsoft "Atlas" Control Toolkit&lt;/a&gt;&lt;br /&gt;That's a nice Atlas (Microsoft AJAX) demo.&lt;br /&gt;&lt;br /&gt;Though I still prefer to delay starting using it, because Atlas isn't reliable solution yet.&lt;br /&gt;Chances are that Atlas wouldn't work nice with IE7 :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Keywords: ASP.NET C# VB.NET Web UI&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115871995013244181?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115871995013244181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115871995013244181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115871995013244181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115871995013244181'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/09/microsoft-atlas-control-toolkit.html' title='Microsoft &quot;Atlas&quot; Control Toolkit'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115657256053902698</id><published>2006-08-26T02:03:00.000-04:00</published><updated>2006-08-26T02:09:36.553-04:00</updated><title type='text'>CSAML: C# Application Markup Language</title><content type='html'>Enjoy this comparison of C# and XML as a programming language&lt;br /&gt;---&lt;br /&gt;&lt;a href="http://www.charlespetzold.com/etc/CSAML.html"&gt;C# Application Markup Language (CSAML): An Evolutionary Leap&lt;/a&gt; by Charles Petzold&lt;br /&gt;Several weeks ago, Microsoft Corporation began a limited circulation of a specification and beta compiler for the new C# Application Markup Language or CSAML (sometimes pronounced "scammel"), and I’m pleased to say I find it fascinating. This merging of C# and XML is an important evolutionary leap for both standards, and represents a profound advance in the Xmlization of all textual data. &lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;:-)&lt;br /&gt;&lt;br /&gt;Keywords:&lt;br /&gt;Microsoft C# XML joke parody&lt;br /&gt;XML as Declarative programming language&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115657256053902698?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115657256053902698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115657256053902698' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115657256053902698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115657256053902698'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/08/csaml-c-application-markup-language.html' title='CSAML: C# Application Markup Language'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115654434956637667</id><published>2006-08-25T18:15:00.000-04:00</published><updated>2006-08-25T18:19:09.693-04:00</updated><title type='text'>Log4Net for ASP.NET 2.0</title><content type='html'>This article might help to setup Log4Net in ASP.NET application:&lt;br /&gt;&lt;a href="http://developer.coreweb.com/articles/Default7.aspx"&gt;Log4Net: The Definitive(?) How-To for Those Who Have Already Experienced Some Degree of Frustration Trying to Set It Up the First-Time Around&lt;/a&gt; by Chad Finsterwald.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115654434956637667?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115654434956637667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115654434956637667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115654434956637667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115654434956637667'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/08/log4net-for-aspnet-20.html' title='Log4Net for ASP.NET 2.0'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115654344175802904</id><published>2006-08-25T17:48:00.000-04:00</published><updated>2006-08-25T18:04:02.236-04:00</updated><title type='text'>Learning from Catastrophic Database Design Failures</title><content type='html'>Great presentation about database design by Kevin Loney:&lt;br /&gt;&lt;a href="http://www.voug.org/handouts/Controlled_Flights_Loney.pdf"&gt;Learning from Catastrophic Database Design Failures&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- There is no such thing as a harmless logical read.&lt;br /&gt;- Tune the application, not the statistics.&lt;br /&gt;- Time spent testing is never wasted.&lt;br /&gt;- Most application performance problems are the result of deliberate design choices.&lt;br /&gt;- "No production database will run in Third Normal Form."&lt;br /&gt;The data must ultimately be stored in a format that is as close as possible to the users’ needs. You must never place data normalization above the business needs. &lt;br /&gt;- Avoid active use of remote data.&lt;br /&gt;&lt;br /&gt;Seriously evaluate the impact of design changes.&lt;br /&gt;Test rigorously.&lt;br /&gt;And ask for directions – but be careful whom you ask...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115654344175802904?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115654344175802904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115654344175802904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115654344175802904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115654344175802904'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/08/learning-from-catastrophic-database.html' title='Learning from Catastrophic Database Design Failures'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115586150585198254</id><published>2006-08-17T20:38:00.000-04:00</published><updated>2006-08-23T17:48:39.560-04:00</updated><title type='text'>VSS 2005 over Internet and VS.NET 2005 over HTTP</title><content type='html'>Ufff... that was a challenge: I tried to setup VSS database on Internet server and connect my machine over Internet.&lt;br /&gt;&lt;br /&gt;The mistake was to try to connect from my DEV machine to //Server/VSS share directly.&lt;br /&gt;Such solution doesn't fly: it's painfully slow and insecure.&lt;br /&gt;&lt;br /&gt;Right approach is to properly setup VSS over HTTP.&lt;br /&gt;&lt;br /&gt;Start with Alin Constantin's article:&lt;br /&gt;&lt;a href="http://alinconstantin.homeip.net/webdocs/scc/vss_internet.htm"&gt;Installing and configuring Microsoft Visual SourceSafe for Internet (Remote) access&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But Alin's article There are still few tricks.&lt;br /&gt;For example, my server (which I use for hostin VSS database) has multiple web sites (and multiple IP-addresses) associated with the server, so as a result I had to manually create VssUpload_db1 and VssDownload_db1 virtual folders.&lt;br /&gt;(VSS admin creates these folder in Default web site, which doesn't work in my "multiple web sites" case.)&lt;br /&gt;See:&lt;br /&gt;&lt;a href="https://forums.microsoft.com/msdn/showpost.aspx?postid=11584&amp;siteid=1"&gt;There was a failure uploading the URL&lt;/a&gt; topic.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another problem was about language mismatch between client and server VSS on different machines.&lt;br /&gt;I was getting error: "The current source control operation cannot be completed.&lt;br /&gt;&lt;br /&gt;The Visual SourceSafe Web Service returned the following error:&lt;br /&gt;"The SourceSafe Web service was unable to process your request. &lt;br /&gt;The selected language for non-Unicode programs in your computer does not match the one selected on the server."&lt;br /&gt;&lt;br /&gt;This problem was discussed here:&lt;br /&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=511944&amp;SiteID=1"&gt;Visual Studio Source Control and SourceSafe - selected language for non-Unicode programs&lt;/a&gt;&lt;br /&gt;In my case I had to setup English as default language on my DEV (VSS client) machine. That's not good, but at least it works.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately &lt;a href="http://groups.google.com/group/microsoft.public.vstudio.sourcesafe/msg/ce15b863e52fcac1"&gt;"View History" functionality doesn't work in VS.NET with Internet plug-in&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Keywords:&lt;br /&gt;VSS 2005 over HTTP&lt;br /&gt;VS.NET 2005&lt;br /&gt;Visual Source Safe 2005&lt;br /&gt;Visual Studio .NET 2005&lt;br /&gt;C#.NET, VB.NET&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115586150585198254?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115586150585198254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115586150585198254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115586150585198254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115586150585198254'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/08/vss-2005-over-internet-and-vsnet-2005.html' title='VSS 2005 over Internet and VS.NET 2005 over HTTP'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115470951388478093</id><published>2006-08-04T12:35:00.000-04:00</published><updated>2006-08-04T12:38:34.903-04:00</updated><title type='text'>Best practises for ASP.NET web sites developers</title><content type='html'>Good article by Jeff Prosise explaining typical ASP.NET development pitfals:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/07/webappfollies/default.aspx"&gt;Keep Sites Running Smoothly By Avoiding These 10 Common ASP.NET Pitfalls&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's the bottom line from the article:&lt;br /&gt;- Does your app use LoadControl to load user controls dynamically? If so, make sure this is done in such a way that LoadControl will work both with and without output caching. &lt;br /&gt;- Are you using kernel-mode output caching and session state in the same page? If so, remove the OutputCache directive to avoid caching that page or turn kernel-mode output caching off for the entire app. &lt;br /&gt;- Are you calling FormsAuthentication.RedirectFromLoginPage in your ASP.NET 1.x-based app? If so, either change the second parameter to false or modify the Expires property of outgoing persistent forms authentication cookies to a more appropriate timeout. &lt;br /&gt;- Do any of your pages generate inordinate amounts of view state? If so, turn off view state for individual controls or keep it on the server. &lt;br /&gt;- Does your app use SQL Server session state? If so, make sure you disable sessions in pages that don’t use sessions. &lt;br /&gt;- Does your app use the ASP.NET 2.0 role manager? If so, enable role caching to increase performance. &lt;br /&gt;- Does your app use custom data types as profile properties? If so, you'll avoid problems by creating custom data types that are compatible with XML serialization or by attributing the types as serializable and using the binary serializer to serialize and deserialize types. &lt;br /&gt;- Does your app do database queries that take a long time to return? If so, consider whether the pages are candidates for becoming asynchronous. &lt;br /&gt;- Does your ASP.NET app use client impersonation? If so, simple authentication in ASP.NET might enforce ACL-based permissions with less hassle. &lt;br /&gt;- Have you profiled your app’s database activity? Examining communication between the app and database is a good first performance-tuning step.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115470951388478093?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115470951388478093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115470951388478093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115470951388478093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115470951388478093'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/08/best-practises-for-aspnet-web-sites.html' title='Best practises for ASP.NET web sites developers'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115448364447210986</id><published>2006-08-01T21:37:00.000-04:00</published><updated>2006-08-01T21:54:04.840-04:00</updated><title type='text'>Multiline HTML buttons</title><content type='html'>Here's HTML code to Multiline caption buttons:&lt;br /&gt;====&lt;br /&gt;&amp;nbsp;&amp;lt;button&amp;gt;multiline&amp;lt;br&amp;gt;button&amp;lt;br&amp;gt;text&amp;lt;/button&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type="button" value="Carriage&amp;amp;#13;&amp;amp;#10;return&amp;amp;#13;&amp;amp;#10;separators" style="text-align:center;"&amp;gt;&lt;br /&gt;====&lt;br /&gt;&lt;br /&gt;Actual buttons:&lt;br /&gt;&lt;button&gt;multiline&lt;br&gt;button&lt;br&gt;text&lt;/button&gt;&lt;br /&gt;&lt;input type="button" value="Carriage&amp;#13;&amp;#10;return&amp;#13;&amp;#10;separators" style="text-align:center;"&gt;&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;Keywords: HTML DHTML Multi-line Multy line button caption. Web Forms. IE Internet explorer FireFox Opera&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115448364447210986?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115448364447210986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115448364447210986' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115448364447210986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115448364447210986'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/08/multiline-html-buttons.html' title='Multiline HTML buttons'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115447265260161648</id><published>2006-08-01T18:48:00.000-04:00</published><updated>2006-08-01T18:50:53.106-04:00</updated><title type='text'>Reorder multiple &lt;select&gt; fields in a web page</title><content type='html'>Nice article about reordering listbox fields.&lt;br /&gt;User can move one or several fields at once. User can use buttons or mouse wheel.&lt;br /&gt;&lt;a href="http://www.codeproject.com/jscript/iliasorter.asp?df=100"&gt;Reorder multiple &amp;lt;select&amp;gt; fields in a web page - JavaScript&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Keywords: select options reorder postback javascript jscript asp asp.net perl&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115447265260161648?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115447265260161648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115447265260161648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115447265260161648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115447265260161648'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/08/reorder-multiple-fields-in-web-page.html' title='Reorder multiple &amp;lt;select&amp;gt; fields in a web page'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115214880791522061</id><published>2006-07-05T21:17:00.000-04:00</published><updated>2006-07-09T12:50:33.646-04:00</updated><title type='text'>Exception handling</title><content type='html'>This is great article by Karl Seguin about proper exception handling:&lt;br /&gt;&lt;a href="http://codebetter.com/blogs/karlseguin/archive/2006/04/05/142355.aspx"&gt;Understanding and Using Exceptions&lt;/a&gt;&lt;br /&gt;Here are the key points:&lt;br /&gt;- Don't catch exceptions unless you can actually handle them&lt;br /&gt;- Do know how to rethrow exceptions properly&lt;br /&gt;- Do use using or try/finally often&lt;br /&gt;- Don't swallow exceptions&lt;br /&gt;- Do use a global handler to help you log and display a friendly error message&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;a href="http://musingmarc.blogspot.com/2005/09/exception-handling-in-net-some-general.html"&gt;Exception handling in .Net (some general guidelines)&lt;/a&gt; by Marc Brooks.&lt;br /&gt;---&lt;br /&gt;Keywords: ASP.NET 2.0, C#, VB.NET&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115214880791522061?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115214880791522061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115214880791522061' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115214880791522061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115214880791522061'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/07/exception-handling.html' title='Exception handling'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115214421743605392</id><published>2006-07-05T20:03:00.000-04:00</published><updated>2006-07-05T20:03:37.513-04:00</updated><title type='text'></title><content type='html'>Q: How could I quickly pass array from business layer (e.g. ASP.NET 2.0) to MS SQL Server 2005?&lt;br /&gt;&lt;br /&gt;A: Pass XML to Stored Procedure.&lt;br /&gt;&lt;a href="http://codebetter.com/blogs/karlseguin/archive/2006/05/08/144263.aspx"&gt;SQL Server - No Arrays? No Problem!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1) Prepare XML string like this:&lt;br /&gt;&amp;lt;data&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;meta&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;key&amp;gt;Key1&amp;lt;/key&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;Value1&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/meta&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;meta&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;key&amp;gt;Key2&amp;lt;/key&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;Value2&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/meta&amp;gt;&lt;br /&gt;&amp;lt;/data&amp;gt;&lt;br /&gt;2) Pass it to Stored Procedure:&lt;br /&gt;command.Parameters.Add("@Tags", SqlDbType.Xml).Value = NameValueToXml(post.Tags)&lt;br /&gt;3) Stored Procedure:&lt;br /&gt;CREATE PROCEDURE SavePost&lt;br /&gt;(&lt;br /&gt;  ...&lt;br /&gt;  @Tags XML&lt;br /&gt;)&lt;br /&gt;AS&lt;br /&gt;   ...&lt;br /&gt;   INSERT INTO Xxx&lt;br /&gt;      SELECT ItemData.row.value('key[1]', 'varchar(200)'),&lt;br /&gt;             ItemData.row.value('value[1]', 'varchar(200)')&lt;br /&gt;         FROM @Tags.nodes('/data/meta') ItemData(row)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115214421743605392?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115214421743605392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115214421743605392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115214421743605392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115214421743605392'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/07/q-how-could-i-quickly-pass-array-from_05.html' title=''/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115214416480058785</id><published>2006-07-05T19:54:00.000-04:00</published><updated>2006-07-05T20:02:45.073-04:00</updated><title type='text'></title><content type='html'>Q: How could I quickly pass array from business layer (e.g. ASP.NET 2.0) to MS SQL Server 2005?&lt;br /&gt;&lt;a href="http://codebetter.com/blogs/karlseguin/archive/2006/05/08/144263.aspx"&gt;SQL Server - No Arrays? No Problem!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1) Prepare XML string like this:&lt;br /&gt;&amp;lt;data&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;meta&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;key&amp;gt;Key1&amp;lt;/key&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;Value1&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/meta&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;meta&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;key&amp;gt;Key2&amp;lt;/key&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;Value2&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/meta&amp;gt;&lt;br /&gt;&amp;lt;/data&amp;gt;&lt;br /&gt;2) Pass it to Stored Procedure:&lt;br /&gt;command.Parameters.Add("@Tags", SqlDbType.Xml).Value = NameValueToXml(post.Tags)&lt;br /&gt;3) Stored Procedure:&lt;br /&gt;CREATE PROCEDURE SavePost&lt;br /&gt;(&lt;br /&gt;  ...&lt;br /&gt;  @Tags XML&lt;br /&gt;)&lt;br /&gt;AS&lt;br /&gt;   ...&lt;br /&gt;   INSERT INTO Xxx&lt;br /&gt;      SELECT ItemData.row.value('key[1]', 'varchar(200)'),&lt;br /&gt;             ItemData.row.value('value[1]', 'varchar(200)')&lt;br /&gt;         FROM @Tags.nodes('/data/meta') ItemData(row)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115214416480058785?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115214416480058785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115214416480058785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115214416480058785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115214416480058785'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/07/q-how-could-i-quickly-pass-array-from.html' title=''/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115214041597802705</id><published>2006-07-05T19:00:00.000-04:00</published><updated>2006-07-05T19:00:16.856-04:00</updated><title type='text'>ASP.NET 2.0 Global Event handling: HttpModules</title><content type='html'>&lt;a href="http://codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx#147100"&gt;Global.asax? Use HttpModules Instead!&lt;/a&gt; by Karl Seguin&lt;br /&gt;&lt;br /&gt;namespace Fuel.Web&lt;br /&gt;{&lt;br /&gt; public class ErrorModule : IHttpModule&lt;br /&gt; .....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Web.config:&lt;br /&gt;&amp;lt;httpModules&amp;gt;&lt;br /&gt; &amp;lt;add  name="ErrorModule" type="Fuel.Web.ErrorModule, Fuel.Web" /&amp;gt;&lt;br /&gt;&amp;lt;/httpModules&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115214041597802705?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115214041597802705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115214041597802705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115214041597802705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115214041597802705'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/07/aspnet-20-global-event-handling.html' title='ASP.NET 2.0 Global Event handling: HttpModules'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115142795055623248</id><published>2006-06-27T13:04:00.000-04:00</published><updated>2006-06-27T13:06:04.110-04:00</updated><title type='text'>Text Legibility: Using 120 DPI Fonts on High Resolution Displays</title><content type='html'>You have high-resolution monitor and hate this small fonts? This article will help you:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/tonyschr/archive/2004/03/23/94391.aspx"&gt;Using 120 DPI Fonts on High Resolution Displays&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115142795055623248?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115142795055623248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115142795055623248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115142795055623248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115142795055623248'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/06/text-legibility-using-120-dpi-fonts-on.html' title='Text Legibility: Using 120 DPI Fonts on High Resolution Displays'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115142386143835471</id><published>2006-06-27T11:57:00.000-04:00</published><updated>2006-06-27T11:57:41.686-04:00</updated><title type='text'>Interactive design: Fitts law</title><content type='html'>This great and fun-to-read article explains fundamental law of interactive UI design.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.asktog.com/columns/022DesignedToGiveFitts.html"&gt;A Quiz designed to Give You Fitts&lt;/a&gt;&lt;br /&gt;"Fitts' Law: The time to acquire a target is a function of the distance to and size of the target."&lt;br /&gt;.....&lt;br /&gt;"Microsofts general cluelessness has never been so amply displayed, however, as it is in Microsoft Visual Studio, which has a menu bar at the top of the screen with a one-pixel barrier between the screentop and the menu. Talk about snatching defeat from the jaws of victory."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115142386143835471?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115142386143835471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115142386143835471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115142386143835471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115142386143835471'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/06/interactive-design-fitts-law_27.html' title='Interactive design: Fitts law'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115142374861188771</id><published>2006-06-27T11:51:00.000-04:00</published><updated>2006-06-27T11:55:49.050-04:00</updated><title type='text'>Interactive design: Fitts law</title><content type='html'>This great and fun-to-read article explains fundamental law of interactive UI design.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.asktog.com/columns/022DesignedToGiveFitts.html"&gt;A Quiz designed to Give You Fitts&lt;/a&gt;&lt;br /&gt;"Fitts' Law: The time to acquire a target is a function of the distance to and size of the target."&lt;br /&gt;.....&lt;br /&gt;"Microsofts general cluelessness has never been so amply displayed, however, as it is in Microsoft Visual Studio, which has a menu bar at the top of the screen with a one-pixel barrier between the screentop and the menu. Talk about snatching defeat from the jaws of victory."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115142374861188771?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115142374861188771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115142374861188771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115142374861188771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115142374861188771'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/06/interactive-design-fitts-law.html' title='Interactive design: Fitts law'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-115082253572244593</id><published>2006-06-20T12:44:00.000-04:00</published><updated>2006-06-20T12:55:38.456-04:00</updated><title type='text'>ASP.NET 2.0 Web site compilation and deployment options</title><content type='html'>Good article about ASP.NET 2.0 web site deployment options: both scripts and UI:&lt;br /&gt;&lt;a href="http://www.dotnet2themax.com/blogs/mbellinaso/PermaLink,guid,f74b0894-a572-4187-9dd8-74215c77d0bb.aspx"&gt;Precompiling the Site&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the command you could use to pre-compile everything (this should all be entered on one line):&lt;br /&gt;&lt;em&gt;aspnet_compiler.exe -p c:\Projects\ASP.NET\TheBeerHouse\TBH_Web -v /TheBeerHouse c:\Deployment\TheBeerHouse&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;In the case of deploying to your own sites, it’s simpler to pre-compile only the source code files but not the markup files. To do this, just add the -u switch (which stands for updateable) to the command line, as follows:&lt;br /&gt;&lt;em&gt;aspnet_compiler.exe -p c:\Projects\ASP.NET\TheBeerHouse\TBH_Web -v /TheBeerHouse -u c:\Deployment\TheBeerHouse&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Compile with fixed DLL names:&lt;br /&gt;&lt;em&gt;aspnet_compiler.exe -p c:\Projects\ASP.NET\TheBeerHouse\TBH_Web -v /TheBeerHouse -u -fixednames c:\Deployment\TheBeerHouse&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/asp.net/reference/infrastructure/wdp/default.aspx"&gt;Download Visual Studio 2005 Web Deployment Projects&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Merge all ASP.NET DLLs into one:&lt;br /&gt;&lt;em&gt;C:\Program Files\MSBuild\Microsoft\WebDeployment\v8.0\aspnet_merge.exe c:\Deployment\TheBeerHouse&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;Keywords: ASP.NET 2.0, C#, VB.NET 2.0, WebForms, Web Forms, Deployment&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-115082253572244593?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/115082253572244593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=115082253572244593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115082253572244593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/115082253572244593'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/06/aspnet-20-web-site-compilation-and.html' title='ASP.NET 2.0 Web site compilation and deployment options'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114930413019490098</id><published>2006-06-02T23:08:00.000-04:00</published><updated>2006-06-02T23:08:50.343-04:00</updated><title type='text'>XML -&gt; CSV XSL Transformation</title><content type='html'>CSV - comma separated values format (supported by Excel).&lt;br /&gt;&lt;a href="http://www.stylusstudio.com/SSDN/default.asp?action=9&amp;read=2534&amp;fid=48&amp;FirstTopic=1&amp;LastTopic=999"&gt;Handling quotes in XML-&amp;gt;&gt;CSV XSLT&lt;/a&gt;&lt;br /&gt;First trick is to save the " and "" inside a variable, second trick is to use a recursive template.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.stylusstudio.com/xsllist/200103/post60790.html"&gt;&lt;br /&gt;Handling quotes, commas and line-breaks in XML-&amp;gt;&gt;CSV XSLT&lt;/a&gt;&lt;br /&gt;In a CSV file, if a field value contains a comma or a linefeed or a quote, then&lt;br /&gt;it must be enclosed in quotes.&lt;br /&gt;Also, if a field value contains quotes, then an extra quote must be inserted in front of each quote.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;My implementation:&lt;/b&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;2.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;xsl:output method=&amp;quot;text&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;xsl:for-each select=&amp;quot;Table&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;field&amp;quot; select=&amp;quot;Column1&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;,&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;field&amp;quot; select=&amp;quot;Column2&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;,&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;field&amp;quot; select=&amp;quot;Column3&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&lt;br /&gt;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;xsl:template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;field&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:variable name=&amp;quot;linefeed&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;xsl:text&amp;gt;&amp;amp;#10;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains( $field, '&amp;amp;quot;' )&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;!-- Field contains a quote. We must enclose this field in quotes,&lt;br /&gt;           and we must escape each of the quotes in the field value.&lt;br /&gt;      --&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;xsl:variable name=&amp;quot;apos&amp;quot;&amp;gt;&amp;quot;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;        &amp;lt;xsl:variable name=&amp;quot;aposapos&amp;quot;&amp;gt;&amp;quot;&amp;quot;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;stringIn&amp;quot; select=&amp;quot;normalize-space($field)&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringIn&amp;quot; select=&amp;quot;$apos&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringOut&amp;quot; select=&amp;quot;$aposapos&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains( $field, ',' ) or&lt;br /&gt;                    contains( $field, $linefeed )&amp;quot; &amp;gt;&lt;br /&gt;        &amp;lt;!-- Field contains a comma and/or a linefeed.&lt;br /&gt;           We must enclose this field in quotes.&lt;br /&gt;      --&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;normalize-space($field)&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;!-- No need to enclose this field in quotes.&lt;br /&gt;      --&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;normalize-space($field)&amp;quot; /&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;xsl:template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;stringIn&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;substringIn&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;substringOut&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains($stringIn,$substringIn)&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;concat(substring-before($stringIn,$substringIn),$substringOut)&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;stringIn&amp;quot; select=&amp;quot;substring-after($stringIn,$substringIn)&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringIn&amp;quot; select=&amp;quot;$substringIn&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringOut&amp;quot; select=&amp;quot;$substringOut&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;      &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;$stringIn&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114930413019490098?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114930413019490098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114930413019490098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114930413019490098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114930413019490098'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/06/xml-csv-xsl-transformation.html' title='XML -&gt; CSV XSL Transformation'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114930406469657739</id><published>2006-06-02T23:07:00.000-04:00</published><updated>2006-06-02T23:07:45.296-04:00</updated><title type='text'>XML -&gt; CSV -&gt; HTML conversion</title><content type='html'>CSV - comma separated values format (supported by Excel).&lt;br /&gt;&lt;a href="http://www.stylusstudio.com/SSDN/default.asp?action=9&amp;read=2534&amp;fid=48&amp;FirstTopic=1&amp;LastTopic=999"&gt;Handling quotes in XML-&amp;gt;&gt;CSV XSLT&lt;/a&gt;&lt;br /&gt;First trick is to save the " and "" inside a variable, second trick is to use a recursive template.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.stylusstudio.com/xsllist/200103/post60790.html"&gt;&lt;br /&gt;Handling quotes, commas and line-breaks in XML-&amp;gt;&gt;CSV XSLT&lt;/a&gt;&lt;br /&gt;In a CSV file, if a field value contains a comma or a linefeed or a quote, then&lt;br /&gt;it must be enclosed in quotes.&lt;br /&gt;Also, if a field value contains quotes, then an extra quote must be inserted in front of each quote.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;My implementation:&lt;/b&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;2.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;xsl:output method=&amp;quot;text&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;xsl:for-each select=&amp;quot;Table&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;field&amp;quot; select=&amp;quot;Column1&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;,&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;field&amp;quot; select=&amp;quot;Column2&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;,&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;field&amp;quot; select=&amp;quot;Column3&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&lt;br /&gt;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;xsl:template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;field&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:variable name=&amp;quot;linefeed&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;xsl:text&amp;gt;&amp;amp;#10;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains( $field, '&amp;amp;quot;' )&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;!-- Field contains a quote. We must enclose this field in quotes,&lt;br /&gt;           and we must escape each of the quotes in the field value.&lt;br /&gt;      --&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;xsl:variable name=&amp;quot;apos&amp;quot;&amp;gt;&amp;quot;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;        &amp;lt;xsl:variable name=&amp;quot;aposapos&amp;quot;&amp;gt;&amp;quot;&amp;quot;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;stringIn&amp;quot; select=&amp;quot;normalize-space($field)&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringIn&amp;quot; select=&amp;quot;$apos&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringOut&amp;quot; select=&amp;quot;$aposapos&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains( $field, ',' ) or&lt;br /&gt;                    contains( $field, $linefeed )&amp;quot; &amp;gt;&lt;br /&gt;        &amp;lt;!-- Field contains a comma and/or a linefeed.&lt;br /&gt;           We must enclose this field in quotes.&lt;br /&gt;      --&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;normalize-space($field)&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;!-- No need to enclose this field in quotes.&lt;br /&gt;      --&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;normalize-space($field)&amp;quot; /&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;xsl:template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;stringIn&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;substringIn&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;substringOut&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains($stringIn,$substringIn)&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;concat(substring-before($stringIn,$substringIn),$substringOut)&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;stringIn&amp;quot; select=&amp;quot;substring-after($stringIn,$substringIn)&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringIn&amp;quot; select=&amp;quot;$substringIn&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringOut&amp;quot; select=&amp;quot;$substringOut&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;      &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;$stringIn&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114930406469657739?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114930406469657739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114930406469657739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114930406469657739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114930406469657739'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/06/xml-csv-html-conversion.html' title='XML -&gt; CSV -&gt; HTML conversion'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114930362454305074</id><published>2006-06-02T22:38:00.000-04:00</published><updated>2006-06-02T23:00:24.563-04:00</updated><title type='text'></title><content type='html'>&lt;a href="http://www.stylusstudio.com/SSDN/default.asp?action=9&amp;read=2534&amp;fid=48&amp;FirstTopic=1&amp;LastTopic=999"&gt;Handling quotes in XML-&amp;gt;&gt;CSV XSLT&lt;/a&gt;&lt;br /&gt;First trick is to save the " and "" inside a variable, second trick is to use a recursive template.&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;xsl:output method=&amp;quot;text&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:apply-templates select=&amp;quot;.&amp;quot; mode=&amp;quot;x&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;  &amp;lt;xsl:template match=&amp;quot;text()&amp;quot; mode=&amp;quot;x&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:variable name=&amp;quot;apos&amp;quot;&amp;gt;&amp;quot;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;    &amp;lt;xsl:variable name=&amp;quot;aposapos&amp;quot;&amp;gt;&amp;quot;&amp;quot;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:call-template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;xsl:with-param name=&amp;quot;stringIn&amp;quot; select=&amp;quot;.&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;xsl:with-param name=&amp;quot;substringIn&amp;quot; select=&amp;quot;$apos&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;xsl:with-param name=&amp;quot;substringOut&amp;quot; select=&amp;quot;$aposapos&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;xsl:template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;stringIn&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;substringIn&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;substringOut&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains($stringIn,$substringIn)&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;concat(substring-before($stringIn,$substringIn),$substringOut)&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;stringIn&amp;quot; select=&amp;quot;substring-after($stringIn,$substringIn)&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringIn&amp;quot; select=&amp;quot;$substringIn&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringOut&amp;quot; select=&amp;quot;$substringOut&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;      &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;$stringIn&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.stylusstudio.com/xsllist/200103/post60790.html"&gt;&lt;br /&gt;Handling quotes, commas and line-breaks in XML-&amp;gt;&gt;CSV XSLT&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The solutions presented so far assume that&lt;br /&gt;the field values will not contain any commas,&lt;br /&gt;linefeeds or quotes.&lt;br /&gt;&lt;br /&gt;In a CSV file, if a field value contains&lt;br /&gt;a comma or a linefeed or a quote, then&lt;br /&gt;it must be enclosed in quotes.&lt;br /&gt;&lt;br /&gt;Also, if a field value contains quotes,&lt;br /&gt;then an extra quote must be inserted in&lt;br /&gt;front of each quote.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My implementation:&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;2.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;xsl:output method=&amp;quot;text&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;    Alternate Agent Number,Previous Agent Alpha,Agency Head Office&lt;br /&gt;    &amp;lt;xsl:for-each select=&amp;quot;ODBCDBConnect&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;xsl:for-each select=&amp;quot;Table&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;field&amp;quot; select=&amp;quot;ALKALTNUM&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;,&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;field&amp;quot; select=&amp;quot;ALKPRVAGTA&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;,&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;field&amp;quot; select=&amp;quot;ADAGHD&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&lt;br /&gt;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;xsl:template name=&amp;quot;DisplayCSV&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;field&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:variable name=&amp;quot;linefeed&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;xsl:text&amp;gt;&amp;amp;#10;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains( $field, '&amp;amp;quot;' )&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;!-- Field contains a quote. We must enclose this field in quotes,&lt;br /&gt;           and we must escape each of the quotes in the field value.&lt;br /&gt;      --&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;xsl:variable name=&amp;quot;apos&amp;quot;&amp;gt;&amp;quot;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;        &amp;lt;xsl:variable name=&amp;quot;aposapos&amp;quot;&amp;gt;&amp;quot;&amp;quot;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;stringIn&amp;quot; select=&amp;quot;normalize-space($field)&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringIn&amp;quot; select=&amp;quot;$apos&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringOut&amp;quot; select=&amp;quot;$aposapos&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains( $field, ',' ) or&lt;br /&gt;                    contains( $field, $linefeed )&amp;quot; &amp;gt;&lt;br /&gt;        &amp;lt;!-- Field contains a comma and/or a linefeed.&lt;br /&gt;           We must enclose this field in quotes.&lt;br /&gt;      --&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;normalize-space($field)&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt;&amp;quot;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;!-- No need to enclose this field in quotes.&lt;br /&gt;      --&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;normalize-space($field)&amp;quot; /&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;xsl:template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;stringIn&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;substringIn&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;substringOut&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;      &amp;lt;xsl:when test=&amp;quot;contains($stringIn,$substringIn)&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;concat(substring-before($stringIn,$substringIn),$substringOut)&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;SubstringReplace&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;stringIn&amp;quot; select=&amp;quot;substring-after($stringIn,$substringIn)&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringIn&amp;quot; select=&amp;quot;$substringIn&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;xsl:with-param name=&amp;quot;substringOut&amp;quot; select=&amp;quot;$substringOut&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;      &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&amp;quot;$stringIn&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114930362454305074?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114930362454305074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114930362454305074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114930362454305074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114930362454305074'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/06/csv-xslt-first-trick-is-to-save-and.html' title=''/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114900579255918276</id><published>2006-05-30T11:58:00.000-04:00</published><updated>2006-05-30T12:16:32.580-04:00</updated><title type='text'>Checking All CheckBoxes in a GridView</title><content type='html'>&lt;a href="http://aspnet.4guysfromrolla.com/articles/052406-1.aspx"&gt;Checking All CheckBoxes in a GridView&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's the part which shows how to implement client-side JavaScript checking/unchecking&lt;br /&gt;C#:&lt;br /&gt;protected void Page_Load(object sender, System.EventArgs e)&lt;br /&gt;{&lt;blockquote&gt;// DataBind GridView here&lt;br /&gt;    //...&lt;br /&gt;&lt;br /&gt;    'On every page visit we need to build up the CheckBoxIDs array&lt;br /&gt;    foreach(GridViewRow row in grid.Rows)&lt;br /&gt;    {&lt;blockquote&gt;//Get a programmatic reference to the CheckBox control&lt;br /&gt;        CheckBox chk = (CheckBox)row.FindControl("chk");&lt;br /&gt;        ClientScript.RegisterArrayDeclaration("CheckBoxIDs", string.Concat("'", chk.ClientID, "'"));&lt;/blockquote&gt;}&lt;br /&gt;&lt;/blockquote&gt;}&lt;br /&gt;&lt;br /&gt;JavaScript:&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;blockquote&gt;function ChangeCheckBoxState(id, checkState)&lt;br /&gt;   {&lt;blockquote&gt;var cb = document.getElementById(id);&lt;br /&gt;      if (cb != null)&lt;br /&gt;         cb.checked = checkState;&lt;/blockquote&gt;}&lt;br /&gt;&lt;br /&gt;   function ChangeAllCheckBoxStates(checkState)&lt;br /&gt;   {&lt;blockquote&gt;// Toggles through all of the checkboxes defined in the CheckBoxIDs array&lt;br /&gt;      // and updates their value to the checkState input parameter&lt;br /&gt;      if (CheckBoxIDs != null)&lt;br /&gt;      {&lt;br /&gt;         for (var i = 0; i &lt; CheckBoxIDs.length; i++)&lt;br /&gt;            ChangeCheckBoxState(CheckBoxIDs[i], checkState);&lt;br /&gt;      }&lt;/blockquote&gt;}&lt;/blockquote&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;   &amp;lt;input type="button" value="Check All" onclick="ChangeAllCheckBoxStates(true);" /&amp;gt;&lt;br /&gt;   &amp;nbsp;&lt;br /&gt;   &amp;lt;input type="button" value="Uncheck All" onclick="ChangeAllCheckBoxStates(false);" /&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114900579255918276?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114900579255918276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114900579255918276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114900579255918276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114900579255918276'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/05/checking-all-checkboxes-in-gridview.html' title='Checking All CheckBoxes in a GridView'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114661679806110393</id><published>2006-05-02T20:34:00.000-04:00</published><updated>2006-05-02T20:39:58.076-04:00</updated><title type='text'>How to use DefaultFocus and DefaultButton properties with Master page</title><content type='html'>Want to set default button (submit) and default input control in ASP.NET 2.0?&lt;br /&gt;No problem - use Page.Form.DefaultFocus and Page.Form.DefaultButton properties.&lt;br /&gt;&lt;br /&gt;But what if you work with Master Page or trying to implement User Control (Server Control)?&lt;br /&gt;&lt;br /&gt;Short answer:&lt;br /&gt;=====&lt;br /&gt;    Page.Form.DefaultFocus = TextBox1.UniqueID;&lt;br /&gt;    Page.Form.DefaultButton = Button1.UniqueID;&lt;br /&gt;=====&lt;br /&gt;&lt;br /&gt;Longer answer is here:&lt;br /&gt;&lt;a href="http://www.spaanjaars.com/QuickDocId.aspx?QUICKDOC=374"&gt;How do I set DefaultFocus or DefaultButton&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Keywords: ASP.NET 2.0, C# 2.0, MSDN2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114661679806110393?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114661679806110393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114661679806110393' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114661679806110393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114661679806110393'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/05/how-to-use-defaultfocus-and.html' title='How to use DefaultFocus and DefaultButton properties with Master page'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114659650326905417</id><published>2006-05-02T14:58:00.000-04:00</published><updated>2006-05-02T15:01:43.280-04:00</updated><title type='text'>Great ASP.NET 2.0 Tutorial Videos Online</title><content type='html'>Microsoft &amp; Scott Guthrie's team published ASP.NET 2.0 Tutorial Videos:&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2006/02/26/439088.aspx"&gt;Great ASP.NET 2.0 Tutorial Videos Online&lt;/a&gt;&lt;br /&gt;The videos are short  (~15 minutes each), easy to grasp and implement/repeat, and are very functional.&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114659650326905417?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114659650326905417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114659650326905417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114659650326905417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114659650326905417'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/05/great-aspnet-20-tutorial-videos-online.html' title='Great ASP.NET 2.0 Tutorial Videos Online'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114638435902434615</id><published>2006-04-30T04:05:00.000-04:00</published><updated>2006-04-30T04:05:59.056-04:00</updated><title type='text'>Google's Secret Weapon</title><content type='html'>Nice article about recruiters struggling and competing in hiring talented software engineers:&lt;br /&gt;&lt;a href="http://opal.cabochon.com/~stevey/blog-rants/google-secret-weapon.html"&gt;Google's Secret Weapon&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114638435902434615?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114638435902434615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114638435902434615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114638435902434615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114638435902434615'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/04/googles-secret-weapon.html' title='Google&apos;s Secret Weapon'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114637068332858728</id><published>2006-04-30T00:18:00.000-04:00</published><updated>2006-04-30T00:18:03.393-04:00</updated><title type='text'>The Five Essential Phone Screen Questions</title><content type='html'>Steve Yegge gives his recommendations how to screen (pre-interview) developers:&lt;br /&gt;&lt;a href="http://opal.cabochon.com/~stevey/blog-rants/five-essential-phone-screen-questions.html"&gt;The Five Essential Phone Screen Questions&lt;/a&gt;&lt;br /&gt;In my opinion, his recommendations would work nice if questions would be asked during phone interview (not screening). + obviously these questions are shaped for Unix developers. + these questions are for at least mid-level developers and higher (seniors).&lt;br /&gt;I think that Juniors have be able to answer all these "Five Essential Questions".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114637068332858728?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114637068332858728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114637068332858728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114637068332858728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114637068332858728'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/04/five-essential-phone-screen-questions.html' title='The Five Essential Phone Screen Questions'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114623937565262919</id><published>2006-04-28T11:35:00.000-04:00</published><updated>2006-04-28T11:49:35.663-04:00</updated><title type='text'>Scott Guthrie blog</title><content type='html'>Scott Guthrie is a Program Manager of ASP.NET team at Microsoft:&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/"&gt;ScottGu's Blog&lt;/a&gt;&lt;br /&gt;This blog is full of ASP.NET 2.0 code examples, demos, tips, ideas, links to other blogs and articles ... --- very interesting and very fresh ASP.NET stuff.&lt;br /&gt;&lt;br /&gt;VB.NET, C# 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114623937565262919?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114623937565262919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114623937565262919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114623937565262919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114623937565262919'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/04/scott-guthrie-blog.html' title='Scott Guthrie blog'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114623793890599921</id><published>2006-04-28T11:25:00.000-04:00</published><updated>2006-04-28T11:25:38.940-04:00</updated><title type='text'>ASP.NET debugging blog</title><content type='html'>Tess is bloggin about debuggin ASP.NET applications:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/tess/"&gt;If broken it is, fix it you should&lt;/a&gt;&lt;br /&gt;Compilation, web.config debugging configuration, deploying DLLs, and more...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114623793890599921?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114623793890599921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114623793890599921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114623793890599921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114623793890599921'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/04/aspnet-debugging-blog.html' title='ASP.NET debugging blog'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114408780498714744</id><published>2006-04-03T14:10:00.000-04:00</published><updated>2006-04-03T14:13:30.130-04:00</updated><title type='text'>How to: Localize Site-Map Data</title><content type='html'>If you want to localize your Site Map you may check this MSDN article:&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms178427(vs.80).aspx"&gt;How to: Localize Site-Map Data&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ASP.NET 2.0&lt;br /&gt;ASP.NET 2005&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114408780498714744?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114408780498714744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114408780498714744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114408780498714744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114408780498714744'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/04/how-to-localize-site-map-data_03.html' title='How to: Localize Site-Map Data'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114357430660783767</id><published>2006-03-28T14:31:00.000-05:00</published><updated>2006-03-28T14:31:46.663-05:00</updated><title type='text'>How to access Private Protected methods in .NET</title><content type='html'>Sometimes we want to get access to protected or even private methods and properties.&lt;br /&gt;For example, I needed it because I tried to reuse standard Microsoft functionality in my feature.&lt;br /&gt;Sometimes protected and private methods are more convenient building blocks than public methods...&lt;br /&gt;Anyway, here we are:&lt;br /&gt;&lt;a href="http://www.codeproject.com/csharp/TestNonPublicMembers.asp"&gt;How to Test Private and Protected methods in .NET&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;C#, C#.NET&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114357430660783767?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114357430660783767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114357430660783767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114357430660783767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114357430660783767'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/03/how-to-access-private-protected.html' title='How to access Private Protected methods in .NET'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114079712344434427</id><published>2006-02-24T11:05:00.000-05:00</published><updated>2006-02-24T11:07:15.726-05:00</updated><title type='text'>Building a WaitScreen web server control for ASP.NET</title><content type='html'>&lt;a href="http://www.lennybacon.com/PleaseWaitBuildingAWaitScreenControlForASPNET.aspx"&gt;Building a WaitScreen control for ASP.NET&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114079712344434427?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114079712344434427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114079712344434427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114079712344434427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114079712344434427'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/02/building-waitscreen-web-server-control.html' title='Building a WaitScreen web server control for ASP.NET'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114045236025158819</id><published>2006-02-20T11:19:00.000-05:00</published><updated>2006-02-20T11:16:42.313-05:00</updated><title type='text'>How to get rewarded for incompetence</title><content type='html'>&lt;a href="http://www.infoworld.com/article/06/01/31/74876_06OPrecord_1.html"&gt;How to get rewarded for incompetence&lt;/a&gt;&lt;br /&gt;.....&lt;br /&gt;Steve studied the business issues and recruited key personnel from the AP department to help identify information requirements and develop a rough design of the solution. &lt;br /&gt;.....&lt;br /&gt;Bob took a different approach. Focused on fast results, he set part of his group to building a core AR database, while a second set of programmers created basic input screens and sample outputs. In no time, Bob had something to show the boss, who was suitably impressed. &lt;br /&gt;.....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114045236025158819?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114045236025158819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114045236025158819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114045236025158819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114045236025158819'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/02/how-to-get-rewarded-for-incompetence.html' title='How to get rewarded for incompetence'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-114004519362452728</id><published>2006-02-15T18:13:00.000-05:00</published><updated>2006-02-15T18:41:04.236-05:00</updated><title type='text'>Paging through lots of data with MS SQL Server 2005 and ASP.NET 2.0</title><content type='html'>This link explains how MS SQL Server 2005 supports paging in GridView (web control in ASP.NET 2.0) through "ROW_NUMBER() OVER (...)" function:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2006/01/01/434314.aspx"&gt;Paging through lots of data efficiently with ASP.NET 2.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is another article on the "SQL Pager" topic:&lt;br /&gt;&lt;a href="http://www.4guysfromrolla.com/webtech/010406-1.shtml"&gt;Returning Ranked Results with Microsoft SQL Server 2005&lt;/a&gt;&lt;br /&gt;You can find here some nice stuff about Ranking SELECT's resultset.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-114004519362452728?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/114004519362452728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=114004519362452728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114004519362452728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/114004519362452728'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/02/paging-through-lots-of-data-with-ms.html' title='Paging through lots of data with MS SQL Server 2005 and ASP.NET 2.0'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113987833632261797</id><published>2006-02-13T19:52:00.000-05:00</published><updated>2006-02-13T19:52:16.360-05:00</updated><title type='text'>A well dressed engineer has no credibility</title><content type='html'>&lt;a href="http://anaulin.org/wordpress/archives/2004/11/07/a-well-dressed-engineer-has-no-credibility/"&gt;A well dressed engineer has no credibility&lt;/a&gt;&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113987833632261797?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113987833632261797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113987833632261797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113987833632261797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113987833632261797'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/02/well-dressed-engineer-has-no.html' title='A well dressed engineer has no credibility'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113934441054459292</id><published>2006-02-07T15:33:00.000-05:00</published><updated>2006-02-07T15:33:30.580-05:00</updated><title type='text'>Developing Custom ASP.NET Server Controls</title><content type='html'>&lt;a href="http://msdn2.microsoft.com/en-us/library/zt27tfhy.aspx"&gt;Developing Custom ASP.NET Server Controls&lt;/a&gt;&lt;br /&gt;This section describes how to develop ASP.NET server controls. It contains a walkthrough that provides an overview of authoring a custom server control and it provides code examples that illustrate different control authoring tasks such as rendering, defining properties, managing state, and creating composite controls.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113934441054459292?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113934441054459292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113934441054459292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113934441054459292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113934441054459292'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2006/02/developing-custom-aspnet-server.html' title='Developing Custom ASP.NET Server Controls'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113501703034201357</id><published>2005-12-19T13:30:00.001-05:00</published><updated>2009-01-10T11:23:10.807-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web parts'/><title type='text'>Loading User Controls into Web Parts</title><content type='html'>&lt;a href="http://www.ondotnet.com/pub/a/dotnet/2005/05/23/webparts_1.html?page=2"&gt;Create Google.ascx as a web part&lt;/a&gt; article demonstrates how to create User Control and insert it into Web part.&lt;br /&gt;Tip from the article: in order to get rid of "Untitled" header in Web part - define title attribute for user control:&lt;br /&gt;&amp;lt;uc1:Google title="Google Search" runat="server" ID="Google1" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/09/WebParts/default.aspx"&gt;Personalize Your Portal with User Controls and Custom Web Parts&lt;/a&gt; article demonstrates how to bind User Control to Web Part dynamically:&lt;br /&gt;// create Web Part instance from User Control file&lt;br /&gt;Control uc = this.LoadControl(@"webparts\CompanyNews.ascx");&lt;br /&gt;uc.ID = "wp2";&lt;br /&gt;GenericWebPart wp2 = WebPartManager1.CreateWebPart(uc);&lt;br /&gt;WebPartManager1.AddWebPart(wp2, WebPartZone1, 1);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113501703034201357?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113501703034201357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113501703034201357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113501703034201357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113501703034201357'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/12/loading-user-controls-into-web-parts.html' title='Loading User Controls into Web Parts'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113449944696099194</id><published>2005-12-13T13:40:00.000-05:00</published><updated>2005-12-13T13:44:06.973-05:00</updated><title type='text'>Web Site Administration Tool for ASP.NET 2.0 / VS.NET 2005</title><content type='html'>I looked into "Web Site Administration Tool" source code... It's pretty messy.&lt;br /&gt;Variables have senseless names, code is complex, a lot of unnecessary code, grids are binding 2 times, ...&lt;br /&gt;&lt;br /&gt;No wonder that "Web Site Administration Tool" is sluggish and bug-prone.&lt;br /&gt;Moreover, such code is very hard to fix (you fix one bug and getting 2 bugs instead).&lt;br /&gt;I think either Microsoft would either rewrite this tool from scratch or leave as it is.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;See also: &lt;/strong&gt;&lt;a href="http://groups.google.com/group/microsoft.public.vsnet.general/browse_frm/thread/51fae96baec39fb9/2b8ae467568aa225?lnk=st&amp;q=%22Web+Site+Administration+Tool%22&amp;amp;rnum=8&amp;amp;hl=en#2b8ae467568aa225"&gt;discussion in microsoft.public.vsnet.general&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113449944696099194?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113449944696099194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113449944696099194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113449944696099194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113449944696099194'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/12/web-site-administration-tool-for.html' title='Web Site Administration Tool for ASP.NET 2.0 / VS.NET 2005'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113262960737384691</id><published>2005-11-21T22:20:00.000-05:00</published><updated>2005-11-21T22:20:07.410-05:00</updated><title type='text'>Large Data Operations in SQL Server</title><content type='html'>&lt;a href="http://www.sql-server-performance.com/jc_large_data_operations.asp"&gt;Large Data Operations in SQL Server&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This article explains how performance is affected by choosing "table scan" or "index seek". Also it shows how memory available for SQL Server affects performance.&lt;br /&gt;&lt;br /&gt;MS SQL Server 2000.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113262960737384691?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113262960737384691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113262960737384691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113262960737384691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113262960737384691'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/11/large-data-operations-in-sql-server.html' title='Large Data Operations in SQL Server'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113201562141595581</id><published>2005-11-14T19:47:00.000-05:00</published><updated>2005-11-14T19:47:01.440-05:00</updated><title type='text'>Interview questions</title><content type='html'>1) What do you know about this project?&lt;br /&gt;2) What states did you work in?&lt;br /&gt;3) What did you do in your project?&lt;br /&gt;4) What did you complete in your project?&lt;br /&gt;5) How would you create report page?&lt;br /&gt;6) What interesting SP did you write?&lt;br /&gt;7) How would you select 50 states with CA on top?&lt;br /&gt;8) How would you get all records from table A which don’t have matches in table B?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113201562141595581?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113201562141595581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113201562141595581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113201562141595581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113201562141595581'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/11/interview-questions.html' title='Interview questions'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113164533283376220</id><published>2005-11-10T12:55:00.000-05:00</published><updated>2005-11-10T12:55:32.873-05:00</updated><title type='text'>Bayden Systems - IEToys</title><content type='html'>&lt;a href="http://www.bayden.com/ietoys/"&gt;Bayden Systems - IEToys&lt;/a&gt;&lt;br /&gt;Tools for Internet Explorer:&lt;br /&gt;- Image cleanup.&lt;br /&gt;- Define &amp; Dictionary.&lt;br /&gt;- Partual HTML source.&lt;br /&gt;- Word Highlighter.&lt;br /&gt;- Access keys.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113164533283376220?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113164533283376220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113164533283376220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113164533283376220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113164533283376220'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/11/bayden-systems-ietoys.html' title='Bayden Systems - IEToys'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113164142520032331</id><published>2005-11-10T11:50:00.000-05:00</published><updated>2005-11-10T11:50:25.230-05:00</updated><title type='text'>Fiddler HTTP Debugger</title><content type='html'>If you want to trace what HTTP get/post requests your browser prepares, and trace HTML response which web server returns to your browser --- use &lt;a href="https://www.fiddlertool.com/"&gt;Fiddler HTTP Debugger&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113164142520032331?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113164142520032331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113164142520032331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113164142520032331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113164142520032331'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/11/fiddler-http-debugger.html' title='Fiddler HTTP Debugger'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113114540449078369</id><published>2005-11-04T18:03:00.000-05:00</published><updated>2005-11-04T18:03:24.516-05:00</updated><title type='text'>Microsoft Professional Developers Conference 2005</title><content type='html'>&lt;a href="http://microsoft.sitestream.com/PDC05/"&gt;Microsoft Professional Developers Conference 2005&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113114540449078369?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113114540449078369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113114540449078369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113114540449078369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113114540449078369'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/11/microsoft-professional-developers.html' title='Microsoft Professional Developers Conference 2005'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113106717085780145</id><published>2005-11-03T19:57:00.000-05:00</published><updated>2005-11-03T20:22:26.540-05:00</updated><title type='text'>How to deal with users/roles/permissions</title><content type='html'>Typical business application with many clients works with many users. These users are linked to groups. These groups could be linked to other groups. There could be recursion in groups' hierarchy.&lt;br /&gt;Every group has permission to access some business components.&lt;br /&gt;&lt;br /&gt;Typical task in the application would be to figure out if specified user has right to access specified business component. Let's refer this task as "access question".&lt;br /&gt;We want to answer this "access question" as fast as possible, because "access question" would be asked every time when user accesses a component.&lt;br /&gt;&lt;br /&gt;One of the simplest approaches would be to implement standart table construction like:&lt;br /&gt;User - Role - Permission.&lt;br /&gt;But that may be not flexible enough from business perspective.&lt;br /&gt;&lt;i&gt;&lt;b&gt;Example:&lt;/b&gt; Sometimes business wants to add user JohnDoe, who is employee of company Company1 to role Company1Role.&lt;br /&gt;In turn Company1Role belongs to ReportViewersRole.&lt;br /&gt;And ReportViewersRole has permission to access "Reports" components.&lt;br /&gt;This example would not fit into simple "User - Role - Permission" model.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So, what's the solution?&lt;br /&gt;&lt;br /&gt;The two approaches below look more viable than others:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Approach #1. Limited hierarchy of roles.&lt;/h4&gt;Most probably this approach would have short chain of links:&lt;br /&gt;User &lt;-&gt; User roles &lt;-&gt; Permissions roles &lt;-&gt; Permissions&lt;br /&gt;&lt;br /&gt;Because of limited number of links in the chain, answering question “is this user has permission to access this component?” would be pretty fast.&lt;br /&gt;&lt;br /&gt;"Limited hierarchy of roles" approach would cover 90+% or use cases. If this approach covers close to 100% of use cases we should use this approach, because it’s simpler than Approach #2.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Approach #2. "Permissions datawarehouse"&lt;/h4&gt;This approach can adopt unlimited hierarchy/recursion of roles and still work pretty fast.&lt;br /&gt;&lt;br /&gt;The idea is to have two sets of tables.&lt;br /&gt;&lt;br /&gt;First set would have the following tables:&lt;br /&gt;Users&lt;br /&gt;Roles&lt;br /&gt;RolesRecursiveHierarchy&lt;br /&gt;RolesPermissions&lt;br /&gt;and optionally  - Permissions table.&lt;br /&gt;&lt;br /&gt;This First set is responsible for maintaining permissions hierarchy (adding/deleting users, adding/deleting roles, defining roles permissions, defining roles hierarchy).&lt;br /&gt;&lt;br /&gt;This First set would not be responsible for answering question: "is this user has permission to access this component?". The First set is too slow for that: ~ 1 ... 10 seconds.&lt;br /&gt; &lt;br /&gt;That why we would need second set. Exactly for answering this permission question.&lt;br /&gt;&lt;br /&gt;The second set consists of only one table:&lt;br /&gt;UserPermissions&lt;br /&gt;&lt;br /&gt;UserPermissions table keeps pre-calculated information from the First set. UserPermissions directly links every user to corresponding set of permissions.&lt;br /&gt;&lt;br /&gt;Every record would consist of 2 integer fields (UserId, PermissionId).&lt;br /&gt;&lt;br /&gt;If we estimate to have ~10000 users, and estimate that average user would have ~500 permissions, then UserPermissions table would have ~5 million records.&lt;br /&gt;&lt;br /&gt;Answering the question ("is this user has permission to access this component?") would be implemented in form of SQL query:&lt;br /&gt;&lt;strong&gt;Exists(Select 1 from UserPermissions where UserId = @UserId and PermissionId = @PermissionId)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Because UserPermissions would be indexed --- the query would be pretty fast.&lt;br /&gt;&lt;br /&gt;Every time when the First Set is updated, The Second set would be updated too. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note 1:&lt;/b&gt;&lt;br /&gt;Another implementation of The Second set could be: User_PermissionRole table.&lt;br /&gt;Difference between User_PermissionRole and UserPermissions is that if UserPermissions caches chain of N links, User_PermissionRole would cache chain of (N-1) links. Last link would be implemented in C# components code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note 2:&lt;/b&gt;&lt;br /&gt;We can cache "The Second set" in memory. It would be ~100 Megabyte.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Bottom line:&lt;/h4&gt;Approach #2 is more flexible, but more technically challenging than Approach #1.&lt;br /&gt;&lt;br /&gt;If Approach #1 ("Limited hierarchy of roles") works good enough – we’d better use it.&lt;br /&gt;&lt;br /&gt;If Approach #1 does not cover enough use cases --- we’d better use Approach #2 ("Permissions datawarehouse").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113106717085780145?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113106717085780145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113106717085780145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113106717085780145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113106717085780145'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/11/how-to-deal-with-usersrolespermissions.html' title='How to deal with users/roles/permissions'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-113064571583355323</id><published>2005-10-30T00:15:00.000-04:00</published><updated>2005-10-30T00:15:15.846-04:00</updated><title type='text'>Regular Expression Quick Start</title><content type='html'>&lt;a href="http://www.regular-expressions.info/quickstart.html"&gt;Regular Expression Quick Start&lt;/a&gt;&lt;br /&gt;I like it --- way better than MSDN's RegEx "tutorial".&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-113064571583355323?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/113064571583355323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=113064571583355323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113064571583355323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/113064571583355323'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/10/regular-expression-quick-start.html' title='Regular Expression Quick Start'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-112964985399147571</id><published>2005-10-18T11:22:00.000-04:00</published><updated>2005-10-18T11:37:34.000-04:00</updated><title type='text'>Connection string in ASP.NET 2.0 application</title><content type='html'>It is a good idea to put connection string into connectionStrings section of Web.Config:&lt;br /&gt;  &amp;lt;connectionStrings&amp;gt;&lt;br /&gt;    &amp;lt;add name="MyConnectionString" connectionString="Integrated Security=SSPI;Initial Catalog=pubs;Data Source=(local);"/&amp;gt;&lt;br /&gt;  &amp;lt;/connectionStrings&amp;gt;&lt;br /&gt;&lt;br /&gt;Then you can easily read it from your application:&lt;br /&gt;string connectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;&lt;br /&gt;&lt;br /&gt;If you want to encrypt your connectionStrings section:&lt;br /&gt;1) Copy Web.Config file into C:\Inetpub\wwwroot\MyWebSite folder.&lt;br /&gt;2) Execute the following command:&lt;br /&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pe "connectionStrings" -app "/MyWebSite" -prov "DataProtectionConfigurationProvider"&lt;br /&gt;&lt;br /&gt;If command from #2 was successfully executed, your ConnectionStrings section in C:\Inetpub\wwwroot\MyWebSite\Web.Config file is encrypted.&lt;br /&gt;You still can use the same command in order to access your connection string:&lt;br /&gt;System.Web.Configuration.WebConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;VS.NET 2005, C#, ASP.NET 2.0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-112964985399147571?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/112964985399147571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=112964985399147571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112964985399147571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112964985399147571'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/10/connection-string-in-aspnet-20.html' title='Connection string in ASP.NET 2.0 application'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-112907242584258231</id><published>2005-10-11T19:13:00.000-04:00</published><updated>2005-10-11T19:13:45.863-04:00</updated><title type='text'>How to ignore DTD validation</title><content type='html'>&lt;h3&gt;Question:&lt;/h3&gt;&lt;br /&gt;When I'm trying to load XML into XmlDocument:&lt;br /&gt;            xmlDocument.Load(memoryStream);&lt;br /&gt;or deserialize XML:&lt;br /&gt;            XmlSerializer reader = new XmlSerializer(responseType);&lt;br /&gt;            object response = reader.Deserialize(xmlReader);&lt;br /&gt;&lt;br /&gt;I'm getting an error:&lt;br /&gt;Could not find file 'C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\MySchema.dtd'&lt;br /&gt;&lt;br /&gt;The problem is the "MySchema.dtd" is referred in XML string/stream which I’m trying to load:&lt;br /&gt;-------- XML string ------&lt;br /&gt;&lt;?xml version="1.0"?&gt;&lt;br /&gt;&lt;!DOCTYPE FloodStatus SYSTEM "MySchema.dtd"&gt;&lt;br /&gt;------------------------------&lt;br /&gt;I have MySchema.dtd, but I don’t want to deploy it into .NET folder “'C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\”&lt;br /&gt;&lt;br /&gt;How could I specify folder where Xml parser should look for DTD schemas?&lt;br /&gt;&lt;br /&gt;Or at least how to tell XML parsers to ignore DTD validation comletely?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Solution&lt;/h3&gt;&lt;br /&gt;You may try couple of solutions:&lt;br /&gt;1) Turn off DTD validation completely.&lt;br /&gt;That’s simple: just set XmlResolver property to null:&lt;br /&gt;xmlDocument.XmlResolver = null;&lt;br /&gt;or:&lt;br /&gt;xmlReader.XmlResolver = null;&lt;br /&gt;2) Specify your folder where you store your DTD schemas.&lt;br /&gt;In order to implement it you have to create custom XmlResolver class, that is derive this custom class from XmlResolver, or even better from XmlUrlResolver.&lt;br /&gt;Then override ResolveUri and/or GetEntity methods.&lt;br /&gt;Overridden ResolveUri has to return absolute path to your DTD storage folder.&lt;br /&gt;Last step would be instantiate your custom class and set XmlResolver property:&lt;br /&gt;xmlDocument.XmlResolver = new MyCustomXmlUriResolver();&lt;br /&gt;&lt;br /&gt;-------&lt;br /&gt;Example/Examples/Sample for Visual Studio .NET 2005, C# 2.0, ASP.NET 2.0&lt;br /&gt;System.Xml namespace&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-112907242584258231?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/112907242584258231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=112907242584258231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112907242584258231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112907242584258231'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/10/how-to-ignore-dtd-validation.html' title='How to ignore DTD validation'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-112861706707710537</id><published>2005-10-06T12:44:00.000-04:00</published><updated>2005-10-06T12:44:27.116-04:00</updated><title type='text'>Joel on Software - How Microsoft Lost the API War</title><content type='html'>&lt;a href="http://www.joelonsoftware.com/articles/APIWar.html"&gt;Joel on Software - How Microsoft Lost the API War&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-112861706707710537?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/112861706707710537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=112861706707710537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112861706707710537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112861706707710537'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/10/joel-on-software-how-microsoft-lost.html' title='Joel on Software - How Microsoft Lost the API War'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-112734536661206857</id><published>2005-09-21T19:29:00.000-04:00</published><updated>2005-09-21T19:29:26.640-04:00</updated><title type='text'>An Overview of the GridView Control</title><content type='html'>&lt;a href="http://www.readol.net/books/computer/dotnet/A.First.Look.At.ASP.Dot.NET.v.2.0/0321228960_ch04lev1sec1.html"&gt;http://www.readol.net/books/computer/dotnet/A.First.Look.At.ASP.Dot.NET.v.2.0/0321228960_ch04lev1sec1.html&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-112734536661206857?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/112734536661206857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=112734536661206857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112734536661206857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112734536661206857'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/09/overview-of-gridview-control.html' title='An Overview of the GridView Control'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-112732665699154675</id><published>2005-09-21T14:17:00.000-04:00</published><updated>2005-09-21T14:17:37.040-04:00</updated><title type='text'>Simon Evans' Blog : Data binding to objects using the ObjectDataSource control in ASP.net 2.0</title><content type='html'>&lt;a href="http://blogs.conchango.com/simonevans/archive/2005/04/23/1331.aspx"&gt;Databinding in ASP.NET 2.0 using GridView and ObjectDataSource&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nice article. Easy to read and useful info.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-112732665699154675?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/112732665699154675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=112732665699154675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112732665699154675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112732665699154675'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/09/simon-evans-blog-data-binding-to.html' title='Simon Evans&apos; Blog : Data binding to objects using the ObjectDataSource control in ASP.net 2.0'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-112725862987181071</id><published>2005-09-20T19:23:00.000-04:00</published><updated>2005-09-20T19:38:16.096-04:00</updated><title type='text'>ASP.NET 2.0 Page Lifecycle methods</title><content type='html'>Source:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/internals.asp"&gt;ASP.NET 2.0 Internals&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" width="50%"&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Method&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Active&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Constructor&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Construct&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TestDeviceFilter&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AddParsedSubObject&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DeterminePostBackMode&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnPreInit&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LoadPersonalizationData&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;InitializeThemes&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnInit&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ApplyControlSkin&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ApplyPersonalization&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnInitComplete&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LoadPageStateFromPersistenceMedium&lt;/td&gt;&lt;td&gt;PostBack&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LoadControlState&lt;/td&gt;&lt;td&gt;PostBack&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LoadViewState&lt;/td&gt;&lt;td&gt;PostBack&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ProcessPostData1&lt;/td&gt;&lt;td&gt;PostBack&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnPreLoad&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnLoad&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ProcessPostData2&lt;/td&gt;&lt;td&gt;PostBack&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RaiseChangedEvents&lt;/td&gt;&lt;td&gt;PostBack&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RaisePostBackEvent&lt;/td&gt;&lt;td&gt;PostBack&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnLoadComplete&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnPreRender&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnPreRenderComplete&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SavePersonalizationData&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SaveControlState&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SaveViewState&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SavePageStateToPersistenceMedium&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Render&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnUnload&lt;/td&gt;&lt;td&gt;Always&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-112725862987181071?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/112725862987181071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=112725862987181071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112725862987181071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112725862987181071'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/09/aspnet-20-page-lifecycle-methods.html' title='ASP.NET 2.0 Page Lifecycle methods'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-112689843696213371</id><published>2005-09-16T15:20:00.000-04:00</published><updated>2005-09-16T15:20:36.983-04:00</updated><title type='text'>Microsoft testing practises by Scott Guthrie</title><content type='html'>&lt;a href="http://weblogs.asp.net/scottgu/archive/2004/10/23/246709.aspx"&gt;&lt;br /&gt;Scott Guthrie explains how his team develops and test ASP.NET 2.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2004/10/28/249458.aspx"&gt;More details on Testing ASP.NET 2005&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Scott Guthrie:&lt;br /&gt;...&lt;br /&gt;We currently have approximately 1.4 testers for every 1 developer.&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2004/11/03/251930.aspx"&gt;Tracking Bugs&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-112689843696213371?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/112689843696213371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=112689843696213371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112689843696213371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112689843696213371'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/09/microsoft-testing-practises-by-scott.html' title='Microsoft testing practises by Scott Guthrie'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-112672867189705637</id><published>2005-09-14T16:11:00.000-04:00</published><updated>2005-09-14T16:11:11.910-04:00</updated><title type='text'>Visual Studio 2005 Beta Home</title><content type='html'>&lt;a href="http://lab.msdn.microsoft.com/vs2005/"&gt;Visual Studio 2005 beta home&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-112672867189705637?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/112672867189705637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=112672867189705637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112672867189705637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/112672867189705637'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/09/visual-studio-2005-beta-home.html' title='Visual Studio 2005 Beta Home'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-111958954364598752</id><published>2005-06-24T01:00:00.000-04:00</published><updated>2005-06-24T01:05:43.650-04:00</updated><title type='text'>How to fix problem with access to application log from ASP.NET</title><content type='html'>How to fix problem with access to application log from ASP.NET&lt;br /&gt;If you get error: &lt;br /&gt;"Requested registry access is not allowed" &lt;br /&gt;during "EventLog.WriteEntry" operation, then do this:&lt;br /&gt;1) Create win application which will create Event Source for application log:&lt;br /&gt;EventLog.CreateEventSource&lt;br /&gt;Example:&lt;br /&gt;=====&lt;br /&gt;private void TestForm_Load(object sender, System.EventArgs e)&lt;br /&gt;{&lt;br /&gt; System.Diagnostics.EventLog.CreateEventSource("LogName", "Application");&lt;br /&gt;}&lt;br /&gt;=====&lt;br /&gt;&lt;br /&gt;2) You must have Administrator's privileges on the computer which will be used as Web Server (your ASP.NET code will log into Application log of this computer).&lt;br /&gt;3) Execute "EventLog.CreateEventSource" piece of code.&lt;br /&gt;4) Your Web-application must use only this "LogName" source in "EventLog.WriteEntry" method call.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-111958954364598752?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/111958954364598752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=111958954364598752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/111958954364598752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/111958954364598752'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/06/how-to-fix-problem-with-access-to.html' title='How to fix problem with access to application log from ASP.NET'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-111955616230463586</id><published>2005-06-23T15:49:00.000-04:00</published><updated>2005-06-23T15:49:25.280-04:00</updated><title type='text'>SMTP Authentication in ASP.NET</title><content type='html'>Do you want to send email in ASP.NET and your SMTP server requires SMTP authentication?&lt;br /&gt;&lt;br /&gt;Here is the code to do that:&lt;br /&gt;=======================&lt;br /&gt;public static void SendMail(&lt;br /&gt;	string mailTo, &lt;br /&gt;	string mailFrom, &lt;br /&gt;	string mailSubject, &lt;br /&gt;	string mailBody, &lt;br /&gt;	string mailCc, &lt;br /&gt;	string mailBcc, &lt;br /&gt;	string smtpServer, &lt;br /&gt;	string userName, &lt;br /&gt;	string password) &lt;br /&gt;{ &lt;br /&gt;	System.Web.Mail.MailMessage mailMessage = new System.Web.Mail.MailMessage(); &lt;br /&gt;	mailMessage.From = mailFrom; &lt;br /&gt;	mailMessage.To = mailTo; &lt;br /&gt;	mailMessage.Subject = mailSubject; &lt;br /&gt;	mailMessage.Body = mailBody; &lt;br /&gt;	mailMessage.Cc = mailCc; &lt;br /&gt;	mailMessage.Bcc = mailBcc; &lt;br /&gt;	mailMessage.BodyFormat = System.Web.Mail.MailFormat.Text; &lt;br /&gt;&lt;br /&gt;	const int cdoBasic = 1; &lt;br /&gt;	const int cdoSendUsingPort = 2; &lt;br /&gt;&lt;br /&gt;	mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", cdoBasic); &lt;br /&gt;	mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", userName); &lt;br /&gt;	mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", password); &lt;br /&gt;	mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", cdoSendUsingPort); &lt;br /&gt;	mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", smtpServer); &lt;br /&gt;	mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout", 10); &lt;br /&gt;	mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 25); &lt;br /&gt;	mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", false); &lt;br /&gt;&lt;br /&gt;	System.Web.Mail.SmtpMail.Send(mailMessage); &lt;br /&gt;} &lt;br /&gt;=======================&lt;br /&gt;&lt;br /&gt;Original snippet is from here:&lt;br /&gt;&lt;a href="http://blogs.wwwcoder.com/pradeepd/archive/2004/01/28/236.aspx"&gt;SMTP Authentication in ASP.NET&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-111955616230463586?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/111955616230463586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=111955616230463586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/111955616230463586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/111955616230463586'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/06/smtp-authentication-in-aspnet.html' title='SMTP Authentication in ASP.NET'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13221527.post-111721642971781292</id><published>2005-05-27T13:44:00.000-04:00</published><updated>2005-05-27T14:48:05.090-04:00</updated><title type='text'>How to access deleted rows in .NET dataset or datatable</title><content type='html'>&lt;h3&gt;Scenario:&lt;/h3&gt;&lt;br /&gt;1) UserInterface.dll gets typed dataset from MiddleTier.dll.&lt;br /&gt;2) UserInterface.dll modifies, inserts, and &lt;b&gt;deletes&lt;/b&gt; several rows from the typed dataset.&lt;br /&gt;3) UserInterface.dll passes modified typed dataset back to MiddleTier.dll.&lt;br /&gt;4) MiddleTier.dll needs to figure out what rows were modified, inserted, and &lt;b&gt;deleted&lt;/b&gt;, then MiddleTier.dll needs to read these rows and prepare SQL command for the database.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What can we easily do:&lt;/h3&gt;&lt;br /&gt;- We can get access to modified and inserted rows:&lt;br /&gt; ds.GetChanges(DataRowState.Added);&lt;br /&gt; ds.GetChanges(DataRowState.Modified);&lt;br /&gt;- We can also get access to deleted rows:&lt;br /&gt; tableDeleted = table.GetChanges(DataRowState.Deleted);&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Where the problem is:&lt;/h3&gt;&lt;br /&gt;- As soon as we try to access deleted rows we are getting exception:&lt;br /&gt;-----------&lt;br /&gt;An unhandled exception of type 'System.Data.DeletedRowInaccessibleException' occurred in system.data.dll&lt;br /&gt;&lt;br /&gt;Additional information: Deleted row information cannot be accessed through the row.&lt;br /&gt;-----------&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Solution:&lt;/h3&gt;&lt;br /&gt;We need to reject changes in tableDeleted:&lt;br /&gt; tableDeleted.RejectChanges();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Full code:&lt;/h3&gt;&lt;br /&gt;   TestDataSet ds = new TestDataSet();&lt;br /&gt;   TestDataSet.TestTableDataTable table = ds.TestTable;&lt;br /&gt;   table.Rows.Add(new object[] {1, "key1", "Test1"});&lt;br /&gt;   table.Rows.Add(new object[] {2, "key2", "Test2"});&lt;br /&gt;   table.AcceptChanges();&lt;br /&gt;   table.Rows[0].Delete();&lt;br /&gt;   TestDataSet.TestTableDataTable tableDeleted = (TestDataSet.TestTableDataTable)table.GetChanges(DataRowState.Deleted); &lt;br /&gt;   tableDeleted.RejectChanges();&lt;br /&gt;   TestDataSet.TestTableRow row = tableDeleted[0];&lt;br /&gt;   int deletedKey1 = row.Key1;&lt;br /&gt;   string deletedKey2 = row.Key2;&lt;br /&gt;   string deletedValue001 = row.Value001;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What helped to find the solution&lt;/h3&gt;&lt;br /&gt;&lt;a href="http://www.google.com"&gt;Google&lt;/a&gt; helped me to find &lt;br /&gt;&lt;a href="http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic3931.aspx"&gt;this info&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;By Ritesh Jain via DotNetMonster.com&lt;br /&gt;&lt;br /&gt;There is one alternative that u can try.........&lt;br /&gt;&lt;br /&gt;'copy all the Deleted Rows into another Tables&lt;br /&gt;dim dtDeleted as Datatable&lt;br /&gt;&lt;br /&gt;dtDeleted = dtDetail.GetChanges(DataRowState.Deleted)&lt;br /&gt;dtDeleted .RejectChanges &lt;br /&gt;&lt;br /&gt; With cmdDel&lt;br /&gt;  Dim dr as DataRow&lt;br /&gt;  For Each dr In dtDeleted.Rows '&lt;br /&gt;   .CommandText = "DELTE FROM Table1 WHERE Id = " &amp; dr!Id&lt;br /&gt;   .ExecuteNonQuery()&lt;br /&gt;  Next&lt;br /&gt; End With&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13221527-111721642971781292?l=developmenttips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://developmenttips.blogspot.com/feeds/111721642971781292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13221527&amp;postID=111721642971781292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/111721642971781292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13221527/posts/default/111721642971781292'/><link rel='alternate' type='text/html' href='http://developmenttips.blogspot.com/2005/05/how-to-access-deleted-rows-in-net.html' title='How to access deleted rows in .NET dataset or datatable'/><author><name>Dennis Gorelik</name><uri>http://www.blogger.com/profile/17700219093521377626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ACJmPV1MOvQ/SbMA_vU1x0I/AAAAAAAAAWQ/AivIFhSi_5g/S220/Dennis2009Mar07.jpg'/></author><thr:total>0</thr:total></entry></feed>
