Dave Burke - A freelance .NET Developer specializing in Online Communities

A freelance .NET Developer
Posted: by

Comments

Bill Rodenbaugh said:

Heres a fun way to make sure you are actually using what you instantiate.

private UtilsDB _UtilsDB;

protected UtilsDB oUtilsDB
{
get
{
if ( _UtilsDB; == null )
_UtilsDB = new UtilsDB();

return _UtilsDB;
}
}

--bill
bill@gamespy.com
# June 21, 2003 12:40 AM

Dave Burke said:

Whoa! Beauty in simplicity. Never woulda thought of it. Thanks, Bill.
# June 21, 2003 8:27 AM

julie said:

Holy Crap dave! First you actually used the comment function instead of emailing me directly. Next thing I know you're here on the blogs! You didn't even tell me you were gonna do it. Geeze. Very cool.
julie
# June 21, 2003 9:16 AM

Roy Osherove said:

huh?
# June 21, 2003 3:14 PM

Daniel Nolan said:

Being from "quaint" old england I generally spend all day drinking tea. With the occasional coffee thrown in. I've taken a liking to the lemon/vanilla cola's they've just released over here though, mmmm.
# June 21, 2003 4:05 PM

Phil Scott said:

Best bet for me is the ol' stand bye, Mountain Dew. I don't like the flavor and sometimes it gives me an upset stomache.

I can drink Kool Aid way to fast. I would spend 10% of my time filling up my cup and the other 10% using the facilities. Mountain Dew on the other hand is a little too tough to just chug like kool aid.

As for food, you cannot beat chex mix. Mmmmmmm chex mix.
# June 21, 2003 4:06 PM

Ken said:

All about the Ritz Bitz and either Barqs Root Beer or Dr. Pepper. This isn't especially health though, so sometimes I just drink a bunch of water... and water makes for a lot of potty breaks which are good to recollect your thoughts on the problem at hand.
# June 21, 2003 8:51 PM

TrackBack said:

Jim Meeker
# June 22, 2003 12:07 AM

TrackBack said:

Dave Burke
# June 22, 2003 12:07 AM

julie said:

styrofoam cups - GROSS. I work at home too. Nearest Dunkin' Donuts is 12 miles. If I need to get outta the house we have the best bakery in Vermont in our town (foothills bakery in Fairfax) and I bring my yuppy VPR (vermont public radio) travel mug and fill it up and get a yummy scone. Otherwise, we use our groovy Chemex coffee pot to brew up some Green Mountain Coffee which I drink out of one of the many beautiful hand made pottery mugs I have collected (or made myself) over the years. Really Dave! Styrofoam. Blecch!!
# June 22, 2003 9:57 AM

Neil said:

I have been hearing the occasional complaints about web apps like this for the last couple of years. I too believe that for complex applications, rich clients are far better than web clients. Unfortunately the majority of the industry appears to think otherwise.

Neil
# June 23, 2003 11:55 AM

Darren Neimke said:

Dave, that pretty much mirrors my own experiences :-)

I think that I've always been a big fan of server controls - and in particular the databinding behaviour - since reading the early Dino Esposito books.

The big thing for my development over the past 12 months has been the emergence of a clear "style" of architecture. As such, there's a much cleaner separation of logic throughout the layers of my applications.

Thanks for the post; it's always good to read about shared experiences :-)
# June 24, 2003 1:17 AM

Darren Neimke said:

I should add... one area where our paths have diverged is that 12 months ago I was writing in C# and VB, whereas today I've dropped C# altogether. What was the catalyst for your move away from VB? Was it employer induced or self-regulated?
# June 24, 2003 7:14 AM

Dave Burke said:

Its funny, really. I started writing web apps in 1995 using PHP2, then PHP3. PHP is very C-like. Even in the 80's I had an interest in the more economic syntax of C, but could not get over the malloc/printf/--> hump.

I started in VB.NET because VB syntax was familiar and I needed as much help as possible getting a handle with .NET. After a year I made the switch. I have no prejudice against VB.NET. I LOVE the VS.NET editor support for VB.NET compared to C#.NET support (which is still okay, but not as good as VB.NET to me.) I am also impressed by how many cool developer studs continue to work in VB.NET.

I do like the lesser code factor in C#, if only for aesthetic reasons. Its...uh, prettier. I really don't have any stronger feelings about the differences than that.

I work for a smaller company, so I have the privilege of making those decisions. I'd be interested in why you stayed with VB.NET. (You don't have to be as wordy as my comment here!)

Good talkin' to you.
# June 24, 2003 8:19 AM

Darren Neimke said:

My reason for choosing VB was probably due mostly to the fact that my employer decreed it :-)

Once that choice was made for me I decided that I'd devote myself 100% to that language rather than splitting my learning across 2,3 or more languages.

To borrow a concept from Ben Elton... I think that, for many developers, VB is the language that they love to hate, then they learn to live with it, finally they hate themselves for loving it. :-)

For me, it just feels good to have the knowledge that you are able to use your language of choice to do anything that you want -- unrestricted. I'm just now starting to feel that sensation myself with VB!
# June 24, 2003 6:22 PM

Dave Burke said:

"...devote myself 100% to that language." Absolutely, Zen and the art of VB.NET. "...hate themselves for loving it." Good one! "[getting to the place as a developer]...to do anything that you want -- unrestricted." Man, I want to remember that, as there are always the ongoing choices to be made: to do what I have no experience doing, requiring google, msdn, junkies, code project, etc, etc., or to take the familiar approach, get the job done, and not grow. Thus the d.o.t.d. mentality and why this blog stuff is such a motivator. "What did I LEARN today that I can record on my blog?" or "What did I take time away from banging out code for my employer to learn today for ME?" When there's no d.o.t.d., chances are good there's been just typing going on. Then you die.
# June 24, 2003 9:59 PM

Darren Neimke said:

> to do what I have no experience doing,
> requiring google, msdn, junkies, code
> project, etc, etc.,

I think that you omitted the most significant (IMHO) resource - the Starter Kits. If I had a single message for developers it would be, forget the shotgun approach of Google and Co. *until* you've uncovered the jewels from the StarterKits.
# June 24, 2003 10:45 PM

Dave Burke said:

When I say "Google, MSDN, etc" I wouldn't use a shotgun approach as a description. It's always a very narrow, focused search, which I've found to be unique to .NET. In the past I could read chapters on a subject, say, MSMQ, or, in the case of COM+, several books before getting dirty and have to use the information. In .NET everything has speeded up and I need information on this very particular issue today. Then I code for a while and need a particular bit of info on a particular issue again. This is why Google's Advanced Groups Search Page is my home page.

Would you please be so good to tell me what you referring to in "the Starter Kits." Do you mean the Walkthroughs and Getting Started guides in VS.NET? Thanks.
# June 24, 2003 11:58 PM

Darren Neimke said:

The StarterKits that I'm referring to are the ASP.NET Starter Kits here:

http://www.asp.net/Default.aspx?tabindex=9&tabid=47

I can guarantee (actual guarantee may not be valid) that any of the fundamental, standard features that a developer would need to develop in a *normal* modern web application can be learned by studying the architecture and tips-n-tricks in those applications.

Features of those apps that make them a good learning tool are:

- they have been developed and scrutinized by experts
- they come in C#, VB and JScript
- they come in either VS (code-behind) or inline version
- they come with 30 page architecture documents
- they have forums to discuss issues

Somehow people are missing the Starter Kits and I'm not really sure why. Too often I see a developer travel down the path of developing a complex solution for something that is abundantly covered in the Starter Kits.

I can say - in all honesty - that I rarely, if ever have to google a solution for 95% of my dynamic, data-driven web application needs because I can fall back on the knowledge that I've gained by having a deep understanding of how the StarterKit applications were built. That's the truth!

What I can agree with though, is that for an MSMQ, COM+ etc., solution, I most certainly would need to ask Mr. Google. But, the StarterKits cover all of my ADO, Server Controls, and report building needs.
# June 25, 2003 12:46 AM

Dave Burke said:

Well I certainly cut my .NET teeth (like thousands of other guys) on IBuySpy over a year ago. I've seen these particular packages, but never pursued them as an object of study. Definitely good advice though! Thanks, Darren.
# June 25, 2003 12:57 AM

TrackBack said:

ScottW's ASP.NET WebLog
# June 25, 2003 1:06 AM

julie said:

Dave-
check out the Data Access application block and some of the other app blocks here:

http://www.microsoft.com/resources/practices/Audiences.asp#dev
# June 25, 2003 1:38 AM

Dave Burke said:

Now that's a whole bunch of abstracts! :-)

Thanks for the reminder.
# June 25, 2003 8:43 AM

Greg Robinson said:

+1
# June 25, 2003 3:03 PM

Daniel Turini said:

Regular Expressions are not subject to this kind of error...
# June 27, 2003 7:45 AM

Dave Burke said:

Thanks, Daniel. Will definitely spend some quality time with the regex factor.
# June 27, 2003 8:43 AM

Kit George said:

Sorry to see the confusion here. I do personally believe the API is intuitive, but I want to see if writing this slightly differently can help. I am a bit confused that subtracting the position of the start of the number wouldn't work, since it should.

Here's a rewrite:
string year = "2003";
string s = <your http string>;
string search = "/" + year + "/";
int i = s.IndexOf(search) + search.Length;

if (i >= 0) {
string pruid = s.Substring(i, s.IndexOf("-") - i );
}

This should work just fine

Console.WriteLine(pruid);
# June 27, 2003 9:22 PM

Dave Burke said:

Kit, you made that substring method a beautiful thing with the additional two lines of assigning the /year/ string to a variable and determining its length. My "less lines are best" philosophy sometimes prevents me from a more simple approach. Thanks very much for the lesson.
# June 28, 2003 8:05 AM

Alex Hoffman said:

Your opinion is more important than the "top shelf" shakers who have been unable to agree even a simple specification like RSS.

But look at it from a laymans perspective. With all the technology and all the opportunities, all developers can focus on are weblogs?

Rather than be the next big thing, I believe the value of weblogs is likely to diminish as noise overtakes real content. Isn't that happening now?

Yes, RSS will grow in popularity as a mechanism for the syndication of information - but lets keep it in perspective.
# June 28, 2003 6:43 PM

Kjell-Åke Andersson said:

Have you tried .LastIndexOf ?
# June 30, 2003 10:15 AM

Don McNamara said:

I agree with Daniel.. (I am not a regex expert, so there may be a better way...) Regex isn't always the most readable, but I still like it.

private string ExtractPruid(string url)
{
const string pattern = @"http://[a-zA-Z0-9\/]+\/(?<pruid>[0-9]*)\s*-\s*.*";
return Regex.Match(url, pattern).Groups["pruid"].Value;
}

string s = @"http://server/workspace/Documents/Projects/2003/20026969 - Project Description";
MessageBox.Show("(" + this.ExtractPruid(s) + ")");
# June 30, 2003 10:31 AM

Frans Bouma said:

"I for one would rather be responsible for understanding these basic processes and occasionally finding humor in doing something stupid than to use a code generator approach and not have a sound understanding in .net coding principles."
I assume you compile your code with your own C# compiler as well? ;)

Not Invented Here-syndrome all over the place, m8.
# July 2, 2003 3:12 AM

wan mohd afendi said:

I have always using #region . But i'm not put the methods, properties for the region description. I think it's good idea
# July 2, 2003 9:01 AM

Drew Robbins said:

Great idea. I do the same thing with my ASPX files when appropriate.
# July 9, 2003 12:37 AM

Darren Neimke said:

Dave, this is what I came up with last week:

http://weblogs.asp.net/dneimke/posts/9689.aspx
# July 9, 2003 8:44 AM

Chris Frazier said:

"sign from God telling me to get away from curly brackets ..."?

So you'll be using VB.NET then?<g>
# July 11, 2003 11:49 AM

Greg said:

We just got back from 8 days in Salvo, NC...what a joy
# July 11, 2003 12:56 PM

Roy Osherove said:

I don't understand why this has not worked for you. The tables names are generated only to be used later inside the TableMappings colection of the dataset.
I'd love to see the code after you applied the 'fix' that did not work for you. perhpas something was missed? Also, I'd want to see the code that calls the FillDataset Method and failes.
send it over to royo@iserializable.com
# July 30, 2003 4:43 PM

Roy Osherove said:

PS:
Execuse the typos. it's almost midnight:)
# July 30, 2003 4:53 PM

Ben Richardson said:

Could you post your port of the v2.0 application block for v1.0 of the Framework somewhere for those of us that are lazy?
# July 30, 2003 7:20 PM

TrackBack said:

# July 30, 2003 10:06 PM

Ben Richardson said:

Thanks!!
# July 30, 2003 11:10 PM

HumanCompiler said:

AFAIK, it's usually all the history storage and what not getting left around, clipboard items, etc.

Good tip! :)
# July 31, 2003 1:20 AM

Darrell said:

Actually, Photoshop grabs a certain percentage of available RAM when opened to make it work faster. To decrease the amount of RAM used by Photoshop (v6), go to Edit/Preferences/Memory & Image cache, and change the percentage of Used by Photoshop to a more manageable number.
# July 31, 2003 1:14 PM

sirshannon said:

also make sure to install the patch for PS6. It solved the memory leak I was having here.
# July 31, 2003 9:03 PM

TrackBack said:

# August 5, 2003 12:06 PM

TrackBack said:

# August 14, 2003 10:49 AM

Shannon J Hager said:

the free textbox is available at http://revjon.com
# August 30, 2003 12:37 AM

Kris said:

Check also http://www.fredck.com/fckeditor/

Way more features then FTB
# August 30, 2003 2:01 AM

jim blizzard said:

