<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Architecture</title>
        <link>http://theruntime.com/blogs/jaykimble/category/47.aspx</link>
        <description>Architecture</description>
        <language>en-US</language>
        <copyright>Jay Kimble</copyright>
        <managingEditor>jkimble@gmail.com</managingEditor>
        <generator>Subtext Version 1.9.5.0</generator>
        <item>
            <title>Review: Gurock SmartInspect</title>
            <link>http://theruntime.com/blogs/jaykimble/archive/2008/08/12/review-gurock-smartinspect.aspx</link>
            <description>&lt;p&gt;About a year ago, I was blogging at CodeBetter and I was given a product in hopes that I would review it. In fact I had won a copy of this product in the past. I promised and promised that I would take a look at it, but I never got around to it.&lt;/p&gt;  &lt;p&gt;Mainly because I didn’t have a use (or thought I didn’t have a use) for a logging product at the time. Logging isn’t really all that "sexy" and I was trying to dive deep into all kinds of things.&lt;/p&gt;  &lt;p&gt;Well, with my day job we ran into a some problems that after I analyzed the errors I realized that I was missing an important piece of the puzzle... So I started thinking about what I might need. Enter that product that I hadn’t had a chance to review...&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Logging isn’t "sexy" or is it?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;It’s only "sexy" when you NEED it. And when you need it you need something good. SmartInspect is really, really cool, and IMO after finally taking a day with it, I can say it’s also "sexy." It really brings your logging to life.&lt;/p&gt;  &lt;p&gt;I’m an ASP.NET guy, so what I need is to be able to track a user through a site and see there path up to the error. SmartInspect allows you to create "sessions" of logs that follow a user via their session. You can also use a default session (if you are using something more single-processed/threaded).&lt;/p&gt;  &lt;p&gt;You can colorize different things in the log and can even see the properties of an object that you throw into the log (you simply tell it to log the full object passing just the variable).&lt;/p&gt;  &lt;p&gt;The best part for me was it was pretty simple. I did a fairly advanced thing with it in relatively short order (Sessions, logging our SQL calls), and it really wasn’t that much work. The code that you have to inject into your app (yes, you have to inject code into your app) is pretty trivial.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Remote Logging viewing&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;What I really liked was that the SmartInspect log console feels like VS and is a TCP/IP server which means that you can point an app at a machine to log via TCP/IP. The version that I was given even included source for the logging library (and I think everything else). Yes, you can log to a file and other more traditional log destinations... but the TCP/IP server is so "sexy."&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Sold&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Anyway, my workplace will be purchasing a copy of it... and it’s a tool you’ll probably need at some point. Here’s the web site (go check it out for yourself) - &lt;a title="http://www.gurock.com/products/smartinspect/" href="http://www.gurock.com/products/smartinspect/"&gt;http://www.gurock.com/products/smartinspect/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;BTW, it’s for Delphi, and Java, too.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2659.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jay Kimble</dc:creator>
            <guid>http://theruntime.com/blogs/jaykimble/archive/2008/08/12/review-gurock-smartinspect.aspx</guid>
            <pubDate>Tue, 12 Aug 2008 14:10:27 GMT</pubDate>
            <wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2659.aspx</wfw:comment>
            <comments>http://theruntime.com/blogs/jaykimble/archive/2008/08/12/review-gurock-smartinspect.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2659.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Writing Better JS Components</title>
            <link>http://theruntime.com/blogs/jaykimble/archive/2008/08/12/writing-better-js-components.aspx</link>
            <description>&lt;p&gt;Perry (my boss... a developer/manager... he codes and manages) and I have been having a recurring conversation lately. One that keeps bringing to my mind a product that I knew about when I worked for ZAC Catalogs (way back in the day). I would daresay that none of you had even heard of it (although we did pick it up as a result of Xtras carrying it, so maybe a few of you knew about it). I believe it was a called "MFC DataGrid Wizard" or something like that. Anyway what it did was build a custom DataGrid component for you based on selections in a wizard. You selected what features you needed and then it would take it’s full-featured Grid source code (which came with the component) and would dynamically generate a full blown component for you with just the features you needed. &lt;/p&gt;  &lt;p&gt;There are two reasons this has become a topic for discussion for me. The first is that we are currently struggling with a set of third party components that a prior developer/manager pushed all over our main site. The components are ones that you have probably heard great things about them and they are pretty cool. The problem is when you shove these components everywhere! We are having ViewState issues among other things... One of the components is a full-featured Grid control (client-side) that while nice we usually only use as a glorified listbox (we use it for selecting an item). As a result I built a specialized DataGrid for our company (one that I’ll be doing a walkthrough on its codebase at the first &lt;a href="http://theruntime.com/blogs/jaykimble/archive/2008/07/17/tampa-user-experience-tux-user-group-is-coming-september-10th.aspx"&gt;TUX user group meeting next month&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;The other reason is this &lt;a href="http://weblogs.asp.net/bleroy/archive/2008/08/05/need-a-simple-grid-for-asp-net-ajax.aspx"&gt;post from Bertrand LeRoy&lt;/a&gt; where he talks about a &lt;a href="http://weblogs.asp.net/bleroy/archive/2008/08/05/need-a-simple-grid-for-asp-net-ajax.aspx"&gt;simple grid for ASP.NET&lt;/a&gt;. Here’s my problem with Bertrand’s post. The grid he talks about as being simple really doesn’t sound all that simple to my ears. Let me list a couple features:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Column drag/drop&lt;/li&gt;    &lt;li&gt;Different column types&lt;/li&gt;    &lt;li&gt;Data Sorting/Paging&lt;/li&gt;    &lt;li&gt;Inline editing&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Now mind you these are awesome features if you need them all then you would want to use something like this, but a lot of times what we need is something simpler. You could use the aforementioned grid for this, but the grid will probably still use ViewState (because it needs it maintain state for the paging, sorting, and editing features). It might need several more scripts or &amp;lt;shudder /&amp;gt; it’s script might be 500-1000 lines longer because of the added features.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A Better Way&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I have been thinking about a better way to "do" script components. We really need to have a wizard that asks us what we will be needing in the components and then the main script file can be customized (as can the server side code) to remove certain things. It could be done really easy with templates for the script. You need a template for the main file, and additional includes based on features. The server side would work pretty much the same way. I know that no company really wants to give away their source, but even if they were able to do this for script code that would make our lives a lot easier.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2658.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jay Kimble</dc:creator>
            <guid>http://theruntime.com/blogs/jaykimble/archive/2008/08/12/writing-better-js-components.aspx</guid>
            <pubDate>Tue, 12 Aug 2008 12:04:33 GMT</pubDate>
            <wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2658.aspx</wfw:comment>
            <comments>http://theruntime.com/blogs/jaykimble/archive/2008/08/12/writing-better-js-components.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2658.aspx</wfw:commentRss>
        </item>
        <item>
            <title>An Answer to my post for young programmers</title>
            <link>http://theruntime.com/blogs/jaykimble/archive/2008/06/24/an-answer-to-my-post-for-young-programmers.aspx</link>
            <description>&lt;p&gt;My good buddy (actually my best friend from High School), "The Witt" complained that I wasn’t being helpful to programmers who are trying to learn the craft when I posted two weekends ago on "&lt;a href="http://theruntime.com/blogs/jaykimble/archive/2008/06/14/a-question-you-should-ask-when-hiring-a-non-entry-level.aspx"&gt;A Question you should ask when hiring a non-entry level developer&lt;/a&gt;." (OK, he wasn’t the only one... but, hey, we have a history, so he can get me to post a response, and you can’t... deal...) &lt;/p&gt;  &lt;p&gt;I decided that our subsequent conversation in email would make a good followup post for those who want to know what they should be doing, and with his blessing I am posting an edited version.&lt;/p&gt;  &lt;p&gt;[It started with this comment]&lt;/p&gt;  &lt;p&gt;&lt;font color="#008000"&gt;The Witt - &lt;em&gt;OK I know that I am new to the ASP codeing info.       &lt;br /&gt;I understand the security issues ( or at least, what might happen with leaving every thing wide open). BUT, Having just completed two semesters of nothing but ASP I just don’t see what wrong... I AM NOT a seasoned programmer...and my classes taught us to connect inthis very manner you discribe...        &lt;br /&gt;can you eleborate for those of us that are trying to learn? show us what you would do instead?        &lt;br /&gt;thanks in advance&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Jay (in Email now)- I know I probably made some harsh statements there (in my blog post). I meant it to be hard, but it was as much about seeing some consultant coming in and writing crappy code against my APIs and leaving HUGE security holes in my website.&lt;/p&gt;  &lt;p&gt;The major point is for ASP.NET that you should always use Command objects with parameters... something like this (code may not compile cause its off the top of my head... there’s probably an error in there somewhere...)&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; query &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; = &lt;span style="color: #006080"&gt;"select field1, field2, field3 from someTable where ID = @TableID"&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; Cmd.CommandText = query&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; Cmd.Parameters.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DbParameter(&lt;span style="color: #006080"&gt;"TableID"&lt;/span&gt;, cbo.Value)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; &lt;span style="color: #008000"&gt;' Code continues....&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The trick is in using the "@" variable in the query, and using the Parameters collection. When this gets shoveled down to the database it gets sent differently and if someone tries to change that "cbo.Value" within the http post by trying to add their own SQL it will fail.&lt;/p&gt;

&lt;p&gt;I know that changing the variable in the http post statement sounds advanced... go here --&amp;gt; &lt;a href="http://www.bayden.com/TamperIE/"&gt;http://www.bayden.com/TamperIE/&lt;/a&gt;, download the TamperIE tool (for IE)  and try it out... You’ll see that you can in fact force whatever values you want into the post.&lt;/p&gt;

&lt;p&gt;As far as other dev environments go (I know you deal with a couple others), you want to figure out how to send a prepared statement to whatever SQL Server you are dealing with (ms access has these as well, so does Oracle and everything else I can think of... even the free PostgreSQL has them). &lt;/p&gt;

&lt;p&gt;Anyway, I see you as someone who’s growing as a developer... you’d not go into an interview and present yourself as more than you are... that too is the problem...&lt;/p&gt;

&lt;p&gt;Do you mind if I post this (more or less?) as a new blog post?&lt;/p&gt;

&lt;p&gt;&lt;font color="#008000"&gt;The Witt- I don’t mind in the least…&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#008000"&gt;          Like I said I am trying to learn. The “@” tucked in front… I always thought that was just to get the info from the current page. It’s nice to know what that really does. I do use that for most of my sites. I just never knew all the reasons.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#008000"&gt;I think that is the problem with a lot of the schools today. They are just pushing the students out and they really don’t know what they are doing. (Not that I always know what I’m doing). &lt;/font&gt;&lt;/p&gt;

&lt;p&gt;---------------&lt;/p&gt;

&lt;p&gt;Ok. it’s not all that edited. One more thing I forgot to mention. If you use an ORM or something that builds classes for you, then you probably are getting this type of functionality (just about every ORM I know of uses prepared SQL statements to push data). My favorite ORM is SubSonic (and I know others rave about NHibernate)... It the Java world I use Apache Cayenne (and people rave about Hibernate over there)&lt;/p&gt;

&lt;p&gt;---------------&lt;/p&gt;

&lt;p&gt;BTW, I take great pleasure in mentioning that The Witt turns $28 (that’s hex) in a little less than 2 months... unfortunately I turn $28 about 2 weeks before him.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2429.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jay Kimble</dc:creator>
            <guid>http://theruntime.com/blogs/jaykimble/archive/2008/06/24/an-answer-to-my-post-for-young-programmers.aspx</guid>
            <pubDate>Wed, 25 Jun 2008 01:15:35 GMT</pubDate>
            <wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2429.aspx</wfw:comment>
            <comments>http://theruntime.com/blogs/jaykimble/archive/2008/06/24/an-answer-to-my-post-for-young-programmers.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2429.aspx</wfw:commentRss>
        </item>
        <item>
            <title>A Question you should ask when hiring a non-entry level developer</title>
            <link>http://theruntime.com/blogs/jaykimble/archive/2008/06/14/a-question-you-should-ask-when-hiring-a-non-entry-level.aspx</link>
            <description>&lt;p&gt;And I mean every developer. If you are an entrepreneur and you are hiring a consultant to work on your hot idea you need to do this. It could cost you everything if you don’t.&lt;/p&gt;  &lt;p&gt;I recently took on a side project. It’s a return to a project I did 2 years ago. Since I have worked on it there have been at least 2 other people on the project. I’m writing this for the Business Development guy (the guy I assume hired the other folks). I am not writing this to "cut" on the other developer (I am not perfect), but I did detect a flaw that for me is critical. So one of the other guys is not only not up to snuff IMNHO, but s/he shouldn’t be working anywhere as anything but entry level (I’m sorry to be so harsh, but when you understand what I’m talking about you’ll why I’m being so harsh).&lt;/p&gt;  &lt;p&gt;One more thing because I’m writing this more for a non-technical person. You don’t need to pretend to be technical. Pretend like you’ve hired someone to help you assess a programmer, and this is your one and only question.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Question&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When should/would you ever right code like the following (pick the version that applies to you):&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;// C# Code&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; query = &lt;span style="color: #006080"&gt;"select * from SomeTable where SomeID = "&lt;/span&gt; + cboField.SelectedValue;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; SqlCommand cmd = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SqlCommand(query, connection);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; SqlDataAdapter da = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SqlDataAdapter(cmd);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; da.Fill(ds);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;' VB.NET (actually most versions of VB look something like this)&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; query &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; = &lt;span style="color: #006080"&gt;" select * from SomeTable where SomeID = "&lt;/span&gt; + cboField.SelectedValue&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; SqlCommand(query, connection)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; da &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; SqlDataAdapter(cmd)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; da.Fill(ds)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; ' Thank you Telerik &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; the quick translation&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Answer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The simple answer is nowhere. &lt;/p&gt;

&lt;p&gt;The biggest reason is security. That code enables something called SQL Injection. There are utilities that exist that will let a hacker (actually you as a non-technical person could use them) to steal your entire database via a single whole in your app like this. All kinds of bad things can happen as a result of this. I recently switched grocery stores because my old grocery store had an IT problem where my debit card number got stolen. That kills it for me. I won’t be going back. The same will be true of your customers (if you don’t get sued). So the proper answer to this question means a lot.&lt;/p&gt;

&lt;p&gt;A second option is that the programmer might mention the DataSet. This is really less critical (and there are times to do this). The first line of the code is what should be singled out in your mind, because this will tell you if the programmer "gets" security. If s/he doesn’t understand it here... s/he probably won’t understand it elsewhere (you probably have a non-professional programmer pretending to be a professional programmer... take this from a guy who started as a non-professional and doesn’t have a programming degree). &lt;/p&gt;

&lt;p&gt;If they suggest making any changes to the first line, then they know what the problem is. They pass. If they leave that first line alone. They fail. By the way, it doesn’t matter whether the programmer is building a web app, a windows app, or some kind of service, this is a universal mistake.&lt;/p&gt;

&lt;p&gt;No matter how cheap they are they are creating problems that you don’t need. You can get a good programmer for a lower rate. For instance, I lowered my rate considerably to get a small piece of the pie on the app I’m working on. &lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2424.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jay Kimble</dc:creator>
            <guid>http://theruntime.com/blogs/jaykimble/archive/2008/06/14/a-question-you-should-ask-when-hiring-a-non-entry-level.aspx</guid>
            <pubDate>Sat, 14 Jun 2008 13:18:23 GMT</pubDate>
            <wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2424.aspx</wfw:comment>
            <comments>http://theruntime.com/blogs/jaykimble/archive/2008/06/14/a-question-you-should-ask-when-hiring-a-non-entry-level.aspx#feedback</comments>
            <slash:comments>14</slash:comments>
            <wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2424.aspx</wfw:commentRss>
        </item>
        <item>
            <title>To Cache, To Static, or To Session &amp;quot;When?&amp;quot; is the question</title>
            <link>http://theruntime.com/blogs/jaykimble/archive/2008/06/10/to-cache-to-static-or-to-session-quotwhenquot-is-the.aspx</link>
            <description>&lt;p&gt;DonXML has an interesting article over &lt;a href="http://donxml.com/allthingstechie/archive/2008/06/06/Cache-Or-Session-State-_2D00_-Similar-But-Different.aspx"&gt;here&lt;/a&gt; that got me thinking about a technique I have been using for years now, and I’m not sure I’ve seen much written about it.&lt;/p&gt;  &lt;p&gt;The basic tenet begins like this: I avoid session like the plague (not sure why except I have visions of some abuses I have seen... like full DataTable’s stored in session). The only time and I mean the ONLY TIME I use Session is if I have a value that needs to be associated with a user across the WHOLE site. As a result I really try to design my model where there are minimal values that need to be associated with a user site-wide.&lt;/p&gt;  &lt;p&gt;What I have seen is that values come in 3 basic variations as far as Web site variables go: Values associated with a user everywhere, values associated with a user necessary for a few pages, values that really are application level values.&lt;/p&gt;  &lt;p&gt;My suspicion about "&lt;strong&gt;Values associated with a user everywhere&lt;/strong&gt;" is that they are not as prevalent and are often the result of programmers either not fully understanding web apps, they just aren’t thinking things through, or they are pushing a value into session site-wide when they only need it in a couple places. Treat Session like you do ViewState: it is a snake (maybe a poisonous one) that while necessary to kill the rats in your back yard due to the citrus trees, you don’t want a dozen snakes in the backyard either... Only use the number of snakes that you need (if you have no rats then 0 is the perfect number of snakes). So the lesson here is to really look at your user-related values: determine if they really are used everywhere, and determine if they need to be available in memory the whole the user is on the site.&lt;/p&gt;  &lt;p&gt;For &lt;strong&gt;values associated with a user necessary for the a few pages&lt;/strong&gt;, I tend to use cache, or I do use Session (but I clean up immediately after I’m done). When I use Cache I factor in the user’s Session ID. The thing I like about Cache is that I have a much richer set of expiration options. Session sticks while a user is clicking around the site... Cache let’s me absolutely set an expiration time. I also am aware of the fact that Cache can be unloaded early (so I use Cache as a temporary place for a value knowing that I may need to retrieve it again). If it’s something that isn’t stored elsewhere then into Session it goes (even if I have to delete that Session var later). It’s really about managing the data in memory.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;For the application type values&lt;/strong&gt;, I usually forget about the whole Application mechanisms (you might use them, but I do something else), I like to use static/shared values on individual classes. This has the effect of better organizing your code (and if you do any else with the class it simplifies things... I suspect some automated test guys would agree with me on this point). Why mention these here? Well I have seen my share of things that were really application related or indexed application related (such as storing this customer’s company info in session... that really should be either a cache or a static, and it should be retrievable by some company id).&lt;/p&gt;  &lt;p&gt;Don’s post was originally spawned by the new Velocity cache from MS. Honestly the only comment I have on it is that I wish they had chosen a different name. I hear Velocity and I think about the text template engine (the one for Java... but the one for .NET is nvelocity)&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2420.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jay Kimble</dc:creator>
            <guid>http://theruntime.com/blogs/jaykimble/archive/2008/06/10/to-cache-to-static-or-to-session-quotwhenquot-is-the.aspx</guid>
            <pubDate>Tue, 10 Jun 2008 15:15:35 GMT</pubDate>
            <wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2420.aspx</wfw:comment>
            <comments>http://theruntime.com/blogs/jaykimble/archive/2008/06/10/to-cache-to-static-or-to-session-quotwhenquot-is-the.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2420.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Silverlight2 Programming: The Designer Rule</title>
            <link>http://theruntime.com/blogs/jaykimble/archive/2008/05/13/silverlight2-programming-the-designer-rule.aspx</link>
            <description>&lt;p&gt;I’m starting a new series on Silverlight2. I am currently building a little SL2 prototype, and as I am learning things I thought I would write them down here.&lt;/p&gt;  &lt;p&gt;The first rule deals with working with Designers. It is stated as such.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;"Prefer XAML code to CLR/DLR code when it comes building interfaces"&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Note the word "prefer" here. That word means "usually", "normally", or "unless there is an exception."&lt;/p&gt;  &lt;p&gt;This is best explained by some C# code I saw the other day. It looked something like this:&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ElementX = &lt;span style="color: #006080"&gt;@"&amp;lt;div class='twocolumndiv'&amp;gt;&amp;lt;span class='singlecolumn'&amp;gt;{0}&amp;lt;/span&amp;gt;&amp;lt;span class='singlecolumn'&amp;gt;{1}&amp;lt;/span&amp;gt;"&lt;/span&gt;;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The problem with the above code is that you’ve embedded it into your code. It’s effectively buried. If someone else needs to change this template to say add a field or to make changes in any manner, they are scanning the code looking for this (provided they know where to look); this will be the cause of much swearing and maligning of your name.&lt;/p&gt;

&lt;p&gt;To make matters worse, if you have a web designer you have effectively removed their visibility to this code (maybe this point is made a little sharply; I know some web designers who would be scanning the code as well, but they wouldn’t be happy).&lt;/p&gt;

&lt;p&gt;So how does this relate to SilverLight 2? Simple, you should try to avoid instantiate controls on your Silverlight views (pages??) that a designer has no visibility to (in other words, using a UserControl that has an associated XAML is fine, but instantiating a new UserControl and throwing a new layout and a bunch of text boxes should be done with great care... you should know why you did it that way). &lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2407.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jay Kimble</dc:creator>
            <guid>http://theruntime.com/blogs/jaykimble/archive/2008/05/13/silverlight2-programming-the-designer-rule.aspx</guid>
            <pubDate>Tue, 13 May 2008 16:04:43 GMT</pubDate>
            <wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2407.aspx</wfw:comment>
            <comments>http://theruntime.com/blogs/jaykimble/archive/2008/05/13/silverlight2-programming-the-designer-rule.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2407.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Composition vs. Inheritance...</title>
            <link>http://theruntime.com/blogs/jaykimble/archive/2008/05/02/composition-vs.-inheritance.aspx</link>
            <description>&lt;p&gt;[I really should stay out of these discussions... I really should, but I can’t resist.]&lt;/p&gt;  &lt;p&gt;The other day I saw an article on Composition over Inheritance (I forget where I saw it). The article did a good job of explaining what "composition" is. This is my simplistic understanding (which means that someone will probably come in and tell me I have it ALL wrong... what else is new?): "composition" means essentially wrapping objects instead of direct inheritance (so instead of inheriting from X you instead have a private instance of X in your class that you use, but you create your own interface possibly something that looks totally different from the "wrapped" class).&lt;/p&gt;  &lt;p&gt;I only really have one concern in all this; at least with what I have read (and not necessarily the last article I read on this subject). The advice almost comes across as "thou shalt avoid inheritance (if you can)." The implication is that inheritance is something bad. Now I understand that inheritance can complicate things in a unit testing scenario (be it TDD or POUT).&lt;/p&gt;  &lt;p&gt;The problem is that implication that inheritance is bad. I think it might be better to discuss some things I recently did in the DLRScript source code. I recently used composition to build a compatible XMLHttpRequest object in my DLRScript environment (no, it’s in the unreleased bits which will be released as soon as I can test it properly... I was hoping for a JQuery compatibility, but it looks like that ain’t happening this iteration). I wrapped the SilverLight HttpWebRequest object. This let me create a Mozilla/Safari-compatible XmlHttpRequest object that has no extra features other than what those objects contain.&lt;/p&gt;  &lt;p&gt;That said I also have some code I have had in place for some time that also works well. This code inherits from the SilverLight HtmlDocument, and creates a document object that is more in line with what we are used to seeing in client script in the browser. I also have a class that wraps HtmlElement to create an object that is also more familiar to JavaScript junkies. I recently added a style property to each of these elements, for instance. My style property simply utilizes the setStyle/getStyle methods (I forget the actual method names) which is already available in the HtmlElement (for instance) to get/set values of individual style properties. In this case having a few dangling methods doesn’t really hurt because I already need 90% of what is already there. I do have to override a few methods since I need to emit DomElements (my inherited form of the HtmlElement) from getElementById instead of an HtmlElement.&lt;/p&gt;  &lt;p&gt;My point is this. Think. Think! THINK!!! &lt;strong&gt;THINK!!&lt;/strong&gt; Don’t just blindly follow a rule. Look at your code. Take control of it. Make it do what you want it to do. Make sure that it makes sense. and if someone else is going to be using it, ask someone else if they think what you are doing makes sense. And then DOCUMENT IT!! At least provide an example of how to use it.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2402.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jay Kimble</dc:creator>
            <guid>http://theruntime.com/blogs/jaykimble/archive/2008/05/02/composition-vs.-inheritance.aspx</guid>
            <pubDate>Fri, 02 May 2008 16:41:52 GMT</pubDate>
            <wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2402.aspx</wfw:comment>
            <comments>http://theruntime.com/blogs/jaykimble/archive/2008/05/02/composition-vs.-inheritance.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2402.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>