Yikes! No! Do so with care! (Better yet, don't do it at all!) USERNAME="SYSTEM" gives ASP.NET too much power. It runs as a system account (super user in the Unix world), which means that a hacker or a poorly written app could do bad things. If you need more capability, use impersonation, etc. There are better (i.e., much less risky) ways.
# August 30, 2003 2:56 AM

Dave Burke said:

Runs as SA??? I thought it ran as the local ASPNET account. Thanks, Jim! I'll look into it.
# August 30, 2003 10:35 AM

Robert Scoble said:

I'm trying to help you code more! :-)
# August 30, 2003 11:04 AM

G. Andrew Duthie said:

As Jim points out, you most definitely don't want to "solve" your data access problems by running the ASP.NET worker process as SYSTEM. SYSTEM is an administrator-level account (which is why it "solves" your data access problem, because the Administrators group is added to SQL Server by default, and may also solve network access issues as well).

Given that both ASP.NET v1.0 and v1.1 default to "machine" (which is the ASPNET account on Win2K and XP and the NetworkService account for IIS 6...note that when IIS 6 is running in native mode, the <processModel> element is ignored), the problem with your upgrade must lie somewhere else. I would strongly recommend troubleshooting the actual cause of the problem rather than changing the ASP.NET process identity.
# August 30, 2003 12:44 PM

G. Andrew Duthie said:

BTW - During the beta for ASP.NET 1.0, the default process identity *was* SYSTEM...the team decided to change it at the last minute because it presented a significant security risk if the ASP.NET process was ever compromised.
# August 30, 2003 12:45 PM

G. Andrew Duthie said:

As with the process identity setting, changing this default in web.config (or worse, machine.config) is a bad idea. I wrote about this a while back at http://weblogs.asp.net/gad/posts/6496.aspx.

Basically, the problem with what you're doing is that if someone later adds a page to that application that accepts text input, and does not actively filter potentially harmful HTML and/or script input, your application becomes vulnerable to cross-site scripting attacks.

A better practice is to turn off request validation at the *page* level, but only *after* you've implemented filtering on the input fields (including the querystring, etc.). Remember that you should always filter *out* everything but what you want to accept, rather than attempting to filter out only the bad stuff. Writing Secure Code, 2E., by Michael Howard offers great advice on this subject.
# August 30, 2003 1:05 PM

Victor Garcia Aprea said:


If you're planning to turn off the built-in validation you should definitively write your own validation.

Here some detailed info on ValidateRequest:

http://weblogs.asp.net/vga/posts/6329.aspx
http://weblogs.asp.net/vga/posts/7170.aspx
# August 30, 2003 8:17 PM

Brian Desmond said:

I fail to see why this is required. So long as the SMTP virtual server on your Exchange box is configured to allow connections & relaying from the web server's IP, and it allows anonymous authentication, you're good to go. Check the authentication tab of the SMTP virtual server's properties. SMTP on Exchange is IIS.
# August 31, 2003 1:42 AM

Dave Burke said:

This is interesting, Brian. Thanks. My network admin partner handles configuration of the Exchange server and steps in with local server issues, but I will pass this along.
# August 31, 2003 9:51 AM

Roy Osherove said:

Ironically, the link for the ppt you write about seems to be the only one that's broken :(
# September 6, 2003 7:59 AM

TrackBack said:

# September 6, 2003 8:17 AM

TrackBack said:

# September 6, 2003 10:11 PM

HumanCompiler said:

Probably because there's only 24 hours in the day! ;) Those are the two applications that would use it the most. Even the support for .NET in Word and Excel is "hoaky" in how it actually works, IMHO
# September 6, 2003 11:31 PM

TrackBack said:

# September 7, 2003 10:58 PM

Scott Galloway said:

Except, Scott doesn't actually use the DAAB, he seems to use a modified version of the SqlHelper class in .TEXT (0.94) - I have a remodified (is that a word???) avaialble on my site, which lets you use standard DAAB stuff with the class used in .TEXT
# September 7, 2003 11:21 PM

Diego Gonzalez said:

You may want to try the last version (3.0) of the DAAB placed on GDN (http://www.gotdotnet.com/Community/Workspaces/Workspace.aspx?id=c20d12b0-af52-402b-9b7c-aaeb21d1f431)
It does not have static methods, and is prepared to be extended to different ADO.NET provider. And it also defines a couple of new features such as FillDataset, UpdateDataset and a couple of cool overloads.

I can't promess we have removed all the silly comments. :)

DiegoG
# September 8, 2003 3:25 PM

Ali said:

You don't need a while loop. When the background thread completes the operation, the callback is called. The while loop there isn't really doing anything. Also, if the web service calls throws an exception it will be thrown at the EndCoolWebServiceCall, so wrapping the EndCoolWebSericeCall method in a try-catch would be a good idea.
# September 9, 2003 9:10 AM

TrackBack said:

# September 9, 2003 4:03 PM

Steve said:

What do I owe you for the kind words ;)
# September 9, 2003 11:49 PM

Dave Burke said:

Steve, I just tried to send you an email from your dotnetjunkies .text contact page but received a "Mail Not Sent" response message. Don't know why, but the message in a nutshell said that I owe YOU, man.
# September 10, 2003 12:00 AM

Steve said:

I've had a couple people mention that the contact us page isn't working. I'll have to mention it to Donny.

eichert12 at hotmail dot com
# September 10, 2003 1:52 AM

TrackBack said:

# September 10, 2003 4:41 PM

Brian Desmond said:

Yeah, but you can change those drive letters. Just go into Computer Management (start>run>compmgmt.msc or right click my computer, manage), and then go into Disk Management.
# September 10, 2003 9:26 PM

Dave Burke said:

You're right, Brian. It was pretty funny, cause I've got a GREAT server admin guy who as soon as he received me email did just that. I frantically called him to prevent him from doing so, because I knew some things would not work, like SQL Server, for instance, which was configured for OS on one drive and data on another. It didn't. I felt I was too deep into the migration to change the basic configuration of the machine at this point. I wonder what other effects changing the drive letters would have had other than screwing up SQL Server? Thanks for the note!
# September 10, 2003 9:52 PM

John St. Clair said:

I believe this is because the service account that IIS 6 runs under (Network Service) presents an anonymous (NULL) token when accessing network resources. IIS 5 by default ran under System, which presented a machine token. So, even though the URL resources are local, the site's connection will look like an anonymous network user, and be denied. You can get around this by setting the identity on the worker process.

I'd really suggest looking up the "Windows2003 security for developers" article on MSDN, and also the eBook by Microsoft (available in Downloads) on setting up and running IIS6. I think it is part of the IIS6 resource kit, but am not sure. It's about 350 page PDF, and very helpful.
# September 12, 2003 4:15 AM

Dave Burke said:

John, Thanks! I used your advice to explore the service account permissions, assigning "logon as local," and "run as service" in the system user policy. Rebooted and still the permission problems. I again verified the IIS and folder permissions. No dice. In other words, another hour wasted on this. You are probably exactly right and I am missing something. I figure that since it is a ASP-specific issue that for now--until I focus on ASP.NET migration issues--I'll go with the non IIS UNCs which work as a fix. Thanks again. I'll let you know if any breakthroughs occur on this.
# September 12, 2003 4:13 PM

Robert Scoble said:

Oh, have you missed all the hell we're taking for security problems?

http://radio.weblogs.com/0001011/2003/09/12.html#a4608

for instance.
# September 12, 2003 6:00 PM

TrackBack said:

Dave Burke isn't happy with Windows 2003 Server's default security settings...
# September 12, 2003 6:27 PM

Dave Burke said:

Maybe I'm not, Greg. Turn on ASP by default or give me something other than a 404 when its not on, let me write to an IIS folder with a system account (instead of anonymous) if I want to without having to spend hours figuring out how to make it work as it did in W2k, don't make me put quotes around a SLQXML extension mapping and clear the "Verify if File Exists" checkbox to write and XML file with MSXML 4.0, allow me to maintain compatibility with legacy ASP apps by providing CDONTS by default rather than give me a "server object cannot be loaded" error, and so on. I lock my doors at night and I'm sure you do, too. But _I_ lock them, not my landlord.

And Robert, the "hell Microsoft is taking" is, as you well know, for things like yet another buffer overrun security hole, which as Sam was saying, makes it difficult to sell W2K3 to his clients. None of the default security settings I encountered this week have anything to do with the the current poor security perceptions. I want this security climate to pass as much as anyone else, but over-restricting a developer, like over-searching an airline passenger, is inefficient, costly, and a pain. That was the core of my analogy.

Thanks to both of you for your thoughts.
# September 12, 2003 7:37 PM

TrackBack said:

# September 13, 2003 1:31 AM

TrackBack said:

# September 13, 2003 1:32 AM

Vijay said:

Glad to be of help !
# September 14, 2003 3:07 AM

TrackBack said:

# September 14, 2003 9:57 PM

julie said:

Dave-
I applied the latest stuff to my win2k server last night. Besides Friday's critical update, there was one other and another cumulative update for IE as well. Somehow 6 or 8 in all since just a few weeks ago. So when I rebooted, the dos info, where it spins up the bios stuff gave a big red message - something serious was missing. Then I pressed whatever key it said and it asked for a boot disk. Pant pant pant. I powered down thinking "oh great, I trashed my server. This is going to be a long night." Not production server, btw, just my inhouse stuff. So I powered down and started up again and everything started back up normally. End of story. BUt oh god, I know that sinking feeling. And I never trust these things but you just have to bite the bullet. When I updated Rich's Win2K Pro last week it said "back up everything first and do you want to save the old version before the SP is applied". That sure gives you confidence!
# September 15, 2003 8:27 AM

Dave Burke said:

Thanks, Julie. It was good to read your experience to know that the sinking feeling is a shared one.
# September 15, 2003 8:43 AM

julie said:

and I actually had the blue screen of death this mornign on my "daily driver". I have NEVER had a b.s.d on my development box before. I can only think it's these patches.
# September 15, 2003 11:54 AM

Dave Burke said:

Oh, man. That's really ugly. I hope it booted back up for you and you don't see it again!!!

# September 15, 2003 12:27 PM

julie said:

yes, thank goodness
# September 15, 2003 1:30 PM

TrackBack said:

# September 16, 2003 11:58 AM

Onder said:

Hi Dave,

how does it work when i call a stored procedure with more than one SELECT statements?
Does ExecuteDataSet method return more than one table?
I may be doing something wrong but i get an error when i reference the returned dataset's second table!
# September 18, 2003 4:24 AM

Dave Burke said:

Onder, Could you reference the second table prior to using the DAAB? I always thought that a stored procedure could return one table only?... It can execute multiple query statements or execute multiple stored procs, but not return more than one table. Interesting. Maybe I'm wrong about that.
# September 18, 2003 8:10 AM

Onder said:

Dave i solved the problem :)
it was my mistake! It is okay with the daab ExecuteDataSet method returning two tables for a stored proc. with two select statements. No problem.

I my case, it is a good idea for my application to read the contents of two different database tables so i do not read to make two queries to the database.
# September 18, 2003 10:30 AM

Scott Mayfield said:

Absolutely useful... I've been hunting around for this setting off and on for several days now, thinking it would be in the virtual server properties under the application options tab... thanks for the information.
# September 18, 2003 2:13 PM

Logan said:

I've just run into some difficulty with a radio button list - i think it might be a bug, or perhaps i'm missing something. I have a list of 8 buttons all with different text values - but the hidden values of some of the list items are the same. Either 1,2,3,4. When getting the SelectedItem server side, I find that instead of the correct SelectedItem, the SelectedItem is the first Item in the list with the value of the item was selected.
That is to say then that given the list below:

<asp:buttonlist>
1 Dog
2 Cat
1 Bees
3 Drinking
</asp:buttonlist>
If Bees is selected... Server side Dog is returned.

Any ideas?
# September 19, 2003 3:11 PM

Dave Burke said:

I'd love for someone to explain this. I found that once I selected something other than the default, it would never change back to the default on postback. This issue affects listcontrols in general, obviously, so I'd like to "get it" at some point. Sorry I couldn't be more helpful.
# September 19, 2003 3:35 PM

j buxton said:

I was trying to find a way to use NUnit to directly test a .aspx page, and got stumped. Ended up using ASPUnit instead, which seemed to me to be a round-about way of testing my web app.

Looks like theis code might prompt me to revisit NUnit applied directly against a web page. Hmmm... wonder if this calls for a new NUnit-type project on sourceforge?
# September 22, 2003 10:29 AM

Tim Marman said:

"Robusticity"... that's an interesting word :)
# September 22, 2003 10:32 AM

TrackBack said:

# September 24, 2003 1:25 AM

Darren Neimke said:

Dave... you just need to HtmlEncode the output like so:

Label1.Text = "<pre>" + Server.HtmlEncode( sw.ToString() ) + "</pre>
# September 24, 2003 2:30 AM

Oleg Tkachenko said:

Also it's bad idea to use XmlDocument for that - it's pure wasting of memory. Instead create XmlTextReader and give it to XmlWriter - pure streaming pipeline.
# September 24, 2003 5:40 AM

Dave Burke said:

Thank you both for your input. The <pre /> Server.HtmlEncode was exactly what I was missing, and just to get it right, I dropped XmlDocument for XmlTextReader.
# September 24, 2003 9:20 AM

hln said:

I fully agree. Still, if you're trying to learn a standard, having something more intuitive than, say, a text editor that'll build the hierarchy visually to learn - that's a boon.

On writing schema, though, hand-coded and tested with my favorite validator.

hln
# September 25, 2003 12:46 PM

TrackBack said:

# September 26, 2003 8:50 PM

TrackBack said:

# September 26, 2003 9:32 PM

SBC said:

we have to get him down here sometime - http://www.ctmsdev.net/
# September 26, 2003 10:24 PM

Matt Berther said:

Dave,

You can always have VS.NET spit out warnings as errors too. This happens on a per project basis in the Project Properties | Configuration Properties | Treat Warnings as Errors.

This will force you to resovle the warnings prior to a successful compile.
# September 27, 2003 2:03 AM

Roland Weigelt said:

The piece of code you posted is a *good* example for the use of the "With" statement. Unfortunately, each time I read someone's VB source code, I get something like this:

With Foo
.Bar="Hello World"
If (x>y) Then
...
blah blah blah
...
Else
...
blah blah blah
...
End If
DoSomething()
If (y=z) Then
...
DoSomethingElse()
...
End If
.Baz=1234 ' huh, what?
End With

What I'm trying to say: "With" can be a nice feature, but it also tends to be misused. I wouldn't use it anyway, but I also read a lot of other people's code...
I think C# is definitely better off without the "With" statement.

Roland
# September 27, 2003 7:40 AM

Dave Burke said:

Thanks, Roland. I hadn't ever used it like that, but given your example I would certainly agree on the potential for "with" being misused and for muddying up code rather than reducing it.
# September 27, 2003 8:16 AM

Dave Burke said:

Great tip! I'll definitely make the change and see how it goes.
# September 27, 2003 8:17 AM

Scott Galloway said:

You could make a little variation of this as follows:

private void ClearTxtMyboxScript(TextBox theTextBox)
{
theTextBox.Attributes.Add("onFocus","ClearTextbox()");
StringBuilder sb = new StringBuilder();
sb.Append("<script language=\"javascript\">\n");
sb.Append("function ClearTextbox() {\n");
sb.AppendFormat("eval(\"document.forms[0].{0}.value = \\'\\'\");\n", theTextBox.ClientId);
sb.Append("}\n");
sb.Append("</script>");
Page.RegisterClientScriptBlock("ClearTextbox",sb.ToString());
}

Think that *should* work for any textbox in your page (Andy Smith...you reading this - what about a server control :-) ???)
# October 1, 2003 10:54 AM

Scott Galloway said:

Actually, I'm an idiot...an that won't work for more than one textbox...you need to pass the id of the control into the Javascript function...way I've done it will just work for the very first textbox you pass in...umm...any suggestions (apart from rude, derisory ones :-))

# October 1, 2003 10:57 AM

Dave Burke said:

Scott, first of all, HA! Funny. You're no idiot and I have no rude, derisory comments. Scott Guthrie in his ASP.NET blackbelt presentation passes a control and then grabs the clientID of that control Apart from any potential ":" chars in the clientid, this could do the trick. I DO want to be able to generalize this routine, but wasn't up to it this morning. Thanks though!

Here's ScottGu's example on setting focus where he does what I'm describing:

private void SetFocus(Control controlToFocus)
{
StringBuilder sb = new StringBuilder();
string scid;
scid = controlToFocus.ClientID;
sb.Append("<script language='javascript'>");
sb.Append("document.getElementById('" + scid + "').focus();");
sb.Append("</script>");
RegisterStartupScript("focus",sb.ToString());
}
# October 1, 2003 11:18 AM

Emily said:

I have ps6 and it doesnt work anymore. It says "Photoshop could not be initialized beacause it does not have enough memory (RAM)" Can someone help me? Anyways, photoshop is an amzing program
# October 1, 2003 5:27 PM

TrackBack said:

# October 2, 2003 12:21 AM

Andy Smith said:

The big problem with this is that it doesn't specify the button which will be "clicked". Which means that the browser just kinda picks whatever button it wants. Right now, with your current design, apparently the button you want is clicked. But think about this for a second... changing the page design actually has the ability to break the functionality of the page. And when it happens, there's no error message. No notification. Nothing. Your app subtlely breaks.
There are very good reasons I made <a href="http://www.metabuilders.com/tools/DefaultButtons.aspx">DefaultButtons</a> work the way it does. Remember, "For every problem there is one solution which is simple, neat, and
wrong."
# October 2, 2003 2:27 AM

Dennis v/d Stelt said:

# October 2, 2003 6:16 AM

Paul Wilson said:

I still think separate forms are often the best solution, since each one gets a default button automatically when the user is inside one of its controls. Of course this isn't officially supported for some odd reason in ASP.NET, but it works quite well for me:
http://www.WilsonDotNet.com/Controls
# October 2, 2003 8:05 AM

Dave Burke said:

I didn't anticipate any input on this post. (Wow, double pun!) Thanks, guys. You are each absolutely correct. I'm familiar with your Web Controls, Paul, and I've looked at Andy's DefaultButton control. If I had more form elements on the page, I would definitely go the non-<INPUT/> route, but with a single field and one button, hey, this approach could not have been simpler, and, in this case, I think maybe not so wrong. Of course, if I add another field or button and things get screwy I'll look at this issue again. :-)
# October 2, 2003 8:54 AM

Mike Krautstrunk said:

A bit late to the party, but a 4Guys article (http://www.4guysfromrolla.com/webtech/010202-1.shtml) shows a pretty dramatic drop-off in performance when using With.
# October 2, 2003 11:05 AM

Dave Burke said:

Huh! Didn't know it, Mike. Thx! I need to spend more time at 4Guys.
# October 2, 2003 11:25 AM

Jeffrey Randow said:

Actually, I am doing something similar for my company (in my spare time) to allow project blogs for communication....
# October 7, 2003 10:53 PM

Vic said:

Where is Alex Homer these days? I miss his books.

Vic
# October 8, 2003 1:02 PM

Dave Burke said:

Yeah, I know. He kinda dropped off the map. Seems a whole army of young .NET gurus has risen up to take his place though.
# October 8, 2003 1:38 PM

Dave Burke said:

I'm spending a lot of my spare time on the .text customization, too, since its so darn interesting. Bad habit, doing work stuff at night...
# October 8, 2003 1:39 PM

Scott Galloway said:

Because error handling is for wimps! Hmm...I would so wrap that in a try...catch block (even if Joel Spolsky thinks I'm being obscure :-)). Actually, one of my favourite features in DAAB isn't used at all in .TEXT, namely, the SQLHelperParameterCache.GetSpParameterSet...used as follows...

SqlParameter[] sqlParams = SqlHelperParameterCache.GetSpParameterSet(Global.ConnectionString,"pr_Common_GetListItemsWithPermissions");
sqlParams[0].Value = contentType;
sqlParams[1].Value = userName;
sqlParams[2].Value = portalId;
sqlParams[3].Value = sortCriteria;
sqlParams[4].Value = sortDesc ? 1 : 0;
sqlParams[5].Value = startItemId;
sqlParams[6].Value = numItems;

In this way, I save even more typing (oh, and in case you're wondering the performance loss is close to 0.
# October 15, 2003 6:04 AM

Anonymous said:

I think it serves a better example of what *not* to do -- I do my best to never refer to ordinal index positions. I think that's a bad way to write code, even though it is faster than refering to the literal. Steve McConnell in Code Complete refers to people like this as "Bit Chasers" who try to ink out ever last bit of performance over long term maintainability.
# October 15, 2003 6:39 AM

Dave Burke said:

Whoa. Thanks for the example, Scott. I will investigate! That's so great; I post some code that I think is sweet, and you post even better code!

As for anonymous (hey, good point, why no name?), you're right about the index position issue. I spent hours tracking down the fix for my custom .text where I added a parameter to the inparam group which returned the wrong value from the stored proc.
# October 15, 2003 8:15 AM

Scott Watermasysk said:

Scott: Why no error handling?
I want the error to bubble up the layers. No sense in eating the error on this level. In pages/objects where you are using this functionality you will never figure out what is causing the error.

In .95 the only data try's are arround IDataReaders, and it simply uses try/finally to make sure the connection is closed on errors.

Anonymous: "Bit Chasers"
I agree with you. I guess I could build my own command objects instead of using the helper...but in most cases the number of parameters is small and easily managed. I never use positional indexes when working with results...I guess I took the easy way out going in :)

-Scott
# October 15, 2003 8:43 AM

Frans Bouma said:

Hardcoded indexes == best practises? Erm... Did I miss something? :)

Shouldn't that parameter create routine return a parameter instance, which value you can simply return?
# October 15, 2003 8:46 AM

Dave Burke said:

I seem to have mis-named this post...

Scott, I saw the bubbling up effect with the returned param on entering a new post, providing the success/failed message, with the "baseline error occurred" text.

# October 15, 2003 8:51 AM

Ryan Felton said:


Am I missing something? I've been useing the DAAB v2 and I don't see any function For the MakeInParam or MakeOutParam. Is this a custom creation?

# October 15, 2003 12:57 PM

Dave Burke said:

Ryan, I asked ScottW about this through a post to the .text list group, and he said he picked them up along the way, he thinks from the Petshop DAL. They're in the .text .094 source in the SQLHelper class in the SqlDataProvider project.

But from Scott Galloway's comments about, it looks like the daab already has superior parameter handling methods requiring even less typing...
# October 15, 2003 2:38 PM

Scott Galloway said:

ScottW: Fair comment...I have a slightly different approachb - I tend to 'eat' errors and pass up a value which indicates an error (null, 0 or somesuch) - kind of a return code approach...mainly because I expect to have to nitify a user and I like to catch me errors in each layer of the app - so, each higher layer only gets 'clean' data and only has to worry about exceptions from it's own operations. This probably has more to do with my background which is Enterprise development - passing large exception classes between layers is costly (and dangerous if the consuming layer doesn't expect them). But horses for courses I suppose :-).
In the instance where Scott uses an index...umm...yes...you declare an array and refer to a member...that's bad practice how exactly. You're seriously saying you'd rather declare constants or even a enum to indirectly refer to the number '7'?
# October 15, 2003 4:43 PM

Scott Galloway said:

Oh, incidentally, for those who are interested, I posted a version of DAAB 2.0 which is a drop-in replacement for the .TEXT one...means you have access to all the nice 2.0 features (including a couple of bug fixes)...
http://www.mostlylucid.co.uk/posts/497.aspx
# October 15, 2003 4:59 PM

Kris said:

You should also check out http://www.jasonbock.net/whatsnew2003.html and especiallly FileGenerator. Makes life even easier when using Reflector ;)
# October 19, 2003 3:30 AM

Paul Gielens said:

This is why I just spend my saturday night to write a proof of concept prototype. Actually a colleague was supposed to do that, but I figured I could learn a thing or two by doing it myself as well.

1.) yes
2.) definitely
3.) tried it before but never finished it
4.) my company wouldn't be so fond I guess ;)

Perhaps you should read "Your Roadmap for Success". I just can't stop promoting that book enough, eye opener :)
# October 19, 2003 9:03 AM

Carl Franklin said:

You'll see more of me in CoDe Mag soon, and you'll hear Marcus on <a href=http://www.franklins.net/dotnetrocks.asp>.NET Rocks!</a> before too long. Great magazine!
# October 21, 2003 3:17 AM

Dave Burke said:

Always looking forward to seeing (and hearing) more of Carl Franklin! Thanks for the news, Carl.
# October 21, 2003 6:50 AM

julie said:

damn - the pocket pc phones were all $500 when I went to Verizon in July. I was ready to shell it out when I realized they were 100% digital - which isn't the perfect option in Vermont. Why didn't you show it off last night?
# October 21, 2003 11:13 AM

Tom Richards said:

Perfect timing. I was just started looking for just this device from Verizon, my current wireless company.
I'd be anxious to see how it works, although, I'll probably be running off to Verizon to buy it anyway.
Thanks.
# October 21, 2003 11:23 AM

Dave Burke said:

Jules, Last night I was still figuring out how to use the dang thing (which is why I had to leave the room.) And yeah, I thought hard about the Vermont Digital Only issue, but I figured I'm such a stay-at-home nerd that it didn't matter to me.

Tom, just remember, the thing is a full pocket PC and I'm started to get attached to the thing, but if you do a lot of talking, you want to get a REAL phone. The input and output speaker is one and the same, so there is no privacy at all.

What I AM looking forward to exploring is the Text Messaging feature. If I get colleagues and my wife used to sending me text messages, I can easily call them back when I'm in the woods or something.
# October 21, 2003 2:32 PM

Dave Burke said:

Julie, I forgot to mention that the Verizon Sales Guy said that all towers in Vermont (and all towers Vz is putting up) are digital. I suppose that would seem a logical move. So maybe we'll get by with a digital-only phone in VT? I'll keep you posted.
# October 21, 2003 2:36 PM

Jerry Dennany said:

My thoughts exactly!
# October 26, 2003 9:55 PM

Roy Osherove said:

Dave, There's a lot in what you say that I agree with. Heck, god knows I'd write the same things, because I would have been just as excited. But I'd take precautionary measures and made sure my blogging would be done in a separate place where the "noise" would be separate from real content. At least for the "find me at..." posts, there are better ways of dealing with this.
Also, the main point was to try and make out where to get *content* from the sessions. If all the content would be drowned out by all the noise, then all the PDC blog readers would not achieve their ultimate goal - try and get information.
Still, I totally get you. I too like to read the small stories that make up a day in the life of so and so, and It really bothers me that I'm writing against doing these. But my main goal here was just to *redirect* them at a more appropriate place, so that I can wade through them at my *own* time, and not when I want to get real information.
The last thing I wanted to come off as was a "just give me the juice" type of guy.
# October 26, 2003 10:02 PM

Dave said:

Okay Dave, tell me this: _your_ post here... what does it have to do with .NET?

Um, uh.... well.... it has.... NOTHING to do with it, right?

Then why post it on something called .NET weblogs?

One: I mean this with all due respect to you - I'm merely making a point. Two: consider that this post of your is probably more interesting than the bulk of things coming over the wire today. (If I wanted an airport flight delay report I could watch The Weather Channel.)

My complaint has nothing to do with squelching excitment of people 20 years younger than me attending their first conference. It has everything to do with what Roy spoke of.... noise.
# October 26, 2003 10:24 PM

Dave Burke said:

Dave, I guess it has to do with the COMMUNITY of .NET users, the guys I read every day and imagining them getting to know each other better in LA or by extension imagining myself making the trip and hangin' with them as well (though I'm REAL happy I missed a round-trip flight from Vermont to LA to see stuff I'm sure I'll see plenty of in many months to come before I even see a CD.)

The more I think of it, had I gone to the PDC it would have been as much to meet the guys whose blogs I've been reading as it would be to sit in on the sessions. Then again, most of them are in the "20 years younger than me" category so we probably wouldn't have a whole lot in common. :-)

Yeah, there's lots of noise on the wire today. I agree with both you and Roy on this, for sure. But a clear channel in an aggregated feed is hard to come by any day.

I would like to talk more about the noise issue, but it would only result in more noise on the wire, I'm afraid. So for now I'll just say thanks for your comments!
# October 27, 2003 12:43 AM

TrackBack said:

# October 28, 2003 4:29 AM

julie said:

does it really look like that in Burlington right now? it's all brown and sad here! and foggy and rainy. Waaaah <g> I'm coming to town!
# November 4, 2003 10:50 PM

Dave Burke said:

Fall is hanging tough here in the valley. Not many more days left, I'm afraid. Thanks for your comments!
# November 4, 2003 11:11 PM

Shannon J Hager said:

I started playing with CSS overloads in the options page on my blog, this is/was the Marvin 2 skin but I've almost managed to get it to look like my main site. CSS is some powerful stuff.
# November 5, 2003 1:15 AM

Brian Desmond said:

How come this was such a task? Here's a really really easy way to do what you needed to do (AD, DNS, Exchange, & files at least):

Install the new server, patches, etc. Make sure teh DNS Service is installed and running.

1) Start>Run>dcpromo. Join to domain as DC. Once replication is complete, ensure DNS intact. Setup secondary zones for any primaries on the other machine. Transfer the zones, convert the new machine's zones to primaries.

2) Open AD Sites & Services and make the new server a GC. In AD Users & Comps, Transfer PDC Emulator, RID Master, Infrastructure Master FSMOs. Open Schema Management (must start>run>regsvr32 schmmgmt.dll first) and trasnfer Schema Master. Force replicate & ensure good replication

3) Install Exchange 2000 into current Exchange org. Service pack & QFE. Setup public folder replication & replicate the tree. Ensure good replication. Use Move Mailbox wizard in AD users & Comps to move mailboxes. Ideally, open outlook for each mailbox to have new server change take.

4) Ensure folder replicas intact on new server, remove replicas from old server, and finally, remove exchange server from site. Dcpromo the old server out of the domain.

5) Use robocopy to move all the files over:

robocopy c:\SourcePath \\NewServer\NewPath /sec /e /z /eta

6) Migrate IIS, any other apps.

7) Power down old server. All done.
# November 5, 2003 1:42 AM

Brian Desmond said:

On a DC, a long wait at Prepping Network Connections is normal. If its a client machine, you've probably got a DNS snafu. Are your clients pointing at the new IP for the new DNS server?

LMHosts is for WINS. In an AD environment, WINS is not used, so LMhosts should be irrelevant to the situation.
# November 5, 2003 1:44 AM

Merill Fernando said:

Is there any hope of these changes finding their way into the next release of .Text?

I'm setting up .Text on our intranet and would really love to deploy the changes that you've done.

Would it be possible for me to get a copy?
Thanks
# November 5, 2003 4:58 AM

SBC said:

yup.. used it in a ASP.NET project a few months ago. Found out more about it here - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxtskworkingwithhtmlstyles.asp
# November 5, 2003 5:49 AM

Dave Burke said:

Merill, Any development time I spent on customizing .text are on my company's dime and most changes unique to our environment, but I am more than happy to detail any concepts or answer any questions. To know what's happening with 0.95 (which ScottW says is a couple of weeks out), you need to check out the [opensource-dottext] listserv at http://aspsmith.com/.


# November 5, 2003 8:17 AM

Dave Burke said:

Brian, the problem was cleared up and everything is pointing to the new DNS server. I should have explained about the Lmhosts file: this particular server has two NICs, one pointing to my linksys router and out to the internet, and the other to my LAN. It is the only machine connected to the internet. When it has problems resolving an external address it hits the internal NIC and hangs until I disable the internal NIC, hit an external source, then re-enable the internal NIC again. So I helped it out with some common host IPs to reduce that incident.

TCP/IP is rocket science to me, so I could probably improve my configuration, for sure. I am curious if, were I to install DNS on this server, that other machines on my LAN could use it to hop out onto the internet? Then again, I kind of like the fact that most of my LAN is completely offline.

Thanks!
# November 5, 2003 8:25 AM

Dave Burke said:

Brian: Yeah, like I tell people, life is easy when you know what keys to press. I wouldn't say the sequence you described was "really, really" easy, but I was definitely impressed with your knowledge of the procedure. Cool!
# November 5, 2003 8:29 AM

Merill Fernando said:

I do understand Dave.

Thanks a lot!
# November 5, 2003 9:25 PM

Joris Evers said:

Of course it was the other way around. We talked to Julia first and then thought of all those other folks to interview.
# November 7, 2003 1:13 PM

Dave Burke said:

Joris, that is so great! I'll make sure Julie sees your comments. HAH!
# November 7, 2003 1:51 PM

Michael Grazebrook said:

I use Cooktop and XML Spy. XML Spy is in some ways easier to use - especially for a complete beginner. But it constrains ones style, it makes a lot of useful and legitimate things difficult. So as my skill has improved, I've found myself using Cooktop more and more.
# November 12, 2003 10:30 AM

Darrell said:

What's the spacer image in the first column for? That's not needed to make the sample work, right?
# November 13, 2003 7:46 AM

Dave Burke said:

Sorry, Darrell. I didn't catch that. It served as the left-hand margin. No, its certainly not necessary to make the sample work. Thx.
# November 13, 2003 10:31 AM

Fabrice said:

You could also simply cast you control to a base class which has the property you want to access instead of using reflection.
# November 14, 2003 6:12 AM

Dave Burke said:

That's an excellent point, Fabrice. Thanks. But if I understand correctly, the base class which had the control and its property was the web page, and in this case multiple web pages will use the remote base class which I will only know at runtime (yeah, some duplication at the UI level for simplification, though I should redesign further.) You're right though, the cast to the base web page is definitely cleaner.

# November 14, 2003 9:06 AM

Dave Schwinn said:

Hey,

I know an awesome shareware tool to use to located wasted disk space.

Download and install the eval version of TreeSize Pro from here: http://www.jam-software.com/treesize

Of course, if it solves your problem - purchase it!
# November 16, 2003 1:50 PM

Shannon J Hager said:

I've never actually heard of anyone who used this product before, it always seemed like Microsoft's attempt at Flash in the late 90's, Liquid Motion (I think that is what they called it). Did LiveMotion actually work for you and your needs?
# November 18, 2003 12:14 AM

Dave Burke said:

Shannon, As I said, I just never found a use for it. I use Illustrator quite a bit, Photoshop everyday, and Acrobat every week or two, but LiveMotion, no. I opened it up several times, took a look around, and didn't get it. That, coupled with the fact that I couldn't see how I would use it to impress my employer meant that it went unused permanently.

So in a word, no. I was looking for something similar in functionality to Photoshop that output to .SWF, that was about it. Still, I was hoping for big things from version 3.0 to get me motivated. Guess it ain't gonna happen. Thanks for your comments!

# November 18, 2003 12:24 AM

Matt Berther said:

Or a source control system.

Even for one user, a source control system can prove invaluable, especially in times like this.

I currently run CVS at home, but am seriously contemplating SourceGear's Vault's $49 single user license.
# November 24, 2003 12:04 AM

Dave Burke said:

I've read good things about SourceGear's Vault. While I decide I'll implement a VSProjects folder daily backup. Thanks!
# November 24, 2003 12:16 AM

Gopinath Varadharajan said:

http://www.pcinspector.de/download.htm#file_recovery
this tool to recover deleted files
past recycle bin.. Free and it really cool

exact same prob i faced from VS.NET
this worked like charm..

Gopi
# November 24, 2003 1:06 AM

julie lerman said:

I have not one, but TWO licenses, to SourceGear Vault Single user edition to raffle off at the user group. Sounds like you better be stuffin' the ballot box.
# November 24, 2003 8:15 AM

Dave Burke said:

Thanks to all for your comments! Gopi, that app worked great, but it did not find my VSProjects directory. I can only think it had something to do with the fact that VS.NET renamed it originally, adding a "(2)" to the folder name. It's a complete mystery. Thank you again for the recommendation, Gopi.

Julie, you continue to amaze me. Not one SourceGreat license, but two??????
# November 24, 2003 11:01 AM

Jason Alexander said:

Great to hear that, Dave! That's certainly the intention is to release a quality product that is not only both usable, but a good learning tool.

Though, I must admit, I have to give credit to my other developers on my project:

http://www.ngallery.org/aboutus.aspx

And, of course, let us know if you ever need any help!


Take care,
-Jason
# November 24, 2003 1:29 PM

Steffen Grünwald said:

I´m glad to found this article. I read the SmtpServer from the Web.config file and set it there to "" (string.Empty) and it works fine.

Thanks a lot

Steffen

# November 25, 2003 4:18 AM

Dave said:

I would love to see some integration with .text and nGallery. How about a modules system for .text or at least a common authentication/management interface.

I know, I know....post it on the .text forums.
# November 25, 2003 10:50 AM

Dave Burke said:

Ha! Where do you think I got the idea? From the .text forums chatter, of course!
# November 25, 2003 11:51 AM

Tim Barton said:

I used system because ASPNET could write to the registry for my web app. I tried evrything with no luck
# December 3, 2003 12:40 PM

dshorter said:

Onder,

What does your SP look like?
# December 8, 2003 12:25 PM

Paul B said:

I have an issue where I have IIS set up locally on my machine. I can send an email out via an exe. The issue occurs when I try to run the same code set though an ASP.NET project. It bombs out with the same error as above, even though I set the SMTP server to localhost. Any ideas?
# December 12, 2003 1:37 PM

Rana said:


Hi,
You have a nice blog.
# December 14, 2003 7:59 AM

chris said:

dshorter, you can include statments in your SP like:

CREATE PROCEDURE testproc
AS
SELECT * FROM table1;
SELECT * FROM table2;
GO

This will work with a FillDataSet method similar to:

SqlHelper.FillDataset(cn,CommandType.StoredProcedure,"testproc",ds,new string[] {"table1","table2"});
# December 26, 2003 2:58 AM

TrackBack said:

Dave Burke came across an interesting problem working with VS.NET when trying to compile his project. He likes to use a network share to get to his project folders (as a lot of development teams do). Dave dug through this...
# January 6, 2004 1:17 AM

TrackBack said:

Trusted Shares and VS.NET I dealt with this a while back and re-encountered it tonight while getting things in order on a new W2K3 Server. Blog use #204: record a VS.NET configuration procedure you've used in the past but have
# January 6, 2004 10:17 AM

TrackBack said:

Courtesy of Dave Burke - To W2K3 : Application Pool Identity setting in IIS 6.0 I thought I was over the hump in setting up a website in W2K3 Server IIS 6.0, as several posts in a September 2003 “To
# January 6, 2004 10:26 AM

SBC said:

The W2K3 is a good one, also take a look at the SBS2K3 server(http://weblogs.asp.net/sbchatterjee/archive/2003/12/30/46580.aspx)
# January 6, 2004 10:35 AM

TrackBack said:

David Burke's blog: Trusted Shares and VS.NET dealt with this a while back and re-encountered it tonight while getting things in order on a new W2K3 Server.  Blog use #204: record a VS.NET configuration procedure you've used in the past...
# January 7, 2004 7:35 AM

Addy Santo said:

It sounds simple but there are quite a few technical limitations to solve before you can make this work. The SPSv1 database (Web Storage System, aka WSS) is a semi-structured database, not a relational database. One of the chief drawbacks of such a system is that there is no concept of constraints or foreign keys at the database level. Many of issues with SPSv1 can be traced back to this limitation. For example- changing a profile will affect only new items created after the change, deleted categories remain in an items list of categories, etc.

Your request - enabling changes to a parent to trickle down to children - is not supported for the same reason. In order to implement that, SPS would be forced to programmatically loop over each one of the children, and then loop over each one of the children's children, and so on. That could basically require traversing the whole SPS folder structure and updating all the nodes - something that would be a real perfomance killer.



# January 7, 2004 12:58 PM

James Edelen said:

Unfortuniatly, now that SPS 2.0 is out, I highly doubt Microsoft will be issuing any new features for version 1.

You may want to look into SPS v2 becasue the first beef may be allieviated as SPS document libraries are parsed as UNC paths through the Web Folders client. I don't know that the 100 character limit is imposed, but based on the structure of your sites/libraries, it should be less of a concern. Since there is no central library, there should be less path depth.

As for beef number 2, it becomes a moot point with SPS V2 as document profiles (in the sense you use them) have been depriciated and the Web Storage System will most likely not be part of SPS 3 (I would say right now, there is almost no chance, but you never know with Microsoft.)
# January 7, 2004 1:28 PM

Dave Burke said:

James, that's very interesting information. Thank you so much! I'll think more about this issue and configuration options in moving forward with SPS V2/3...
# January 7, 2004 2:18 PM

Dave Burke said:

I hadn't given the semi-structured nature of WSS enough thought before entering my beef. Good points. Thanks!

The problem is that I LIKE WSS. Maybe more issues like this will make it easier for me to reconsider the new SPS V2/V3 storage methods.
# January 7, 2004 2:22 PM

julie lerman said:

good conclusion. Most of my corporate work these days is winforms against a web service. Of course I used to fret that I would have people telling me "you should be using remoting if you have a .net front end", but now with Indigo coming, I don't have to worry about defending myself any more.
# January 9, 2004 12:56 AM

Shannon J Hager said:

Funny thing is, I had a client complain about an Access-based app because the drop-downs didn't work like she wanted them to. She wanted them to work like html dropdowns...

It's impossible to please everyone, I guess.
# January 9, 2004 1:38 AM

TrackBack said:

# January 12, 2004 10:08 AM

TrackBack said:

# January 13, 2004 1:10 PM

TrackBack said:

# January 13, 2004 1:11 PM

TrackBack said:

# January 13, 2004 4:33 PM

Raymond Chen said:

The Windows 98 message was "Because Windows was not properly shut down, one or more of your disk drives may have errors on it." It didn't specifically accuse you of not shutting down properly. It just said that an improper shutdown occurred and left open the issue as to whose fault it was.
# January 13, 2004 6:32 PM

Dave Burke said:

Thanks, Raymond. Hopefully I'll never see it again, but the message always struck me as inferring that I screwed up, as in "who" shut down Windows? There was also text which followed stating to the effect that the user should take care to always properly shut down the system, wasn't there? Again, implying blame on the user.

Or maybe I was always so pissed when I had to unplug and plug my computer back in to get it to work again that I took the startup messages the wrong way...
# January 13, 2004 9:34 PM

TrackBack said:

# January 14, 2004 2:10 PM

SBC said:

thanks!
# January 16, 2004 8:18 AM

Darrell said:

Maybe they didn't update their anti-virus software? I mean, I know they're waaaay out there in the neutral zone, but come on. The McAfee:The Next Generation software surely comes with an autoupdate feature from the nearest starbase, right?
# January 16, 2004 9:57 AM

Dave Burke said:

Thanks, Darrell. I hadn't thought it through. It's difficult however to accuse Geordi La Forge of not staying current with his anti-virus update procedures.
# January 16, 2004 10:10 AM

grant said:

ran into the same problem setting up a new server... bite me microsoft. i mean, thanks for posting the comment.
# January 22, 2004 2:28 PM

Vijay said:

Dave, the DataView apart from being a bit cumbersome to code, is really heavy in terms of memory consumption. I am not sure whether it is exactly a materialized view over the DataTable kind of thing but it just hogs memory. The DataRow[] got by the Select method returns references of the Rows in the DataTable and you can imagine how fast that will be. There is no object allocation, creation and then disposing stuff ... This is one thing i learnt recently in a project i worked on .. will post about this later !
# January 23, 2004 2:53 AM

TrackBack said:

Economy with XML and DataRows I do not often write a block of code and sit for a few moments to admire it before moving onto the next task, but the economy of using XML with ADO.NET&nbsp;DataRows to generate a...
# January 23, 2004 11:45 PM

Daniel Turini said:

Not to mention that you could speed it up a bit by using a StringBuilder...
# January 28, 2004 10:06 AM

Dave Burke said:

Ha. That's right, Daniel. Thanks for the reminder!
# January 28, 2004 10:18 AM

Julie Lerman said:

crap! I've been googling for an hour to solve a problem. Someone said "change the account for your application pool". I thought "whatever THAT means". So back to google and what do I find... This post!! Hooray.
Let's see if I can do this now. Same problem new win2k3 server and iis6 and can't access my database with the built in account. Aargh
# January 29, 2004 3:08 PM

jerry said:

hello
# January 29, 2004 8:20 PM

Dave Burke said:

Funny, I just ran into this again tonight on a W2K3 server while setting up its first IIS site and application pool. Thanks for the reminder of this post, Julie! I used it to fix my own problem.
# January 29, 2004 8:52 PM

Hoop Somuah said:

I'm flattered, it's not everyday that I gain mention in people's blogs.

Just a quick note, you don't have to allow all unknown ISAPI extensions to get this to work. What you should instead do is add the specific extension mapping that you're using to the Web Service Extensions section. We did it and it worked fine for us (There was no way our IT group was gonna let us allo all extensions)

-HTH

--Hoop
# February 2, 2004 7:53 PM

TrackBack said:

# February 5, 2004 10:42 AM

Julie Lerman said:

its confusing - but Steve actually did not come via INETA last night - he came out of the goodness of his heart!!! (okay, I bribed him with pancakes and snowshoing in the mountains)
# February 10, 2004 12:10 PM

Steven Smith said:

Glad you enjoyed it; thanks for coming!
# February 10, 2004 4:48 PM

Jason Salas said:

Hey Dave! Thanks for the complement to my post! I'm glad you liked my summarization of a very cool year for ASP.NET! Be well. :)

Jas
# February 12, 2004 1:52 AM

Addy Santo said:

If anyone would have told me a few months back that today I would be developing 12 hours a day with infopath while *enjoying it* , I would have replied that they should ease back on the juice.

But, here I am doing just that. The one difference between us is that I have an internal alpha build in which they fixed almost everything anyone could possibly complain about :) I can't go into specifics regarding features or schedules, but rest assured that Infopath WILL ROCK for developers too. Not only for Mr "I'm-an-excel-macro-writer" guy.
# February 16, 2004 12:51 AM

Dave Burke said:

Thanks, Phil. Went through it last week, sample by sample. Some cool and helpful stuff there, for sure, but it didn't change the issues I had with the UI and development support.
# February 16, 2004 8:11 AM

Terrence said:

Hmm... I can never get this to work for me. It seems I always get the overload with the most parameters first. This is the exact opposite of what I want. :-(
# February 19, 2004 1:10 PM

Geof Grooms said:

Wow...thats all I can say. I'm rolling out a 750 user upgrade of office to 2003 via group policy.

I think I'll take a closer look at that push. Nobody wants to see an upgrade but seeing it twice would really hurt.

Thanks,

Geof
# February 22, 2004 12:45 AM

Damian said:

Could not find a solution anywhere on the web for this myself. A reinstallation of .NET framework did the trick
# February 22, 2004 6:42 PM

Dave Burke said:

Wow. That's rough. Sorry! I'll remember that though in case I hit this again. Thx!
# February 22, 2004 6:45 PM

TrackBack said:

# February 22, 2004 6:50 PM

G. Andrew Duthie said:

Sure there are...see my blog at http://weblogs.asp.net/gad/ for an example.
# February 22, 2004 9:59 PM

G. Andrew Duthie said:

Erm...GIF tags, that is. ;-)
# February 22, 2004 9:59 PM

Dave Burke said:

HA! Thanks, Andrew!
# February 22, 2004 10:10 PM

TrackBack said:

# February 24, 2004 12:27 AM

stefan demetz said:

Security by default??
# February 24, 2004 5:26 AM

David Cumps said:

An example of this could be found when you're coding at home, learning something.

To learn some coding subject you should be able to do it yourself, so you have set up a configuration at home with IIS, AD and a SQL server. And while you're setting that up, it gives you more insight in how it works, what options you have, what could go wrong, etc.

I'm coding a little website here with AD and MySQL and webservices. And when it's done it's going to get moved to production in my school. It's really valuable to see problems arise when you're coding and knowing the problem could come from an IIS setting. When it gets moved to production later on, and the error occurs, you can immediately tell the sysadmins where the problem could be.
# February 24, 2004 7:03 AM

Dave Burke said:

David, Exactly my point. Thanks.
# February 24, 2004 7:30 AM

Dave Burke said:

Stefan, I don't know exactly what you mean, unless its the same reason why things are more difficult setting up in W2K3 IIS than on W2K. I have no problem with security when logically enforced; I question the fluctuating bar required to get SMTP to work in any particular environment. If there is a documented single method of configuring SMTP services, I haven't seen it.
# February 24, 2004 7:35 AM

Matías Niño said:

There's a service pack incoming that might address a lot of your UI grievances (which I completely agree with about InfoPath).

Check it out!

http://www.microsoft.com/presspass/press/2004/feb04/02-23EnhancedInfoPathPR.asp
# February 24, 2004 4:35 PM

Dave Burke said:

Thanks, Matias. Once I can get my hands on a non-preview copy, I'm definitely going to check it out!
# February 24, 2004 4:39 PM

TrackBack said:

Take Outs: The Digital Doggy Bag of Blog Bits for 24 February 2004
# February 24, 2004 9:13 PM

Jerry Pisk said:

How about this:

string QuoteListItems(string Actions)
{
return "'" + String.Join("', '", Actions.Replace(" ", "").Split(',')) + "'";
}

A lot faster than a for loop through the array. And of course, SQL injection problem, it seems that nobody who has time to have a blog knows how to write secure code (or doesn't care to).
# February 24, 2004 11:44 PM

Jerry Pisk said:

More code:

If you know that the items are separated by a comma and a space:

return "'" + Actions.Replace(", ", "', '") + "'";

If the items are separated by just a comma:

return "'" + Actions.Replace(",", "','") + "'";

Or you can use regular expressions to replace a comma and optional whitespace - ",\s*" will be the pattern, replace with "', '" and append "'" at the begining and end of the result.
# February 24, 2004 11:55 PM

Jerry Pisk said:

Dave, 1280x1024 on a 19" monitor is probably the standard 96dpi. That's not hi-res. 1024x768 might be something like 72 dpi, which is a very, very low res.
# February 24, 2004 11:58 PM

David Cumps said:

Work some months in 1280*1024 and then try 800*600 once, that's real horror :p
# February 25, 2004 5:47 AM

Dave Burke said:

I knew I'd get suggestions for improvement. Thanks, guys.
# February 25, 2004 6:35 AM

Dave Burke said:

Jerry, 72 dpi very, very low res? Well, I guess I've made my point. And all things being relative, 1280 x 1024 is plenty hi-res as far as my eyes measure. Thanks for your comments! David, agreed!
# February 25, 2004 6:50 AM

Scott Galloway said:

Personally I go for 1600x1200 at 96DPI with full 'tuned' cleartype - has been my standard for about 2 years, I wouldn't go back to 1024x748 @ 72DPI for all the bricks in china (I think the tea thing is getting old...guessing there's quite a few bricks there)
# February 25, 2004 7:52 AM

David Cumps said:

Thanks from me as well :) Usefull piece of code
# February 25, 2004 8:04 AM

TrackBack said:

In the bag tonight: Less bitch'n and whin'n. Counts:Blogging: 8; Dev: 22; Otherwise: 8; SQL: 5; WILY: 8. Line of the night:
# February 25, 2004 11:24 PM

Enigma said:

why even bother to create a .net function

string sql = "SELECT * FROM table WHERE code IN ( + ''''+replace("+code+",',',''',''')+'''' + ")";
# February 26, 2004 1:44 AM

Enigma said:

why even bother to create a .net function

string sql = "SELECT * FROM table WHERE code IN ( + ''''+replace("+code+",',',''',''')+'''' + ")";
# February 26, 2004 1:54 AM

Brian Desmond said:

And then there's the scenario where you're the admin AND the dev. Always an interesting night when something's broken and you've got a go-live date to hit (usually the next day) on some app.
# February 26, 2004 9:23 PM

Dave Burke said:

Brian, Then I'm saying "Thank God for The Line!"--no matter how blurred. :-) No, I wouldn't want to do it both! Regards!
# February 26, 2004 9:27 PM

Bayram Guldibi said:

Hi we are also getting same error message on a SPS 2001 server with Windows XP Prof client and Office 2000 prof installed PC environment.
We have 10 client PCs have same configuration but 2 of them are giving same error message if a user wants to use built in functions (edit, disccuss etc.)

We haven't able to find a solution yet,

Regards,
Bayram Guldibi.
bguldibi@protel.com.tr
# March 2, 2004 10:07 AM

Alexandre Marinho said:

I´ve been trying for days to make infopath, sharepoint and web services work together in windows 2003. When I tried to access the web services from within infopath, even to define the secondary data sources, it came with the message "InfoPath cannot find or access the specified Web service description". Finnaly I found that the cause was that the Application Pool was set to MSSharePointAppPool and it must be set to DefaultAppPool. The problem is that The documentation that explains InfoPath and Sharepoint integration (Enhanced Status Report) says you must set the Application Pool to MSSharePointAppPool. I´ll see what I´ll do from now on, but at least InfoPath is finding the Web Services now.
# March 7, 2004 5:20 PM

Brian Desmond said:

Personally, I think the interfaces for Intuit's stuff are extremely bloated, often unintuitive, and, did I say bloated?

They've got so much extra crap thrown in there - all the web browser stuff, overpriced pay-extra services, etc.
# March 8, 2004 11:47 PM

Dave Burke said:

Brian, I appreciate that opinion, and you're absolutely correct about the bloat. My point is the rich UI for the tasks I perform several times a month which, when compared to the web, are MUCH more efficient and pleasant to use. Thanks!
# March 9, 2004 1:12 AM

Stephanie Sy said:

So how will I resolve this problem if I can't change the permission of my folder? (it's on the host).
# March 9, 2004 9:36 PM

Dave Burke said:

Stephanie, If you can't change permissions on a host site then you need to get a new provider or buy the system admin a box of Krispee Kremes.
# March 9, 2004 9:51 PM

Jim C said:

YEah, I've always used that. Too bad you JUST found out. But, I'm happy for you!

Jim
# March 10, 2004 10:46 PM

Dave Burke said:

Right! It only took me 2-1/2 years to find it!
# March 10, 2004 10:50 PM

ron said:

David,

How did you manage without that feature all this time? How did you go to the definition. Did you use the search? Just curious.

-ron
# March 10, 2004 11:44 PM

Darron Jennings said:

Piece of advice.... go through the rest of the menus. You never know what you might find. I was working with a long-time developer recently that just found the "comment block" buttons on the toolbar. He'd always commented (and uncommented) one line at a time. He sounded like a jackhammer over the cube.
# March 10, 2004 11:58 PM

Dave Burke said:

Ron, typically the definition class is open in VS.NET. If not, I have to open it from the Solution Explorer, of course. From there it was implementing #regions and a lot of C^M^M, C^M^O's to maintain streamlined views of classes. That was important in navigating most quickly. I didn't think of the process as a burden, but the fact that I find the Go To Definitions popup such a timesaver, obviously it was.
# March 10, 2004 11:58 PM

Dave Burke said:

Darron, Yes. Good advice. Thx.
# March 11, 2004 12:00 AM

Moi said:

Relatively new to the VS game, so double thanks for this gem. If you do the same on something like StringBuilder it's even more useful :-) Dave thanx for the comment out button too.
# March 11, 2004 12:53 AM

Fabrice said:

I use the shortcut key for this a lot: it is F12. I use this in combination with View.NavigateBackward and View.NavigateBackward. I use CTRL+NUMPAD- and CTRL+NUMPAD+ for those.
Navigating code this way will be a whole new experience for you :-)

See also http://weblogs.asp.net/fmarguerie/archive/2004/03/05/84398.aspx
# March 11, 2004 5:17 AM

Oddur Magnusson said:

ctrl + k + f = fix indenting
ctrl + m + o = collapse all regions
ctrm + m + m = toggle current region
# March 11, 2004 6:41 AM

Dave Burke said:

Fabrice: great tips! Thanks. I will definitely be navigating at a higher level with those additions. Oddur: Thanks! I've been using those 3-combinations forever. They're bread and butter keystrokes, for sure.
# March 11, 2004 9:24 AM

anon said:

# March 12, 2004 12:21 PM

Dave Burke said:

Anon, thanks for the link. Very informative.
# March 12, 2004 12:47 PM

Jim Arnold said:

Hey, why don't we get rid of objects altogether :-)

I *strongly* disagree with you. Verbosity should not be used as an excuse for nasty code, especially with a predictive and helpful IDE. Static members lead you down a dark alley before smashing you round the head with a brick and stealing your wallet *and* your girlfriend. Proceed with caution.

Jim
# March 14, 2004 4:51 PM

Dave Burke said:

Jim, thanks for your thoughts. I particularly enjoyed the way you expressed your disagreement. I'll proceed with caution. Thanks!
# March 14, 2004 5:11 PM

MartinJ said:

I don't know, but have you tried calling EnsureChildControls() to make sure they are instantiated? It's just a quick thought.

-Martin
# March 14, 2004 5:55 PM

Scott Allen said:

Hi Dave:

Just two quick tips I hope can help:

There is a little snippet here to demonastrate how to loop through all the controls on a page: http://www.odetocode.com/Code/71.aspx

Also, if the control you are trying to find is inside of another control that implements INamingContainer (repeating controls like DataGrids), then the ID of the control is munged to make sure it is unique on the client (changed to something like "ctl0_lblMenu").

HTH,
# March 14, 2004 6:17 PM

AndrewSeven said:

You might only need to walk the tree a bit more. It depends a lot on how you build things up.

You might need SiteNews sitenews = Page.FindControl(sitenewsControl);
or
Parent.FindControl

If you have a commmon base class for all pages using the control, you can cast your control's .Page property as your base page type.
# March 14, 2004 6:44 PM

Dave Burke said:

Thanks everyone. It sounds like its possible and that I should stick with it. Scott, yes I was going to mention the "munging" of the control names. Here's an example:

<span id="_ctl0__ctl2_uc_sitenews_lblNews" class="mredstart"></span>

Martin, I had not heard of EnsureChildControls() before! Will investigate, but from the page source it appears they are. Andrew, I'll re-evaluate the casting in regards to the common base class. Thanks!
# March 14, 2004 8:38 PM

tomcat said:

Dear ALL,

I have a problem that my IIS 6.0 still send message "SERVICE UNAVAILABLE" if my browser request any file on my site's folder.


Best Regards,
- brenk -
# March 15, 2004 1:13 AM

Paul Wilson said:

I've had the same experience, and I'm not even bothering to renew my VS subscription.
# March 15, 2004 8:54 AM

nodeed said:

searching "cs0016" in www.google.com maybe helpful.
# March 15, 2004 9:46 PM

Eric J. Smith said:

Wow! Sounds like you are really off and running! I'm glad to hear that you are finding CodeSmith useful.
# March 20, 2004 12:05 AM

Scott Munro said:

Hi Dave,

I am in the process of building a code generator, (NGenerate), and am focusing on generating .Net code.

I am using a hybrid of raw string manipulation and CodeDom in my 'templating language' as opposed to CodeSmith's xml based language. This means that templates are written using .Net code such as VB.Net or C#.

I am supplying object oriented building blocks such as class and method definitions and intellisense is also available.

I was wondering how comfortable you found the xml style and if you can see any advantages with the technique I am describing?

I would also be interested to know how much background you had with xml technologies such as XSLT prior to using CodeSmith.
# March 22, 2004 10:34 AM

Dave Burke said:

Scott,

I read about nGenerate. Best regards with that!

To me, CodeSmith IS using .Net languages in writing templates, which is why it has come so naturally for me.

I've used XML for years, used XSLT but never written from scratch for an application. So as you are suggesting, my comfort level with a product like CodeSmith with a .NET scripting approach to templates would be greater than a more XML-driven generator.
# March 22, 2004 11:31 AM

Jeff Schoolcraft said:

I've seen CodeSmith, even downloaded it. Watched a demo at a usergroup meeting, have a guy working for me that uses it to do some sproc generation.

I'm curious how people using CodeSmith to do things like generate from the DAL back or from the BL back (BL, DAL, SPROC's) deal with workflow and business logic. Especially regenerating code after you've went in and manually edited the code.
# March 22, 2004 1:22 PM

Dave Burke said:

Jeff, that's a very good point, and one that I was thinking of documenting from start to finish. The trick, I've found is starting with a temporary SQL TABLE based on a SQL VIEW which represents the business object, say V_USERS. The bizobj is generated from the TMP_USERS table.

Let's say we're editing a user and built a edit form. CodeSmith can generate the code for populating the bizobj from the form controls BASED ON THE TMP_USERS table field datatypes (dropdown for an INT, textbox for string, checkbox for bool.) If you think about it, those are typical form representations for those datatypes.

user.first_name = txtFirst_name.Text;

That populated bizobj is passed to a DataLayer method, as in UpdateUser(User user), the code all generated by CodeSmith, again, based a lot on the field datatypes in the USER_IDS and USER_DETAILS tables.

As for changes, a basic rule I follow in generating templates is that its easier to delete unnecessarily generated lines of code than to type them...

# March 22, 2004 1:32 PM

Rory said:

"I DID have a problem with the lunchtime presentations by AMD and fellow corporate sponsors. There were 4 sponsor presenters, but I left after the second 10-minute presentation. I won't slam Microsoft, the organizers, or the individual presenters...except the AMD guy. I mean, GEEEE-zus! Powerpoints of x86-64 cpu schematics and breakouts with RAX, EAX, XMMO, EAX, SSE, GPR, and X87 on the same slide? Presented to people who didn't even ASK to ponder CPU architecture while eating their white box lunches? I mean, how big of a dufus marketing team was behind this guy? I'm thinkin' pretty big."

Absolutely classic :)

I didn't like those presentations, either. I felt that lunch was the one time for us to all get together and hang out. Having a marketing pitch during the meal was just *stupid*.

Dumb, dumb, dumb.

And stupid.

But, it's sometimes those stupid things in life that are the inspiration for great passages like the one quoted above.

Just wonderful... :)
# March 26, 2004 11:39 PM

Scott McCulloch said:

You might want to take a look at dotnetnuke 2.0 and see how we handle business object nulls.. we use a NullHelper class that stores application defined nulls..
# March 26, 2004 11:58 PM

Dave Burke said:

Thanks, Scott. I will definitely try to do so!
# March 27, 2004 12:01 AM

Dave Burke said:

Rory, Quite the compliment from a guy who wrote the book on classic passages. Thanks for checking in. btw, I enjoyed your session!
# March 27, 2004 12:03 AM

Mike Powell said:

I agree this is annoying, but it's not too hard to write a bit of javascript to hide all the select boxes on your page when you want to show your panel...
# March 27, 2004 3:00 AM

Elph said:

you also could use for something more complicated like:

a==b?c:(a>b?d:(a<b?e:f));

the only bad thing is that is hard to read

# March 27, 2004 4:25 AM

Dave Burke said:

Mike, You're right. And its what I did. With proper placement of the popup there was little evidence that some select box foolery was going on in the background. Thx!
# March 27, 2004 8:12 AM

Dave Burke said:

Elph, Thanks for providing the extreme! Wow, I'll have to read over that statement a few times...
# March 27, 2004 8:14 AM

Jerry Pisk said:

I doubt that regex would be faster than four String.StartsWith calls. It will still have to do the comparisons but it will add all the overhead of regexs, parsing it and all...
# March 27, 2004 1:57 PM

AJ said:

We created a library of nullable datatypes. You can find something similar at http://nullabletypes.sourceforge.net/
# March 27, 2004 3:00 PM

Mike Powell said:

Glad it worked out!
# March 27, 2004 5:54 PM

Dave Burke said:

Mike, Thanks so much! Yeah, it's really pretty sweet simulating a popup with .NET, and with full access to all page methods, props, etc...unlike a Javascript approach.
# March 27, 2004 5:55 PM

Dave Burke said:

AJ, I gave nullabletypes a look and may being moving in that direction depending on the outcome of my current approach. Thanks so much!
# March 27, 2004 5:57 PM

TrackBack said:

# March 30, 2004 10:22 PM

Chris Martin said:

I was hoping for pictures of the dog haulin balls down the slope!
# March 31, 2004 7:24 AM

Dave Burke said:

You're right, Chris. Seeing the dog haulin balls with his hair blowing back would have been a better pic. He was movin!
# March 31, 2004 8:23 AM

Julie Lerman said:

oh THANKS! :-)
# March 31, 2004 10:59 AM

Scott Mitchell said:

I take it you are using the DAAB? What version? Here's the code template I normally use:

int id = Convert.ToInt32(SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "AddCustomer", new SqlParameter("@Name", "Scott"), new SqlParameter("@Age", 25)));

Namely, I use zero to many instances of SqlParameters, based on the sproc I am calling.

hth
# April 2, 2004 1:09 AM

Scott Mitchell said:

Also, to be pedantic, you should use SCOPE_IDENTITY() over @@IDENTITY (assuming you are using SQL 2000). See http://weblogs.sqlteam.com/travisl/archive/2003/10/29/405.aspx
# April 2, 2004 1:12 AM

Elph said:

Really you don't need use executescalar with this, because your gets the info trought output parameter. You can use Executenonquery, because the parameter return the info @@Identity.


# April 2, 2004 1:28 AM

Jerry Pisk said:

Using the output parameter is the problem, your single line doesn't have a local parameter variable to store the output value in (it does under the hood but...)
# April 2, 2004 2:55 AM

Dennis said:

I'm doing something like this now on search screens...populate search results from a dataset, upon user selection I pass the selected datarow.

I'm doing this in Winforms, I've got various places from which I call a search screen, and depending on whether various columns are populated, other screens may pop up...and which other screens those are depend on where you're calling the search screen from. Passing the row back to caller makes it easy to handle all that logic.
# April 2, 2004 8:36 AM

TrackBack said:

# April 2, 2004 9:21 AM

Ryan Gregg said:

The bad thing about throwing around data rows is that they could have any format, and the format can change. If you're working in an environment where code is reused all the time, or on a team program, you have to make sure everyone knows what columns are going to be in the data row, what types they are, etc.

If someone gets bored one day and changes the names of the columns, you better hope they let you know! :-) At least with business objects, you'd get a compiler error letting you know the properties you were using didn't exist.
# April 2, 2004 9:35 AM

Dave Burke said:

Ryan, Funny. Yes, you're right. Business objects would be preferrable in that regard!
# April 2, 2004 9:35 AM

Ryan Gregg said:

Now, why again would you want all of that on one line?

It isn't horrible to read and figure out, but I think it would be a lot more clear spread out over multiple lines like normal.
# April 2, 2004 9:45 AM

Dave Burke said:

Ryan, Good point. Maybe its a C# thing... But you're right, if I were to have several parameters, I would definitely create a parameter array instead of create the parameters on the same line as the ExecuteScalar statement.
# April 2, 2004 1:00 PM

TrackBack said:

# April 5, 2004 11:36 AM

Mark Struck said:

Dave,

If you don't want the file open/save dialog to popup but want the excel document to open directly in the browser change the second parameter in the AddHeader method to "inline;filename=whatever.xls"
# April 7, 2004 12:27 AM

Dave Burke said:

Mark, Thanks. I tried that and it worked great, but its important for our users that the report opens in Excel, not in IE. I would agree with them on that score, cause if I am looking at an Excel spreadsheet I want to have the full resources of Excel to work with it. So I guess we'll live with the double dailog box display for now.
# April 7, 2004 2:08 PM

Mark Struck said:

Dave,

After a little searching I came across this at MSDN.

http://support.microsoft.com/?id=238588

It describes the behavior you were referring to. Hope this helps.

# April 8, 2004 4:36 AM

Dave Burke said:

Thanks, Mark. That KB helped! I'm posting the solution now...
# April 8, 2004 9:27 AM

TrackBack said:

# April 8, 2004 9:52 AM

TrackBack said:

# April 8, 2004 9:52 AM

Jerry Pisk said:

Dave, this is not outputing native Excel file, it's just using the fact that Excel can import HTML.
# April 8, 2004 1:09 PM

Dave Burke said:

Jerry, You're right. Thanks for the clarification. Native Excel as I defined it is launching Excel rather than viewing in a browser. Once it gets there (thanks to Office's HTML smarts), its a bonafide Excel doc in my book. Speaking of HTML smarts, Jason Haley has a great post on exporting excel data with formulas: http://dotnetjunkies.com/WebLog/jhaley/archive/2004/03/20/9583.aspx
# April 8, 2004 5:45 PM

Jerry Pisk said:

Dave, thanks for that link, that article is definitely more like it since it actually uses Excel's "HTML" format.

<rant>Of course it would be nice if Microsoft actually posted the format so we don't have to reverse engineer it (which is illegal, at least in the US it is), I'm wondering if Jason has a permission from Microsoft to post and explain that piece ;)</rant>
# April 8, 2004 10:58 PM

Jason Haley said:

Dave, nope I don't have Microsoft's permission to post their HTML format. If you don't want to use the reverse engineering method, check out http://www.carlosag.net/Tools/ExcelWriter/Default.aspx, it makes my method look like a hack. Plus I think Carlos works for Microsoft.
# April 9, 2004 9:10 AM

TrackBack said:

MSDN reference for Excel 2002 xml spreadsheet reference
# April 9, 2004 9:32 AM

Shannon J Hager said:

Hager, please. :)



(This wouldn't be so bad if it didn't happen constantly and if I didn't have such a beef with Sammy)


Glad the link helped. That place is great.
# April 10, 2004 1:51 AM

Colin Ramsay said:

That place is great, an inspiration for the new generation of standards aware web designers.

You may be interested to know that Zen Garden accepts external stylesheets in it's URL:

http://www.csszengarden.com/?cssfile=http://dan.kvsys.com/zen/slash.css

You can develop a look for it without having to download the HTML code.
# April 10, 2004 5:27 AM

Jason Haley said:

Great tip on the external stylesheets in the URL ... didn't know that. That will be cool to try out.
# April 10, 2004 7:10 AM

Dave Burke said:

Sorry, Shannon. I thought your name had a musical ring to it, now I know why.
# April 10, 2004 7:41 AM

SBC said:

Joe is quite a knowledgeable guy and makes presentations in this neck of the woods also (http://weblogs.asp.net/sbchatterjee/archive/2004/03/07/85628.aspx)..
# April 13, 2004 5:54 AM

Anonymous Coward said:

Actually it would seem that based upon these status designing at something lower than 640x480 would reach the largest audience. After all at 800x600 you reach 94%, at 200x200 or something you reach 100%.

Another good question to ask is who are those who are running at 800x600, and who are those running at a lower resolution.
# April 14, 2004 9:01 PM

Jose Rocha said:

Hello!

I have a Windows 2003 Ent server running IIS and CDONTS.dll. I am getting the following error: Microsoft VBScript runtime error '800a0046'. I followed MS's KB at http://support.microsoft.com/defaul...kb;EN-US;197619, but it did not fix my issue.

Can somebody help me? Thanks in advance.

Jose
# April 14, 2004 9:07 PM

Dave Burke said:

Anonymous Coward, Good points, all! :-) My theory is that there is a direct relationship between aging and bigger fonts, i.e., decreased screen resolution.
# April 14, 2004 9:07 PM

Jerry Pisk said:

I still don't understand why most developers try to lock their design into a single resolution. Just design the app/web site that it scales to almost any resolution. It's not even that difficult, just look at MSDN which scales, unlike the main Microsoft.com page.

And for those arguing that long lines of text are difficult to read - there's a thing called window that you can size to your own comfortable size. Just let the user pick their own size, don't force your own on them.
# April 14, 2004 9:36 PM

Dave Burke said:

Jerry, I'm a big believer in scalable style guidelines, like MSDN or Amazon, but there are as many sites out there (like MSN or MSNBC, for instance) who value the control which comes with a fixed dimension layout.
# April 14, 2004 9:48 PM

Chris Stewart said:

I certainly agree! I'm doing a similar site right now. I really have spent a lot of time just figuring out new things.
# April 14, 2004 11:15 PM

Dave Burke said:

Chris, Thank you much for the confirmation. I believe strongly in the value of this approach to afterhours coding and the learning that results, so its good to know that others can relate and agree.
# April 15, 2004 7:26 AM

Jeff Berg said:

I feel sorry for the people with Lower than 640x480 resolution. Poor webTV users.

The Jeff
# April 15, 2004 11:41 AM

ed said:

I use mythtv [http://www.mythtv.org/]. No subscription fees, web interface w/the ability to schedule recordings online, and the box didn't cost me anything either (had an old athlon sitting around). I can watch the shows on my TV, or my linux box, or on my windows laptop (wireless & samba). Oh yeah, one more thing: open source. I have the option to customize the software and offer my changes back to the community.
# April 15, 2004 11:52 AM

Dave Burke said:

WebTV!!! So THAT'S who comprises that 5%. Thanks for your comment, Jeff.
# April 15, 2004 12:39 PM

Dave Burke said:

ed, I didn't know. Interesting! Thanks for the comment.
# April 15, 2004 12:40 PM

Jerry Pisk said:

I think the lower resolutions are mostly PDAs and phones. Does anybody actually use WebTV?
# April 15, 2004 3:08 PM

Dave Burke said:

Jerry, Yeah, I thought of those after I posted the WebTV comment. You B right. PDAs and phones mostly, no doubt. Thx!
# April 15, 2004 3:18 PM

Elena said:

Hello!!

I have a question..

When I call a COM component in Asp.NET, I receive the following error message: Exception Details: "System.Runtime.InteropServices.COMException: Bad file name or number"

I don't understend why.

I try to know if remote share file exist or not.

But I don't know if file exsit in share remote,only know if file exist in a local share.

I have tried everything to get this to work, but I can't :(

I work in Windows 2000.

Thanks!!!
# April 15, 2004 10:10 PM

TrackBack said:

# April 16, 2004 3:39 PM

Shannon J Hager said:

gotta love Excel... you can open your 01234 zipcode-containing csv file and then format that column to "text", Excel will say that it will treat the column as text, leaving it exactly the way you entered it, even if you enter a number.

but the 0 will still be missing.

So far, I have never used Excel for anything EVER except to open files someone sent me that must be imported into other formats.
# April 16, 2004 4:42 PM

Dave Burke said:

Shannon "HagER" dude, Thanks for your comments. Its good to know my frustration with Excel is shared. You said it well.
# April 16, 2004 4:44 PM

Darin said:

I too am starting to use CodeSmith and am impressed with the speed of your development.

Could you post your templates? Be interesting to see your architecture.

# April 16, 2004 5:31 PM

Dave Burke said:

Darin, I feel like a selfish shit for not posting them now or on the CodeSmith forums, but they're the basis for an article I'm working on which I hope to have completed in the next few weeks. I'll definitely post back on my blog on any Code Generation-related template action.

To describe my approach, I start with a view, then select into a tmp_table, to which I add a primary key. That table is the basis for the business object, as well as the HTML form controls, the methods to populate the controls as well as the method to populate the business object afterward. The b.o. is passed to the DL where a CodeSmith template generates ADO.NET insert and update methods based on the SQL tables.

The article will elaborate on each of these aspects of the architecture.

And yeah, I am LOVIN' CodeSmith. Thanks for your post. Will get back to you soon.
# April 16, 2004 7:14 PM

darrenford said:

Don't forget Excel's 64,000 row limit.
# April 17, 2004 9:50 AM

Dave Burke said:

Darren, Yes, I hit that wall before, but I don't remember it being "that high" :-) thanks for the reminder.
# April 17, 2004 9:53 AM

Me said:

foreach( DataTable dt in ds.Tables )
{
foreach( DataRow row in dt.Rows )
{
string rowMD = row["md"].ToString();
if( rowMD == md )
{
row.BeginEdit();
row["date"] = SPACER;
row.EndEdit();
}
md = rowMD;
}
dt.AcceptChanges();
}
# April 17, 2004 11:49 AM

Dave Burke said:

me - nice. Pretty similar, but with a foreach(datarow) loop, I see. Is that faster?
# April 17, 2004 3:14 PM

TrackBack said:

What the heck.
# April 17, 2004 4:53 PM

Han said:

hi,what if i want to return a multiset of select statement from my SP and the name of the table is based on my SP rather then name it inside my code

Example:
in my SP

SELECT * FROM tbl1
SELECT * FROM tbl2


in side my code
DataSet ds;
ds=SqlHelper.FillDataSet(objConn,"spName",CommandType.StoredProcedure);
//automatically i will have my datatable in my dataset name as tbl1 and tbl2.

Can this bedone in DataAccess Application Block???
please advise.
# April 17, 2004 10:40 PM

SecretGeek said:

Wise words, indeed!

And that 'removing zeros' issue is a reall pain.

i often use excel to help generate bulk sql statements when i'm fiddlign with data, or to create bulk code, or to help generate big html tables of data. but it's very clearly not designed for these purposes, as it is too heavy and tries to be too smart.

a 'programmers spreadsheet' would be better. it wouldn't have any notion of formatting, or charts, or auto-complete, or auto-anything, or bold or colours or printing (except as text perhaps). it wouldn't understand dates, for example. but it would be very lightweight in memory, very quick. With excellent support for macro recording, regular expressions, and .net integration. you could write plug-ins to it quickly and easily in any .net language. it would have no practical limitation in the number of rows or columns.

ahhh... i dream of software...






# April 18, 2004 7:16 AM

Dave Burke said:

SecretGeek, I use excel for bulk sql statements, too. A "Programmer's spreadsheet" is a great idea! Maybe someone will give us a URL for it? I dream of a url...
# April 18, 2004 7:47 AM

Dave Burke said:

Han,

SqlHelper.FillDataset(cn,CommandType.StoredProcedure,"testproc",ds,new string[] {"tbl1","tbl2"});

oughta do it for you. Then, after the statement you can immediately do a

DataGrid1.DataSource = tbl1.DefaultView;
DataGrid1.DataBind();

or whatever. Maybe I'm missing something?
# April 18, 2004 7:51 AM

Jeffrey Palermo said:

Thanks Dave. Yes, I'm a coder. :) I plan on being more active in the .Net community in the future, and I look forward to maybe meeting you at a dev conference sometime. By the way, where was all this community when I was developing with ASP 3? Yeah, we had newsgroups, but I think the development community is a lot stronger now.
# April 18, 2004 9:19 AM

Dave Burke said:

That's a very good point about community in ASP3, Jeffrey. One reason is because our work was so boring and uninteresting, I mean, we opened up a connection, created a recordset, and spit out some rows on a web page. (At least that's what I did!) Not much to discuss with THAT development environment.
# April 18, 2004 9:27 AM

Dave Burke said:

Jeffrey, forget to mention this in the first comment, but I look forward to meeting you at a dev conference, too!
# April 18, 2004 9:28 AM

Julie Lerman said:

Robert Scoble talks about being part of that small group of REALLY high res users: http://radio.weblogs.com/0001011/2004/04/17.html#a7220
# April 18, 2004 11:14 AM

M. Keith Warren said:

# April 18, 2004 2:17 PM

Dave Burke said:

Keith, I wanted to mention the good work of the SVPs as well, but I couldn't deal with TWO accolades which I would never obtain. Well, some day I MIGHT achieve "somewhat valuable" professional status...
# April 18, 2004 2:29 PM

Justin Lovell said:

For about 50% of the MVP's that I have seen around the community, they truly deserve the title and the respect. I post a lot at the www.asp.net forums (I am a top 25 poster) and I have also seen my share of bad MVP's.

For example, I have seen one person who posted an average of 70 posts per day since sign up and then just dropped the postings four days after five days of being awarded as an MVP. What is he doing now? I do not know... haven't heard a peep from him for six months. I am not critizing the nature of his posts (just links) but on the thought of recognition that took place to select him.

And I have also seen people who seem to act like a complete ass. The usual reply from them are "Read the docs."

I have been doing some serious thinking on the credit of the MVP Program because, as I have already said, only 50% of them really deserve it to the "definition" of what an MVP is. The title does not appeal to me anymore... only the type of person appeals to me.
# April 18, 2004 3:33 PM

Dave Burke said:

Justin, Thanks so much for taking the time to share your thoughts and experience with the MVP issue. Those are good points we should remember. I really like how you put it, "the type of person appeals to me." Couldn't agree more.
# April 18, 2004 3:41 PM

secretGeek said:

Don't you mean "RoyGate" ?

(you say to-mata, i say po-tata)

secretGeek, LVP.
# April 18, 2004 8:24 PM

secretGeek said:

Oh -- i meant to say "Three Cheers for Julie Lerman"

She does more to encourage technical blogging than anyone else i know.

I went from 'sometimes writing web articles' to 'continually blogging about anything technical (or otherwise) that happens to me' mostly because of the extra traffic and attention that *she* sent my way. And I've seen her do that for a lot of other bloggers/developers too. I'm sure that in the off-line world, she also encourages many programmers to do what they do.

(i only ended up your blog, for example, because she'd mentioned you!)

i say again: Three Cheers for Julie Lerman

cheers
Leon
# April 18, 2004 8:52 PM

Dave Burke said:

Leon, I enthusiastically join you in the Hip, Hip, Horrah for the Lermanizer. Well said regarding her blog-zone of influence.

As for "the Gate's" point of origin, technically speaking I'm with you on the Roy-O-Gate source, but the nerd masses know the incident as "RoryGate," so I'm compelled to go with the flow.
# April 18, 2004 9:11 PM

Frans Bouma said:

Justin: life isn't build around www.asp.net's forums. An MVP can be doing something else now which has nothing to do with www.asp.net's forums.

What disturbs me is that a lot (and I mean: A LOT) of people are so incredibly lazy, it hurts. They don't read any docs, don't search google groups, hell, don't even try the idea they post in their question first. However they expect answers, and fast. An MVP is not a payed helpdesk employee. I can perfectly understand that an MVP says: "Read the docs", as that's often the only right answer to give. I roam hte C# newsgroup and a couple of others a couple of times a day to answer questions and often I see questions which are too silly to bother with. Not because they're hard to answer, but because the person has no clue what he/she is dealing with. We're not baking a cake here, this is software development, often these people are 'professionals', earning money for what they say they can do. If these people ask silly questions, sorry, but "Read the docs" is the only appropriate answer: they not only start reading the docs for the answer on their question, but they also learn that reading the docs is good, and will avoid having to ask the NEXT question which follows from the answer on their previous question(s).

A lot of questions are also just good questions and require an answer. However, you can't and shouldn't expect that an MVP answers silly questions just because he/she's an MVP.
# April 19, 2004 4:50 AM

Zoltan Koszegi said:

I made a sample asynchronous callback on a webservice in C#. It worked fine. Then I tried to practise with the 'ar.IsCompleted' code. When I put it in a 'while' cycle the callback function was not called at all. In the 'while' cycle I put some text to the output window by seconds. It seemed that these messages would be never disappear, because the callback couldn't (or never) completed.
mailto: zoltan_koszegi@qdev.hu
# April 19, 2004 5:33 AM

Dave Burke said:

Zoltan, You're absolutely right, as Ali said, the loop file is unnecessary in the example.
# April 19, 2004 7:41 AM

Brendan Tompkins said:

Dave,

Using foreach on a DataTable is the only way to go! You might be interested in my recent post about dynamically creating related DataTables

http://dotnetjunkies.com/WebLog/bsblog/archive/2004/04/15/11483.aspx

-Brendan
# April 19, 2004 8:58 AM

Dave Burke said:

Brendan, I didn't know about foreach being better. Will investigate. Thanks!
# April 19, 2004 9:17 AM

Julie said:

wow Leon- thanks. I know how hard it is for you to be serious :-) so I appreciate your comments that much more.
# April 19, 2004 11:21 AM

Justin Lovell said:

Frans, I am not trying to start a debate but when I respond "read the docs" all the time, I am sure as hell that I would not expect (or should I say "dream") to be a MVP or even get some sort of respect from someone else.

Sure, there are rather "lazy" people... they normally hang out at the Getting Started / Newbie sections... I steer clear of those sections.

I am being rational on this. I am not going on the extreme sides of the scale -- but what do you think of a person who just says "read the docs" when someone asks a rather good question for the topic of that forum (and keep in mind that I have witnessed some of those actions in the intermediate to high level forums and newsgroups)? That is what I am talking about in the last post... I am not targetting the guys who get frustrated at newbies for rather stupid questions -- I also get frustrated as well.
# April 19, 2004 3:44 PM

secretGeek said:

Frans is right: People who ask questions that demonstrate a complete inability to check google or docs first deserve no more than a "read the docs" response.

Justin is right: People who give the answer "read the docs" have hopefully done nothing to get themselves any closer to an MVP.

Ahh, isn't it nice when we can all just agree and get along and be happy with each other and give each other a big hug. In a manly way of course, not in a kinky way. I didn't mean it like that.

lb

ps. JL: who says I was being serious? cheers!
# April 19, 2004 10:46 PM

AJ said:

Ugh this is horrible. I would hate to be a new developer working on this project and deal with abbreviations like "coupd".

We have a large number of files with a large number of developers working on them, and we use very descriptive and long filenames. It works well.

How about Wiz_Oppt_CompanyUpdate.aspx? It's not THAT bad... Don't be afraid to use PascalCase!
# April 20, 2004 1:01 AM

Mischa Kroon said:

longer names with grouping like AJ suggested makes it a lot easier.

group_section_action.aspx

and why use _ with ascx files they have a file extension so you could probably skip that part.

Saves you a whole character :P

also pre wiz in the directory wizards...
Seems silly.

That said every naming scheme has its ups and downs.
# April 20, 2004 3:20 AM

AndrewSeven said:

More folders.
You need to group things.

Better (longer) names.

...and for the blown away code you need a source control system.
# April 20, 2004 9:07 AM

Scott Galloway said:

I keep Petzold's book around as the definitive reference to doing pretty much eveything in Windows with C#. I also have Chris Sells and Erik Porters books - and whilst they're a good starting point, they're far from comprehensive; you can read them cover to cover without taking powerful stimulants which is different to young Mr Petzold's book.
# April 20, 2004 9:22 AM

Brendan Tompkins said:

David,

I've struggled with this too, and I've come up with the following pattern. I store my different possible views in a View enumeration, and then call a method wich does the hide/show stuff. It works really well, and keeps all this view stuff in one place...

-Brendan

public enum ViewEnum
{
PivotTable,
PivotChart,
NotSet
}

private void ShowPanel(ViewEnum view)
{
if(m_state.CurrentView == view)
return;
else
{
this.pnlPivotChart.Visible = false;
this.pnlPivotTable.Visible = false;

switch(view)
{
case ViewEnum.PivotTable: this.pnlPivotTable.Visible = true;
break;
case ViewEnum.PivotChart:
this.pnlPivotChart.Visible = true;
break;
}
}

// Set and store the state
m_state.CurrentView = view;
m_state.StateStore(this.Session);
}
# April 20, 2004 9:32 AM

Justin Lovell said:

Don't I know from somewhere? Andrew??
# April 20, 2004 10:27 AM

Dave Burke said:

Scott. Funny! Thanks for your comments. I've considered keeping young Mr. Petzold's book as a reference, but I'll resort to searching the MSDN docs or something when I have the rare need to get deeper into these things.
# April 20, 2004 11:55 AM

BarfieldMV said:

Such a simple sollution to such an unexplainable problem. I really looked everywhere for an answer to this question. After installing windows 2003 om my laptop and configuring it as a workstation, activating the server components wasnt as easy as turning them off.

Where did you find this answer?
# April 21, 2004 10:05 AM

BarfieldMV said:

Also, do not forget to turn on asp.net in the IIS console -> web service extensions
# April 21, 2004 10:10 AM

Dave Burke said:

Barfield, This was one of those actions based on years experience. Usually the solution is found through googling for it, but this was similar to situations encountered in pre-2k3 OSs as well. Thanks for your comments!
# April 21, 2004 10:14 AM

TrackBack said:

# April 21, 2004 9:23 PM

Darrell said:

Truncate table erases everything without writing anything to a log. Such power is a good reason not to make it easy to do.

Now if only the rest of SQL Server was that secure! :)
# April 22, 2004 8:52 AM

Dave Burke said:

Darrell, Thanks! I was wondering what distinguished truncation from other operations. I appreciate the information!
# April 22, 2004 9:12 AM

Pat Piccolo said:

Has anyone else pinned the solution explorer to the top of the VS_IDE instead of to the right side besides me? My foldernames and filenames are so long that it just seemed to make sense to pin it to the top; otherwise, I had to stretch it to 1/2 the screen to see the full filename. I guess I need to wrap up some of my more common pages (login, etc) into server controls so I can hide a dozen or so source files at a time.

Still trying to get a reliable setup for my Whidbey CTP so I can see how much worse code-beside makes things.... the darn thing runs more reliably in my Virtual Server running Win2k3WebServer than on my dedicated XP Pro Dev HD. Too bad I only have 1gb on my Virtual Server PC... Win2k3WebServer w/Whidbey is a memory hog and is sooo slow.
# April 22, 2004 10:46 AM

Dave Burke said:

That's interesting, Pat. Sounds like pinning to the top is what would work best for really long filenames. No, I haven't heard of anyone else doing this. :-) I should probably increase the length of my filenames, but how about us pinning solution explorer to the left of a second monitor in a dual monitor setup? That would work for me!
# April 22, 2004 10:59 AM

TrackBack said:

# April 22, 2004 11:48 PM

TrackBack said:

# April 23, 2004 12:00 AM

Jon Galloway said:

And on the other corner of the country (San Diego), I jogged by a rattlesnake today. Third one in two months.
# April 23, 2004 1:16 AM

Karl said:

Couldn't you solve your problem using strongly typed classes?

'cast you base page to its type and declare a property which'll hold your Template

public class Directory
Inherits Page

public Template as MyTemplateBase

Sub Page_Load
Template = ctype(Page.LoadControl("~/template.ascx"), MyTemplatePage)
placeholder.Controls.Add(template)
End Sub

End class


declare a bass template:
public class MyTemplateBase
inherits usercontrol

public body as control
end class

Then, in your template:

public class PageMemberTemplate
Inherits MyTemplateBase

sub page_load
'body is defined in the base class
body = Page.LoadControl("dirbody.acx")
placeHolderBody.controls.add(body)
end sub
end class


and finally, from your red control, you can get to the blue control via:

ctype(Page, Directory).Template.Body

or something similar...
# April 23, 2004 8:37 AM

Dave Burke said:

Karl, Thanks! I'll pursue this tonight and post back. I never considered strongly typed classes. I very much appreciate you taking the time to provide this possible solution.
# April 23, 2004 8:46 AM

Brendan Tompkins said:

Dave,

I've considered this same problem, and I've decided that referencing parent objects is not the best OO pattern to use. When I've needed to do this, I'll raise an event in the child control, to which the parent subscribes. 9 times out of 10, this gets around the problem of parent-referencing.

-Brendan
# April 23, 2004 1:33 PM

Dave Burke said:

Brendan, Events in the child control subscribed to by the parent. Wow. This is something new on my "definitely must explore" list. Thanks!
# April 23, 2004 1:55 PM

TrackBack said:

# April 23, 2004 11:32 PM

William Bartholomew said:

I was trying to solve a similar problem, here are the options I looked at:

1. Robocopy
2. Windows port of rsync
3. Using IIS's FTP server and the ncftp command-line client

Option (3) is pretty good, you still get authentication, running over the VPN means it's secure and FTP supports resume if the connection is broken.
# April 24, 2004 12:38 AM

Michael Carr said:

XXCOPY is a nice alternative. Very flexible.

www.xxcopy.com
# April 24, 2004 12:44 AM

Raymond Burns said:

For what it's worth, I'm a non-programmer and was able to create necessary forms fairly easily. What I couldn't do, I was able to find online. I'm using Data Views in Frontpage to connect to query Forms to pull necessary information. To display the necessary info in a webpart, I'm just using filters which seem pretty intuitive.
# April 24, 2004 12:51 AM

Dave Burke said:

William and Michael: THANK YOU! I'll investigate and post back.
# April 24, 2004 1:20 AM

TrackBack said:

# April 24, 2004 1:48 PM

TrackBack said:

# April 24, 2004 1:48 PM

Brian Desmond said:

Does it work if you go in and create files and folders with explorer? Do you have modify rights on the parent directory and the whole subtree?

Are you using the FQDN of the target server?
# April 24, 2004 2:37 PM

Dave Burke said:

Brian, with explorer? yes. mod rights? yes. FQDN? I tried both. See the "Robocopy DOES..." post. Seems it worked on a W2K destination server! (but not W2K3.) Thanks!

# April 24, 2004 2:45 PM

Julie Lerman said:

I'm sitting here write now doing stuff in C# and have to keep compiling just to make sure I have stupid things like casing right...But i'm having fun anyway. Too darned windy for cycling today unless you can assure it always being at your back!
# April 24, 2004 3:16 PM

Dave Burke said:

Julie, that's funny! I should have mentioned the exception to the frequent-compile rule: VB.NETters learning C#. HEY, WHAT ARE YOU DOING WRITING C# CODE?????
# April 24, 2004 3:24 PM

Colin Ramsay said:

That's really interesting. The evolution of code and code-writing methods is something I've noticed in my code; it's amazing to see the rapid changes one can make when they are just a learned like me.

I understand your preference for table based layouts, but it really does have an interesting parallel with your main point. Table based layouts can be compared to your use of the label control. Pure CSS can be compared to the static library method. It's an evolution, from clumsy to elegant.

As a final note, in designing pages it's not usually necessary to rely on absolute positioning. Using floating elements and such allow for very flexible layouts.

See www.csszengarden.com for more, but I can certainly understand the desire to stick with what you know best if you don't have time to invest in CSS.
# April 24, 2004 3:57 PM

Dave Burke said:

Colin, A lot of good stuff in what you say. Yes, someone (here on weblogs.asp.net) turned me onto csszengarden not long ago. I may have a new company site to put online soon (as opposed to my usual web application work), and I figured I'd learn a thing or two more about CSS then. Good analogy between CSS and the static library method. Thanks for the comments!
# April 24, 2004 4:15 PM

Greg Pyatt said:

I had a manager who got his panties in a bunch at me because I kept flipping back and forth between Visual Interdev and my browser (a "recompile" of sorts). He was a dick who had no reason to be, other than taking advantage of his position to dump on people.
# April 24, 2004 4:23 PM

Jerry Pisk said:

Just use Java IDEs, the good ones (Eclipse, IntelliJ) compile in the background on resource change and alert you about errors on the fly. No need to sit there watching a minute long compile as with Microsoft's tools.
# April 24, 2004 4:56 PM

Jerry Pisk said:

The request's Context is a lot better place to store request related objects than the Session.
# April 24, 2004 5:08 PM

Udi Dahan - The Software Simplist said:

"How does TDD fit into this picture ?", asked the devil's advocate :)
# April 24, 2004 5:35 PM

Dave Burke said:

Jerry, Ya know, you're absolutely right. I'll most likely re-architect to go with context rather than session. While I use it, I'm still not a big fan.
# April 24, 2004 6:13 PM

Dave Burke said:

Sorry, Udi. I don't know the acronym. I don't know what that tells you about me, but there it is. What is TDD?
# April 24, 2004 6:15 PM

Steve Steiner said:

TDD is test driven development. Tests are written first, and code is written second. It is popular with the Agile Programming crowd, and is a good practice in general. The typical pattern with TDD is to code a little, compile, run tests, and repeat. Refactoring is a complimentary techinque where you alter the structure of your code without changing its behavior. It is typical to recompile and test after every non-trivial refactoring. As long as the recompile+test process doesn't take too long it is worthwhile to catch an error sooner rather than wade through many accumulated errors later.
# April 24, 2004 8:30 PM

Jon Galloway said:

While it can be taken to absurd lengths (compiling after a lable change), my code/compile cycles have gotten a lot shorter over the years. As Steve pointed out, the benefit is that you're not wading through accumulated errors and if you've just written some buggy code, it's best to debug it while the context and requirements are fresh in your mind.
Maybe I'm writing much simpler code than you, or you're running on a much slower maching, but my compiles take a few seconds. Or maybe I just write buggier code? ;-)
# April 24, 2004 11:38 PM

Dave Burke said:

Jon, No. The bottom line is most probably that I myself hit [CTRL][Alt]-B more often than I need to. Thx!
# April 25, 2004 12:40 AM

Brad said:

I suspect the manager who is questioning how many times a developer compiles isn't a very good manager either. The bigger (and better) question is what is the quantity and quality of work that the developer creates over time? Is that metric being "disrupted" or impacted by [CTRL][ALT]-B? If the answer is "yes" than there might be an issues, but I think in about 99% of cases the answer is a resounding no; There are many many factors that can far more severely impact a developers productivity than a re-compile...at least in this framework :-)
# April 25, 2004 12:41 PM

Dave Burke said:

Brad, Good points. The issue is productivity, after all. I guess I made this post primarily because I'm realizing that I am coding for longer periods before feeling the itch to hit [CTRL][ALT]-B.

I also know there are times I do it unnecessarily, just because I WANT to. "I like to look at things." Call it a combination of Chauncey Gardener in Being There "I like to watch" and the Paklids in the ST:TNG Samaritan Snare episode saying "We look for things. Things to make us go." The issue for me personally is to, well, compile less. Code more. I came across more authoritative in the original post than I should have, as its more a personal directive to myself. Thanks for your good input.


# April 25, 2004 1:03 PM

Karl said:

The ASP.Net 2.0 forums use a custom SectionHandler which I find helps elimiate a lot of problems with web.config. For your case it would isolate the loading of values to specific function, which would help debug. you might want to take a look at what they do.
# April 27, 2004 1:14 PM

Dave Burke said:

SectionHandler? Good idea. Thanks, Karl! I will investigate.
# April 27, 2004 2:02 PM

Phil Winstanley said:

That error is a pain in the ass wherever it occurs, could it really be that hard to go: -

Object reference (<THE OBJECT NAME>) not set to an instance of an object.

:)
# April 27, 2004 2:14 PM

Dave Burke said:

Phil, from experience I've learned to keep my expectations pretty low. Yes, that's a great idea.
# April 27, 2004 2:20 PM

Travis said:

Someone at MSDN expained in a blog article why they had to make this Exception so generic. Damn, I wish I could find it. I'll keep searching.
# April 27, 2004 4:54 PM

David said:

Where I work, .zip files are no longer allowed.
# April 28, 2004 3:31 PM

Dave Burke said:

Hmmm. Thanks, David. I've been working out of my home office for the last 4 years and forget about corporate policies. I appreciate those considerations, but blocking ZIPs just doesn't seem to, um, enhance productivity...
# April 28, 2004 3:36 PM

Bill Rodenbaugh said:

i don't know if i would do it this way... but you could :)

while ( dr.Read() )
team_uids = String.Format("{0}{1}{2}", team_uids, ( team_uids.Length > 0 ) ? ", " : String.Empty, dr["uid"]);
# April 28, 2004 4:27 PM

Christian Nagel said:

What about using GUIDs for unique identifiers?
Christian
# April 28, 2004 4:27 PM

Dave Burke said:

Christian, Because the use of int IDs from the user table is so pervasive throughout the schema, my thinking is that the simple int (in the user table an identity value) is preferrable. ?
# April 28, 2004 4:29 PM

Dave Burke said:

Love it. Thanks, Bill!

# April 28, 2004 4:31 PM

Shannon J Hager said:

the newer "no .zip" policies are becoming more and more popular because most of the newer viruses arrive as zip files. That does put a serious damper on business email abilities, though.

Outlook Express has a very simple but strange work-around for the over-protective built-in attachment security: when you get an email with a blocked attachment, open the message, then click "forward". The attachment will still be attached but no longer blocked. Now you can double click it and save it to disk.

I don't understand how a bug like that slipped in, but it is a life-saver at times.
# April 28, 2004 4:34 PM

Jerry Pisk said:

I keep wondering about how much you Dave actually know. You need to handle Null values before you convert them to value types, don't you know that value types cannot be null? And even then, the value you're getting when you convert NULL is DateTime.MinValue, so your check shouldn't be if the year is less than 1950 but if the DateTime value is the minimum value possible. Still, you should check for nulls BEFORE you convert to value type or use SqlDateTime, which is a reference type and can handle NULL values.
# April 28, 2004 4:42 PM

Dave Burke said:

Shannon. Thanks! Yeah, funny, I tried asking the user to send the attachment to my Outlook Express account, which I have POP'd to my company's Exchange server. I was going to try the forward trick (since it failed in Outlook 2003.) The funny thing was that the .MDB was flagged by McAfee GroupShield Exchange at HQ. (Its funny now. Wasn't funny yesterday. :-)
Thanks for confirming the "bug."
# April 28, 2004 4:43 PM

Matt Hawley said:

never thought of using it in the second way, I usually have:

string team_uids = "";
while(dr.Read())
{
if(team_uids != "")
team_uids += ", ";
team_uids += dr["uid"].ToString();
}
# April 28, 2004 4:47 PM

Dave Burke said:

Jerry, Shruggin' my shoulders. Don't know what to tell ya, dude. I know a lot about some things; not so much about others, like us all. I'm apparently light on under-the-covers info regarding null, value types, and reference types. But put a bunch of developers in a room and bring up the subject, there probably ain't a whole lot of fighting for floor time to get peoples' opinions in, I'm betting. You're right. I'm seeing that this is required reading.

Regarding checking for nulls BEFORE converting to value type or use SqlDateTime, you're advocating checking for null at the time of assigning a business property value? Say if I assign the bizobject datetime property from a database datareader, once assigned, I'm doing the checking for null, and thus the appearance of 1950.

Thanks!
# April 28, 2004 4:57 PM

Dave Burke said:

Matt, me too. The fact that there was no if() statement made it "blogworthy."
# April 28, 2004 4:59 PM

Mischa said:

use of a dictionary object :)

its bound to be quicker :)

ht(id) = " "
ht(id) = " "
ht(id) = " "

# April 28, 2004 5:13 PM

AndrewSeven said:

try a StringBuilder ...
# April 28, 2004 5:18 PM

AT said:

Welcome to insecure world ;o)

SQL Injection attacks waiting for you.
Once you will get team_ids = "9) or (1=1" you will be hacked ;o)
Also it will not work for big input (as there is limited length for SQL string) and it's pretty dam slow.

Preferred is to use String.Split(), ArrayList, sort and iterate comparing with prev element.

The only exception is in case if you need all thouse IDs to read more data from database. This way passing all IDs in one SQL statement offload your database from answering numerous statement by using only one. But SQL string limitation still here.
# April 28, 2004 5:38 PM

Ryan A. Rinaldi said:

I normally just do it in-line:
while(dr.Read())
{
team_uids += (team_uids == "" ? "" : ", ") + dr["uid"].ToString();
}

I might have syntactical errors since writing code in a textarea is not the easiest thing to do. :)


# April 28, 2004 5:41 PM

Anonymous Me said:

Only you wouldn't REALLY want to use the code you posted there, right? Rather than re-assemble the array for every item you want to access, you'd grab the array once, assign the result to a local variable and then access the items from the local variable:

string[] stuff = GetTeamStuff();
txtTeamEmails.Text = stuff[ 1 ];
txtSomethingElse.Text = stuff[ 2 ];
// etc.
# April 28, 2004 6:43 PM

Darren Neimke said:

System.Text.StringBuilder sb = new System.Text.StringBuilder() ;

while reader.Read() {
sb.Append( reader["myField"] + "," ) ;
}

string out = sb.ToString() ;
return out.Substring( 0, out.LastIndexOf( ',' ) ) ;
# April 28, 2004 6:50 PM

Jon Galloway said:

Well, I think you're a genius. This is a simple way to check for null and MinValue at once. Maybe offensive from a purist point of view, but definitely a practical solution to an annoying problem. I wish DataTime's were nullable - null means more than 1/1/0001, which is still a magic number in my book.
# April 28, 2004 7:01 PM

Dave Burke said:

Mischa and AT, Both excellent alternatives. Thanks much! I'll re-evaluate when faced with this again.
# April 28, 2004 7:14 PM

Dave Burke said:

Anonymous, You be right. Separate calls and re-assembling the array would be dumb. I'd better change my code. :-) Thanks!
# April 28, 2004 7:18 PM

Dave Burke said:

out.LastIndexOf(','). I'll remember that, Darren. Thx!
# April 28, 2004 7:20 PM

Dave Burke said:

Jon, Funny! I just tested Jerry's [if (datein == DateTime.MinValue)] suggestion, which worked as well. There's a lot to this whole NULL thing. Thanks for sharing your thoughts!

# April 28, 2004 7:32 PM

secretGeek said:

This one has other side-effects -- but the side-effects may actually suit your purposes:

Dim comma As String = ", "
team_uids = comma
Do While (dr.Read())
team_uids &= comma & dr("uid").ToString()
Loop
team_uids = team_uids.Replace(comma & comma, "")

Rather than lean toward terseness as happens above, i thought I'd try for verbosity:

Dim comma As New CommaHelper 'defined below
Do While (dr.Read())
team_uids &= comma.ToString & dr("uid").ToString()
Loop

Public Class CommaHelper
Dim _sComma As String = ""
Public Overrides Function toString() As String
Return _sComma
_sComma = ", "
End Function
End Class


# April 28, 2004 7:45 PM

secretGeek said:

(Note that indenting is lost in comments!)

'Assume Users has been instantiated
Public Function GetTeamStuff() As String()()
Dim team_ids() As String = {1, 2, 3}
Dim Team()() As String = _
{team_ids, _
users.GetEmails(team_ids), _
users.GetNames(team_ids)}
Return Team
End Function
# April 28, 2004 7:54 PM

Jerry Pisk said:

Dave, if you have a business object to hold your values then you're right, no checking should be there. But you should design your object to hold all possible values, if you have a database column that can hold NULL values then you need to make sure your business object can hold those as well. In this case, use SqlDateTime.

I do agree with Jon, DateTime should've been a class so it can be null. Pretty much everything should've been except basic types - characters and numbers. There should've been no structs in CLR. The performance gain is not worth the productivity loss.
# April 28, 2004 7:57 PM

Dave Burke said:

And the scary thing is I could actually follow along. Took me a while to get through it though. Thanks, SG! I enjoyed the, uh, read!
# April 28, 2004 9:19 PM

Dave Burke said:

Thanks, Jerry, for both of your comments. I had not considered ensuring that the business object can hold nulls as well. That makes good sense. I will be investigating how SqlDateTime plays a role in this as well. Regards!
# April 28, 2004 9:24 PM

Jerry Pisk said:

No problem. I've ran into a very similar problem before - I was using Struts and designing all these strongly typed objects to collect user input. And after while I realized it's just pointless when it can't hold all the possible input values so I had to redesign all those objects to simply use strings to hold values, since the end user can pretty much enter anything. The lesson learned - you need to design your objects to hold all possible values, not just the ones you expect. If a database column allows NULL values then your object needs to be able to handle them, if you're population an object with user input on an HTML form (or anything that runs on the server) it needs to be able to hold everything that the protocol allows (Unicode strings in case of HTML) since it's so easy to bypass any client side checking.
# April 29, 2004 2:54 AM

Dave Burke said:

Jerry, Your input (not a pun :-) has been very valuable. Talk to you later!
# April 29, 2004 8:20 AM

Brendan Tompkins said:

My approach would be similar to Ryans:

string team_uids = String.Empty;

while(dr.Read())
{
team_uids += (team_uids.Length > 0) ? ", " + dr["uid"].ToString() : dr["uid"].ToString();
}
# April 29, 2004 9:39 AM

Brendan Tompkins said:

Eeeew. Running this through SQL seems like using a bulldozer to flatten an anthill.

How about this?

ArrayList al = new ArrayList();
string [] teamIDs = team_ids.Split(new char[]{','});
foreach(string teamID in teamIDs)
{
if(!al.Contains(teamID)) al.Add(teamID);
}

foreach(string uniqueTeamID in al)
{
// Build your comma list here if you need it.
}

-Brendan
# April 29, 2004 9:45 AM

Dave Burke said:

Brendan, if team_uids.Length > 0. Ahhh, yes. Like it! Thanks!
# April 29, 2004 9:46 AM

Dave Burke said:

Brenda, you da man! Thank you for this non-SQL better way.
# April 29, 2004 10:02 AM

Dylan said:

I still really like Dave's original code. I've always done the
out.Substring( 0, out.LastIndexOf( ',' ) ) ;
approach.

I don't really like the team_uids.Length > 0 because it would take more processing to check length for each step in the loop. Wouldn't matter in .NET, but I do a lot of Flash Actionscript, where every little thing makes a difference with its limited processing power.
# April 29, 2004 12:23 PM

Roy Osherove said:

That "forward" bug also works with Outlook.
# April 29, 2004 5:28 PM

Roy Osherove said:

Um.. you could also use a cleaner approach at the end of the loop:
out.TrimEnd(',')
# April 29, 2004 5:44 PM

TrackBack said:

# April 29, 2004 9:59 PM

AT said:

Hey !! What you are all doing ?? String is imutable and any manipulations with it is BIG NO-NO ...

Use only StringBuilder to work with data and convert to string only after everything is done.

---
StringBuilder sb = new StringBuilder();

foreach (String item in items)
{
sb.Append(item); // Never use string concat here
sb.Append(',');
}

if (sb.Length > 0)
{
sb.Length--;
}

string ret = sb.ToString();

---
# April 29, 2004 10:36 PM

TrackBack said:

# April 29, 2004 11:23 PM

Scott Mitchell said:

Not the most efficient, but how about:

ArrayList a = new ArrayList();
while (dr.Read)
{
a.Add(dr["foo"]);
}

string s = String.Join(",", ((string[]) a.ToArray(typeof(string))));

(may be some typos,didn't test it...)
# April 30, 2004 12:38 AM

Jon Galloway said:

If you're iterating a datareader, you prolly pulled it from a database. Which means you could just get the csv list from the db:

DECLARE @Values varchar(500)

SELECT @Values = COALESCE(@Values + ',', '') UserID FROM Users WHERE STATE = 'MO'

SELECT @Values
# April 30, 2004 2:45 AM

Jon Galloway said:

And there are several ways to select from a comma separated value list in a stored procedure without using dynamic sql, so the sql injection thing goes away:

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=20675

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=33866
# April 30, 2004 3:13 AM

Anonymous said:

# April 30, 2004 9:28 AM

Richard said:

How about the 5 million games console users (PlayStation, Dreamcast, XBox and PS2)...
# April 30, 2004 3:52 PM

Dave Burke said:

Richard, Mmmm. Good one. I don't know if the "computer stats" included those or not. I'll have to check... Thx!
# April 30, 2004 3:54 PM

Phil Weber said:

October 2001 was the last MSDN Library compatible with VS6.
# April 30, 2004 7:16 PM

Dave Burke said:

Hm. I figured there was <i>some</i> reason. Thanks, Phil.
# A