Ramblings from the Creator of WilsonDotNet.com
It's about time you got on-board! Remember to sign into IM sometimes so I can ask you more ASP.NET questions!
Welcome Paul! I'm a big fan of a couple of the tools on your site...
Cool!
app/web.config file can reference an external config file : Fabrice's weblog
re: AppSettings can Reference an External Config File : Paul Wilson's .NET Blog
Great tip by Paul Wilson... : Loosely Coupled
AppSettings can Reference an External Config File : Wes' Puzzling Blog
About time Paul.. Welcome.. :-) - Anil
That looks really great Paul. I have a quick question, can you use this method to define multiple additional config files? Say you have e.g security.config, httphandler.config, errorhandler.config to easily seperate it all. Would this be possible and how? Thanks, John
I looked at this as well, I don't think you can define multiple files but I believe you can link them. Meaning your app.config appsetting can have file=standard.config and then the appsetting for the standard.config can have file=error.config an so on. I haven't tried this but it seems as though it would work. Wes
Something to note about .NET 1.1 : Bob.NET
QuickFix for Bug in ASP.NET Version 1.1 : Paul Wilson's .NET Blog
doPostBack Workaround : ScottW's ASP.NET WebLog
__doPostBack problems : Joshua Prismon's Technical weblog
Wow... I learned a lot from you about templates in ASP.NET and I'm glad to see you blogging now. Welcome the community :).
That's why I use GoDaddy.com. They are extremely efficient and extremely cheap.
Paul, I use them too, and didn't think that they would implement it so fast, but they have ASP.Net 1.1/1.0 listed on their site. I guess I'll be the next one to request a migration to 1.1
I am also in the atlanta area. You can also check out a Yahoo! group that's recently been created for .NET jobs in the Atlanta area: http://groups.yahoo.com/group/atlantadotnet-jobs/ (I think they are going to announce it at the next Atlanta .NET User group meeting http://www.atlantadotnet.org/)
This anomaly happened in Vermont sometime last year also. The epicenter was over in the Adirondacks. Throughout Vermont, the general consensus was that most people's first reaction was that their boiler had blown up! It was also early in the morning. I don't know if there was ever an earthquake here before. The world is changing!!
Workaround for Bug in ASP.NET Version 1.1 : Paul Wilson's .NET Blog
NUnit is the greatest thing since sliced bread. While not mandatory at my shop, it is <ahem&rt;strongly recommended</ahem&rt;
DOH! In addition, the employees and contractors working for Microsoft, ViewSonic, The Jolesch Group, and ClientLogic are not eligible to participate in this offer.
A Blog for Graymad
I'm with you on this. ValidateRequest is a great new feature and can only help by being enabled by default.
Sure, great feature - but I feel strongly that changing a default (any default, but especially one this signifigant) should be listed as a breaking change. It's pretty hard to argue that this is NOT a breaking change when you look at all the things that it... well, breaks.
Paul Wilson's .NET Blog
SQL Dependency? *falls over and dies from heart attack* Awesome!!! (y) But is it fast and efficient? You could do this before, but there was never really a need to because of the extra overhead it would take, making it pointless...so is it different now that it's backed in?
Two comments... NUnit works nice, but what do you think about NUnitASP (http://nunitasp.sourceforge.net/)? As for O/R mappers, I tried .NET edition of Pragmatier Data Tier Builder (http://www.pragmatier.com/) and I was really impressed. btw, personal edition is free. Also NHibernate project looks promising (http://sourceforge.net/projects/nhibernate). thanks, slavo.
What are you, some kinda sandwich geek? Sounds good. I've always said, Italians might have invented pizza but the Greeks perfected it. Look no further than Houston Pizza or Western Pizza in Regina, Saskatchewan two purveyors of the finest style of pizza this world has to offer. When it comes to pizza, Chicago has nothing on Regina. Now the Greeks are taking over sandwiches? Look out. Take care, Eli.
I agree with Philip. I like this feature, but it breaks a site which supposed to be live! In this case it should be in .Net 2.0 or disable by default. If you have a site with dozens of page, some containing forms, some that you want to validate, it's a pain to change the code.
I don't think the problem is with ASP.NET 1.1 defaulting to ValidateRequest="True". The problem is that a default install of the 1.1 framework changes all existing ASP.NET projects to point at the 1.0 framework.
sounds great! Do you know the timeline for release?
I think its slated for sometime in 2004, but I don't know that I've heard any specific month or quarter.
It appears the control is loading fine once you continue through the error. I'm not the best DOCTYPE resource, but two things come to mind: (1) Could the blank line above the DOCTYPE somehow be giving you grief? I know this needs to be first, but didn't think a blank line would be an issue. (2) This makes more sense to my inexperienced eyes.... an incomplete DOCTYPE? ALA (http://www.alistapart.com/stories/doctype/) shows a URL inside the tag pointing to www.w3c.org. Now, I could believe running things locally would somehow direct your browser to look someplace different than through a web service. If I read the error correctly, the problem isn't necessarily in the web service, but whatever is generating the DOCTYPE tag.
>The error message mentions an IExplore.exe.config file, but searching on this reveals few references and no real help, and I fail to see how such a file on the server would accomplish anything since security in asp.net will stop my browser from being able to retrieve config files. Well, I guess that is the problem then :) - Something that you use inside the assembly calls Ieexplorer.exe and as it run through the server it tries to find a ieexplorer.exe.config at the same origin it got the assembly from which is your server. Since your server is configured to disallow *.config to be send back, an error page is produced and send back instead. The doctype is unexpected as it should not be in an *.config file (or any XML...). Try the following: temporarily allow *.config in that sub dir and see how that goes. Alternatively you could allow *.config and disallow web.config.
this might help: http://urbanasylum.dynu.com/JustTheFacts/archives/000092.html
Thanks to all the comments so far. Here's my analysis of it to this point. Please continue to give me any advice you can think of. Even if it turns out to not be the problem, it is still valuable in helping me sort through it! Dave: The control loads fine, but the data that should show up in the control is never loaded since this is the call that the control makes back to the server. I removed the DocType tag as a test and it still gave the same error, so I think this is occurring due to the lack of the IExplore.exe.config file. Other than the mention of DocType for whatever reason, the rest of the error is definitely related to the calling of my webservice, not the loading of the page since that is already done. Marc: Its not that I'm using something that calls IExplore.exe, its more the other way around: IExplore.exe is calling my web service. Now, what to do about it? First, I need to know what to put in this config file, and the only mentions of it on the web seem to indicate it should state which version of the framework is supported. Maybe this is a clue that somehow I need to include this in the control itself, but I don't know if that is possible. Maybe if I built it with .Net v1.0 instead of v1.1 it wouldn't be a problem, but I specifically chose v1.1 since I've read in multiple places that v1.1 solves some security issues with WinForms in the browser. Anyhow, maybe I should try it v1.0 when I get a chance to see if that helps. Finally, even if I knew what to put in this file, changing the default security to serve up config files would be totally unacceptable, even if that is the only solution, since that would reveal all of my private settings in web.config! Yikes. ChadB: Wow -- that's a lot. Maybe as I dig through it I will find what I need. Can you by chance shed any more light on this stuff?
chadb's article taught me some new stuff, I didn't know much about that IEExec stuff work, very helpfull!! - From seeing the win form I was under the impression that you were using the IE control or even MSHTML to display stuff in the win form, maybe that got me on the wrong track. You don't actually have to have a ieexplorer.exe.config file, the problem seems to be that ASP.NET WP returns an unexpected page instead of either a) a real config file or b) a 404. Ieexec can handle a 404 which works just fine. But if you (ASP.NET...) return a real page, it thinks it gets the config file and tries to read it which in turn produces the exception. To my knowledge you _have_ to use v1.1 or else the security stuff wouldn't work, so you are right to stick with v1.1. And don't worry about security, you can still block your web.config and you can set it up just for that single directory to allow *.config files. This is from one of our projects (hope this gets through...): <remove verb="*" path="*.config" /> <add verb="*" path="web.config" type="System.Web.HttpForbiddenHandler"/> Machine.config disallows _all_ config files and I changed it so that just web.config files are forbidden. So, if you simply add this to your web.config in that single sub dir, it wouldn't surprise me if it works!! - Anyway, it's worth a try :)
Thanks Marc! That seems to have fixed it, although anyone that was previously testing it may possibly need to clear cached files and/or close your browser before the changes are picked up successfully. I also ended up creating a skeleton IExplore.exe.config file that now does get served to the browser.
Yep. Since I never ache anything, this fixed it for me perfectly. Now, let me understand this... .NET mean DLL hell no longer exists? ROFL. Wow, this gets archived for me.
I think in this case its more like security hell, and while its certainly a pain I think that's very much acceptable. Note that I would not have had this problem if I was using a more traditional GUI control, but mine is different since it calls back over the web-service. Overall, this was a much more pleasant experience than trying to get ActiveX controls working in the browser, so I would call it a huge improvement. Although there is that huge .NET redistributable that has to be installed on all the clients. :) By the way, the reason I'm using a web-service to retrieve the data is that the default sandbox security for WinForm controls in the browser does not allow real database connections! That stunned me the first time I saw it, but after thinking more I think its the proper security call.
"Texas Yankee"
>So who else is in or near the Atlanta area? Alpharetta here, and though I won't even begin to profess to be a .NET Expert I wouldn't mind getting together sometime.
<Paul>MasterPages to my article -- really cool</Paul> Really cool? How bout some elaboration on 'really cool'? Are you bieng humble or what? If someone on the ASP.NET team told me they were referring ppl to an article I wrote (even tho I haven't written any yet<g>), I'd be pretty proud. Brag on yourself.
Datagrid Girl
Yukon Beta Invites Out -- July+ for B1 : IDunno
Paul if you write your rant a little bit impersonal, it should be ok. After all a blog should be a space of freedom, with some limits of course ;-)
IMHO, I would write your opinions on the session with constructive criticism. Don't completely bash on the speaker, but give some ideas on what you were wanting out of the session and how you would have done things differently. Because a lot of the speakers re-use these presentations, it will be more helpful to do it this way.
Agreed. Please post constructive criticism. Don't attack anyone, but explain why you didn't like it. It is important that people know what was good and what wasn't. It will affect speakers, topics and session choices in the future.
The people running TechEd communicated with me that they want us to be brutally honest. They view the feedback in these blogs as an important source for evaluating everything that goes on at TechEd. I would be professional and honest in your crticism. Realize the speaker will probably read and benefit from your comments.
for those of us jealous that we're not there, bad reviews will salve our wounds. :)
But roaming profiles *don't* seem to be enabled. I have to create a VPN connection every time I go to use a machine.
Kind of reminds me of some of the programming books I've read.
Romaing Profiles are stored on a central server ... that would be where the disk space is an issue - oen can disable the caching of roaming profiles on a local machine with a quick GPO change.
I see that you've overcome your previous reticence to post a negative review of a session. ;-) I agree that this is an honest review, something that can be refreshing in an industry surrounded by much hype. Dontcha feel kinda bad for the guy, though? It's got to take a lot to put yourself on the line, and then get shot down like that.
The topic sounds a little academic or droll, but I read back over the description and could kind of connect the dots between what they said it would be and what it sounds like you got. Does that make it useful or compelling--well you were there not me, so I'll defer. But I don't think this was too much of a hatchet job, it clearly wasn't personal. Ideally the presenter can take it as one piece of constructive criticism, compare/contrast it with other evals and be better off and more self-knowing for it. If you find yourself in the FoxPro tent at the next TechEd then we'll both know that I was wrong there. :)
I say go for it. The beauty of this medium is that it gives you a voice where previously you had none against such things as conference sessions. Use it
Well, I can say that I agree and disagree at the same time. The material presented was most definitely very theoretical, and the attempt to sum it all up (presto!) with an implemention thrown together with scotch tape and glue during the last 15-20 minutes of the presentation was, in my opinion, a bad choice and very ineffective. ORM and modeling are very complex topics, and a presenter's objective must be either to teach the attendees about the theory in enough detail for a complete picture to be formed in their minds, or he/she should skip the in-depth soup-to-nuts speech in favor of a more brief introduction number of learn-by-implementation demonstrations. I prefer the theoretical, but I agree it seemed like a botch job as soon as the quasi-implementation demo was thrown in at the end. Additionally, if you had read the presentation description, it most definitely sounds like an implementation class to me (the ASP.NET in the title gives it away). That said, I think his knowledge of the topic was pretty solid; not to mention that the class was a 400 level. He also mentioned right at the outset that the talk would be mostly theoretical and very advanced. I found it to be a nice break from the average how-to sessions that are often difficult to spot just by title alone... theory is often thrown out the window in favor of code snippets. Obviously, understanding core competencies and concepts are much more important than syntactical details for certain topics; I would argue that ORM is one of those topics. Lastly, I couldn't disagree more with his suggestion of simply wrapping a DataSet or even inheriting from one for the sake of strong typing (UGH!!!!!!). Using his implementation for the mapping, I believe you need to factor a given business entity into an interface defining business methods and properties, and a class that implements those methods (somewhat obvious I suppose, but he didn't even mention it???). Next, the implementing class should use a PersistenceFactory of some sort that knows how to transform a DataSet into an entity and vice versa; really, the use of a DataSet is irrelevant and should be completely hidden from the entity implementation class. The factory itself should determine the best mechanism for persistence. Just a few thoughts... Ciao, <joe/>
Hi I am working support support for CommNet and we did see this problem. As pointed out by others this was not a Romaing Profiles issue we are pusshing out all type of applications wallpaper etc. we now a running scripts that keep deletting the files off the boxes. Sorry for the short entry and bad spelling I am using one of the Hitachi Sprint phones to enter this.
I wasn't there, so I don't know how bad it was, but I do know that ORM is an excellent technique to talk about both objects and relations in an abstract way that both database developers and code developers can understand it and talk about the same thing. The best possible way to generate an O/R model framework is to pick up an ORM model and generate both tables and constraints and code from that. O/R mapping is done in a variety of ways, some use datasets, some use own classes, some use a cache, others don't. One thing they have in common: they all share the same idea about 'entity', how to model these and thus how a table relates to a class. ORM is then an excellent choice, but perhaps the speaker didn't achieve to make that clear enough :)
Well, Frans - from what I basically seem to see here (I was not there), the problem is not that ORM may be a bad choice, but that the session was not supposed to be about ORM. It was supposed t obe about O/R mappings, and I would expect such a session to give an overview of the problem area, of possible solutions and stuff like this, instead of sticking to discussing ORM. I mean, O/R mappers are one of the most complicated thing in the industry (just look at the code you pzublicshed as a samplke for llbgen 2 - I would consider this to be a very badf implementation of an O/R mapper, very bad), and most developers need ah and to even understand the topic - so going off into ORM only, instead of the problemsatic areas you may encounter was not doing the session a facvour as it looks like.
I dont want to nag too much, but most features look useless to me. I mean, server side cursors / paging - thats all stuff you better dont use anway due to the impact on the server. SP's are a portability issue :-( The object stuff could be interesting, if it is exposed through standard ADO - otherwise I will always prefer a O/R mapper. THough this mapper can become much more powerfull in regards to YUKON. Still, I dont think they can erally do it - no. Unless the objects inthe database are very "ui centered". Support databinding and all this. No, I dont think they can do it good enough. And an objectspaces like solution would be a solution on top of YUKON :-(
SQL Server has supported recursive stored procedures ever since 7.0. Perhaps I'm missing a nuance of the new feature.
Hey Chris: Here's a link on "hierarchical query" support in Oracle: http://otn.oracle.com/products/oracle9i/daily/oct04.html Maybe calling it recursive isn't the best choice of words, but its a common description of what this achieves. I actually read a blog entry the other day from someone that this was the only reason he still used Oracle at times.
I heard they said they wer going to take down the Wierless network becuse they were gettign hacked/flooded and it was causing isues for desktops. is this true? Next year a provide that's worth anything like CISCO should host the Wierless network and set it up that you have to be enables so if you hack they knwo who you are right away.
Care to give us some examples of what made it so great or what types of things they covered?
Ack! I was one of the poor fools that got to that session late. By the time I arrived the line of people was OUTSIDE the door - this session was JAM Packed - not even a free spot to sit on the floor.
Hey Paul, Yes, can you speak a little bit more about this session? It sound very attractive and interesting! :D
I don't know any details (honestly) so that may or may not be the case. I do know that things were good Monday, bad Tuesday, and terrible Wednesday. Things got so slow, when you could even get a website to be found at all, that my SprintPCS Handspring Treo was way better. Today things seem to be much better again, although logging in still seems far too slow to me.
Andres Aguiar's Weblog
Thanks for the extra info on why the sessions were so great, you rock! I have thought about writing a book or beginning to present based on an application I've worked on for the last 18 months - you've just confirmed my suspicion that such a premise can "work".
Thanks Paul and all the other Technet bloggers for this past week. For those of us who couldn't make it, your photos and blogs, both technical and social have made it TechEd week for us too. Can you please elaborate on remoting for local communication? If say we have the web app and business tier on the same machine, should we use remoting for web app to business tier calls instead of just setting a reference and using standard object creation?
Hi Victor: Remoting for local machine communication would only be necessary for things in different processes (or appdomains also), not for normal communication across different logical layers on the same machine. Keep in mind that the distinction between layers and tiers is that layers are logical separations through code separation, whereas tiers are actual physical boundaries, like processes or machines. Thanks, Paul
Here's Clemen's comments on Remoting: http://radio.weblogs.com/0108971/2003/06/07.html#a189
Thanks, I see now. And for the link to Clemen.
I agree completely about WinGear.NET. When I asked them about the poor performance, they claimed they requested "a bigger pipe" than the Dallas Convention Center could provide. Wrong answer, idiots. I was here in 2000 for MEC and in 1999 for TechEd, and CommNet was great at both. Although MEC was a smaller conference, TechEd 1999 was very comparable in size to TechEd 2003. There were fewer CommNet stations in 1999, but that doesn't explain why CommNet 2003 was slow all the time, even at 9PM on Sunday and 7AM/7PM on weekdays, when relatively few users were on it. Once, I printed a single page from the middle of a table which had a printer at each end. Not knowing which end it went to, I walked around the table repeatedly until the page came out. I am 5'6" tall, so my short legs don't walk very fast, but I managed to log off and walk 5 full laps around the table before my page was printed, and there were no other pages coming off either printer at the time.
I too was really disappointed with this session, leaving early rather than sit through the entire thing. 45 minutes of it was more than enough. I understood the problem, but wanted a solution - oh well . . .
Jerry Dennany's Occasional Clue
Paul, SqlCE is really pretty amazing, all things considered. I have blogged about it myself, and currently have a 30+ Meg database running on my pocket PC (with Paint prescriptions of all things...). Have fun!
Paul, Did you get this by having an MSDN Subscription? A friend of mine said he spoke with Microsoft and they said that MSDN subscribers don't count (which contradicts the webpage on MSDN). Other than that, have fun!
I got mine from having a corporate Universal MSDN subscription -- just like it says. All of my colleagues have also gotten theirs too. I think it has to be Universal, not something lessor, and it must be corporate or actual purchase, not a gift subscription.
Good, I'm covered then :) Thanks
Ouch... Oh well, it was probably some moron who saw "cookbook" and assumed that ASP.NET is some sort of foreign food :) Or at least that is what happens in my neighborhood...
I love this book. Nice, simple, concise. I've been thinking about writing up something about OOD/Design Patterns in C# with ASP.NET and include some 'best practices' regarding effectively designing ASP.NET applications with patterns in mind. Know of any resources on this topic?
Well, you obviously don't need the book. ;-)
Maybe it's in USPS heaven, along with my PocketPC?
Thanks for the articles Paul - very timely and informative. Will certainly go through them throughly.
I wish I would have known about this bug before spending hours installing and reinstalling .Net. I've read your article and specifically the C# code, but where I am I supposed to use/place this code? I'm very new to .NET I appreciate your help!!!
In your page class, or even better put it in a class that derives from Page and have all of your pages inherit from that so you don't have to repeat the code all the time.
That Page Template Generator rocks my world!!!!
Congrats all around. -Scott
Nice to see some dev'ers are able to find employment without having to wait months between gigs. Paul, with as much as you know and with the reputation you have, why not try out the IC thing or start your own thing?
Good luck Paul in your new position. All the best.
Hey, man, it was really good working with ya, and I look forward to hearing more about what kinda tech stuff you get to work with. Keep us posted on how the new gig is going!
Hey Paul, what a wonderful life =) Best Wishes.
Good luck Paul!
It's a pain to type this? How lazy can you be, one line to change the default for an application in the web.config if you really need to. system.web pages validateRequest="false" / /system.web
I posted on this a little while back. I also have links to some other coding standards you might care to look at. http://dotnetjunkies.com/weblog/darrell.norton/posts/550.aspx
Now that everything is an object, using hungarian notation is just too complicated. Consider nCount - is that an Integer, an Int32, a class derived from integer etc. Also it is instructive to run FxCop against some of the framework dlls - Microsoft don't always practice what they preach ;-)
Our team follows the Microsoft guidelines for all public elements (including method parameters), while using hungarian inside. Roland P.S. One reason why I use hungarian notation: http://weblogs.asp.net/rweigelt/posts/21741.aspx
Earlier this year we went through the same process. We had a good number of VB6 developers and wanted to put together a standards doc for .NET development to ensure everyone was following the same (hopefully correct) practices. We ended up following most of the Microsoft recommendations. The reason for this was to ensure that our API's were consistent with all the other API's developers would work with in the .NET Framework. Introducing standards that conflicted with what developers would see when working with the framework would have only caused confusion. While writing the doc I tried to get a lot of feedback from others in the group to make sure it was something they would and could follow. In the end things ended up pretty good. A couple people needed a little guidance during the transition (old habits are hard to break) but I think everyone is pretty glad we broke the old habits early in the process. Best of luck! - Steve
I made the transition a while ago from Hungarian to MS's recommended standards for .NET. No problems whatsoever. I advise you and your team to "just do so". My team is currently making the transition as well (from my companies own standards). From what I can observe here sitting behind my desk… they all seem to be smiling and having fun with .NET: m_me vs. _me Isn’t all that of a big change, again… just make the transition. The people on “your bus” experience this as another challenge in order to make your company successful in the .NET world.
An interesting comment that you make is that "I don't want to disrupt things too much". I understand that as the 'new kid on the block', that might be a problem, but to be trite: a. That's what they hired you for. They needed a senior architect to implement standards. b. The constant is change. If you are in tech, and you can't change, you might have chosen the wrong career. Ok, that's the opinion part. Now for some other opinions: I like this opinion, though there's no 'meat' here: http://www.yafla.com/rants/quality/ The C++ FAQ has a decent take on setting standards: http://www.fmi.uni-konstanz.de/~kuehl/c++-faq/coding-standards.html#faq-27.1 One last thing - when setting these standards, ask yourself not only what do they do for you today, but how do they allow room for growth? Examples: How will use hungarian effect future use of Generics? Does your coding standard have room to allow for partial classes, etc? Does your coding standard tie you to Win32 centric ideas? Do they tie you into a certain 'way of thinking', that may restrict the developer from seeing a solution another way? (OK, languages tend to do this more than coding standards, but I think that there is a point to be made here.) Also, instead of enforcing silly things like 'number of spaces per tab', is a reformatting tool an option?
Don't be too harsh on standard issue. Standard is one, Productivity is the other. Those two things are not in linear relationship. To me, All public type names, public member (field, property, method) names must go through reasonable reviews. Comments of them are mendatory required to be good enough by the time each associated item is "drafted". They are refined when the related item is refined. Unit test app is also generally mendatory to be completed by the time the type is completed. Weekly status meething is a good chance to go through weekly review on those issues (Hey, Agile). As to private members and where the left bracket should go, I don't think the rule should be enforced, though general recommendation is good. As long as they are consistant, it is OK.
Whine and complain, whine and complain. At least you have jobs/careers. Some people aren't so fortunate. Nobody wants to work anymore...just sit around and have microsoft do all your automation. Get yourself a clue. Be proactive.
Dang it! You got me on a rant against Hungarian notation. It was too long for a comment, so I posted it to my blog (linked to my name above). Good luck with the job!
I realize that this is a public forum, so without being overly specific, what kind of resistance did you expect to encounter, what did you actually encounter, and how did you deal with it?
Two main areas of resistance are I think likely in any VB6 group converting to the new standards. First, most people are used to Hungarian naming conventions, and its really hard to convince people you won't miss it. I know I had this same concern when I made the switch, which I shared with my team. Over time this goes away as you realize you are now coding the same way everything else in the framework already is, but it can be a slow painful process. I do think FxCop makes that easier though, which I didn't have (or know about) when I switched. The other possible point of resistance with my standard is that I believe projects should be able to be built by automated processes, at least at some point in the future when the team and management is ready for this. That seems obvious, but this is actually not the way VS.NET work with VB.NET projects. For instance, VS.NET stores Option Explicit, Option Strict and common Imports Namespaces in the project file instead of the code files. It also has a root namespace that is stored in the project file, which either means VB.NET code usually has no namespace in the code file, or worse the namespace there is not really going to be the entire namespace in the end since it will be appended to the root namespace in the project file! So to enable automated builds, you have to remove the Imports and root namespace from the project settings, and then manually add these to each code file, along with the Options. Yes, I could create enterprise templates, but that's a lot of work, and it just reinforces not learning what's really going on behind the scenes. I actually don't mind VB.NET, even though I do my own stuff in C# mostly, but I do think it sometimes simplifies things too much for a real software development shop. For this, I simply tell them why these things are done, and I think it became a non-issue, especially since there were far more issues with the naming conventions. I briefly described the feelings of part of the team in the original post, and that's about all I can say at this time. Not that I'm really hiding much either, but you have to remember this is a new group of people to me, and me to them, so I simply don't know yet how everything is really being perceived until we get to know each other better. I've got some people with many years at PRG on this team that may very well, and rightly so, wonder who I am and why I'm here, instead of promoting them. Maybe that's not the case, but I think it would be a totally fair reaction to have, and only time with each other can change that, if that's even the case at all. So maybe I answered most of your questions, and maybe this will help someone else considering this route for themselves.
Interesting response - again, I wasn't trying to put you 'on the spot', but I was interested in the insights that you could offer. Thanks much!
I am having trouble getting my WinForm to show up on non-localhost machines. I get the control outline and then the control icon in the top left corner. Any ideas - it works great on my localhost machine and I can see your Windows Form. Thanks
Hi Darcy: You need to be have .NET v1.1 on client for security to be correct by default. I'm not sure, but it may be necessary to compile your WinForm control dll against v1.1 and have your ASP.NET site running v1.1 also. The control dll needs to be on the server in a folder that's accessible (not the bin). You need to make sure you are not referencing any system colors, but you've probably already done that if it works locally. Many things, like database access and file IO are still not allowed by default, but you should get an error in most cases. Some things also require having an IExplore.exe.config, like calling back with a webservice, which is a pain to setup and was the butt of my original problem that was posted here. I hope one of these hints helps, if not give me some more details about what yours is doing and maybe we can find something else. Later, Paul Wilson
"purpose rather than their implementation" A little quote from Richard Talent's "rant" I work in a small team, when I said yesterday that Hungarian notation was not the prefered naming style in .Net, I was asked what I meant by Hungarian Notation... It is hard to enforce good hungarian, and FXCop makes it quite easy to find and fix all kind of things.
I absolutely hate the process of writing Crystal Reports but they always look so good when finished and the users/management have no idea how much stress went into them, so they all love Crystal. I'm praying for a quick release of the SQL Server reporting tools.
You should check out Report SharpShooter: http://www.9rays.net/cgi-bin/components.cgi?act=1&cid=93
Crystal Reports: Pros: Reliable Plenty of Features Cons: They will rape you for every penny your organization has and then they'll still demand you buy more licenses. Active Reports: Pros: Dirt Cheap. Cons: Horrificly buggy. Terrible API. Missing a lot of basic features. Very very poor GUI tools. I would kill for a decent alternative to either of them. Summary: You're damned if you do, damned if you don't. Screwed anyway. Why not write your reports in Java using XML and XSL:FO? I would if my employer would let me....
What about: http://www.microsoft.com/sql/evaluation/bi/reportingservices.asp TTFN - Kent
Stay far, far away from using the version of Crystal Reports that ships with Visual Studio .NET. It is very buggy and unreliable. If you are seriously interested in going with Crystal Reports, I definitely recommend looking into version 9.0 which is marginally better. Also, like Bryan Murphy pointed out, be prepared to fork over a fortune to pay for licenses with Crystal. I have had good success with Active Reports, but it is really the lesser of two evils. Also avoid the Component One reporting tool at all costs if performance means anything to you (based on 1.0).
Hi Paul, I second Kent's suggestion, check out the beta of the MS reporting services included in SQL Server. The UI is integrated in VS.NET and it is quite a decent tool!! Best regards, Marc
Thank you for making the decision to go with ActiveReports. Please let us know if there is anything we can do to help you make full use of the product.
There is an open source O/R persistence layer for .NET at <a href="http://jcframework.sourceforge.net">the JC Persistence Framework</a> project on Sourceforge. It uses XML to store the mappings, and supports MSSQL, Access, OLEDB and MySQL.
Hi Marc, You mean MS Reporting Services in Yukon, or it is available for SQL 2K too? Peter
I just don't use them (well, mostly) for the reasons you've mentioned. If I need something I'll role my own or go find a sample to work off of. I have used Peter's Date Package (www.peterblum.com), Cyberakt RichContentRotator, and Telerik's Rich Text Editor. --Brian
I'm with you, Paul. Many third party controls, and arguably some of the built-in's for ASP.NET, are much too heavy. At Match.com we ended up rewriting alot of controls for that very same reason. -Jason
Very nice...
Thanks Paul, it was good to see you again! Marcie
Yup, I tried to go, but the beach was calling instead. Glad to hear that it was a good session...
"I was also pleasantly surprised at the number of people that knew who I was and wanted to talk to me" Of course we know who you are! You have a MASSIVE amount of content on your site. Your site is a great resource for anyone that has a quick-cycle project that they need to get out the door without reading an encyclopedia. You've helped me out of a bind or two with your articles and research efforts. Keep up the good work. Oh yeah, thanks for the code review. I know you're busy and it was great to read your comments. I wish more people were as honestly critical as you, we'd have much better software out there if they were.
Paul, thanks for coming out! I'm glad you enjoyed the talk on regular expressions. By the way, the regular expression tool test tool I demonstrated is live online at http://www.accelebrate.com/present (and incorporates the feedback I received during the talk). :-)
Just taking a quick look, you could change the "SELECT Count(*)" to "SELECT Count(@PrimaryKey)" and that should give you a speed boost. Reducing the number of columns in the select statement always speeds things up, even for aggregate operations like Count. Very interesting though; I will have to see how well it works for complex queries.
Take a look at WordML. Server-side generation of Word documents is now very well support - even without having Word installed on that machine!
Great article Paul, thanks.
They're giving a copy of this issue out at the PDC, too. Pretty good articles, all of them.11
Very interesting! Right now I'm using a solution based on creating a temporary table in the stored procedure for selecting rows from a table containing over a million rows. I will test to implement this solution and see if it boosts performance, which would be very welcome :) In my project I will have to make an inner join to retrieve User names from another table, but since I only have to do this on the outermost SELECT-statement (after TableName), and I have a good indexed structure, that shouldn't have a big impact on performance. Any thoughts?
Paul, It is good and to the point. I do not like posts about what i feel or heard in PDC. Rather give me code. Afterall, I am developer and not screen writer. I am looking forward your articles. Where do you get ASP.NET bits? thanks, Maxim
Well, that's the gotcha that remains, isn't it? Officially, you have to be at the PDC to get the bits. The first public beta is not scheduled until Spring 2004. That said, my guess is that someone looking hard enough will be able to find the bits in the next couple of weeks -- but not from me. :)
And for the record, IsFalse(obj) and IsTrue(obj) are both new operators for Whidbey.
Noooooo! They also used '()' for this one!!! Now 'foo()' can mean: - array index - generic type specification - method call Why oh why didn't they simply use a different set of brackets... This is cludgy... Ah well...
Or drop the parenthesis altogether. I know it's code, not English, but putting a prepositional phrase in a parenthetical phrase just looks awkward.
FWIW, I like the syntax. It looks like VB. After they did array initializers with curly braces and used C syntax for bit shifting operators, I was getting worried.
What other new classes are there? I heard there is going to be a new toolbar for win forms that has more functionality? Have you had a change to look at that? I see a lot of information about new stuff for asp.net, but what about new windows controls? thanks for the great information! Paul
Does it support USB as well or just plain ol' RS-232?
Why should anything be in one language and not the other? Personally I would prefer if there was no functional difference between the languages.
" I'm starting to wonder what's not in VB?" A decent syntax. Example: '()'. No further questions, Your Honour :)
See the following post for USB information: http://groups.google.com/groups?selm=eFyFozm1CHA.2188%40TK2MSFTNGP10
I haven't really spent any time looking at new Windows features, although I'm sure there are many. I noticed several new namespaces under System.Windows for instance, but I don't have my Whidbey machine with me right now to look them up.
Well, so far it seems that in a lot of the demos, VB seems to be getting a lot more design time support in the RAD environment - I don't know if C# is getting these design features and no one is mentioning them, or what....
::ObjectSpaces is one of the most exciting ::parts of .NET v2.0 to me. Really? Sorry to hear, because I am bored to death by an O/R mapper that is far behind the industry average for O/R Mappers :-( Nice that MS finally gets a grip on OO, too, but sad that ObjectSpaces just lacks everything beesides basic mapping.
Hey Thomas: Here's your chance to now publicly state what exactly is missing. I'm not the O/R mapping expert, so I'm honestly not real sure. I like your EntityBroker, but I also like ObjectSpaces, and it will automatically be there on my servers when .NET v2.0 is installed, which is a huge plus! So, what exactly are we missing in ObjectSpaces, and is some of that expected in the Beta possibly?
I actually write a whitepaper about his right now. Missing mostly: * Databinding (n, the ObjectDataSource does NOT cut it - details following in the white paper). This CAN possibly be handled, though. * Caching, especally in a cross transaction system. No plans from MS to get more intelligent there. * "Enterprise readiness". Read this, for example, as "Remoting integration". Now, this may not be releavnt for ASP.NET (it is IMHO - we write a CMS where the client uses Winforms and connects back to the server for editing). And some people may say you can remote your objects. Yes, but this SUCKS. And I mean this as verbatim. Handlign events is bad, as is performance. BOTH are things we currently handle with the EntityBroker. * A service object model, though this is related to remoting. * Multiple databases. Last time I looked at it, ObjectSpaces was SQL Server only. Maybe I missed something here, though. * Extensibility. THe ability to dynamically extend the object schema for non-trivial applications. We work on this, by allowing subclasses (inherited from the busines object) to replace them (we call this substitution). This allows some third party using your object model to extend it. * Extensibility, as in "supporting type inheritance, driven by the database" AND "extend this dyhanically when the ObjectSpace is created". SOme people with the EntityBroker still ask us why we keep the attributes around and dont use a XML file like OS. Simple. We compile the schema from the attribute when the server is created. Gives us flexibility. In general, ObjectSpaces seems not to be ready for modular applications. * Security Model. ANother issue we handle right now - re-integrating property and method seucrity into the system. * COM+ integration. IF you need COM+,, wouldn't it be nice if it would just integrate. * Database Schema Creation. So you deliver a progrm built with ObjectSpaces. Why the heck do you still ahve to deliver the database creation file? e handle this at the moment by adding the database schema information (like indicces) into the compiled dll's and provide a tool that then generates the database. Provider independant (Access, SQL Server - as you wish at deployment time). Scheduled for readyiness in two weeks. Now, to the plusses: ::it will automatically be there on my servers ::when .NET v2.0 is installed I have a hint for you: the MS Datagrid, is too. Still, we hardly use it. Copying another dll with the application is a non-issue. I see ObjectSpaces really as the "MS Datagrid" of O/R mapping right now. VERY basic, VERY limited for everything a little more demanding.
I always love the sound of "oh, hmm.. that's indeed a lot of work" when people discover that with a system of 100+ tables it is suddenly not 'handy' anymore to type in long lists of xml mappings :) Though I think Object spaces will be ok when it is released, however I fear it will suffer from the same lack of vision the designers of the dataset had: it's not generic enough: do you want a server-style object broker or adapter style objects, or objects which deal with persistence themselves (3 different patterns, there are way more to define)? How are multiple databases handled? Can I plug in Oracle's superior .NET provider ODP.NET? It really depends on the power MS will give the designer for Object spaces. I doubt the design will change anymore.
About the code, you use Northwind, LLBLGen Pro's demo also uses northwind :) So let's compare some code :) Object spaces: Category category = (Category)mapper.GetObject(typeof(Category), "ID=" + this.ID.ToString()); LLBLGen Pro: CategoryEntity category = new CategoryEntity(this.ID); This is a nice one: OS most likely has to fetch the object from the database. That's a read action which is not necessary. Here we go: Object spaces: category = (Category)mapper.GetObject(typeof(Category), "ID=" + this.ID.ToString()); mapper.StartTracking(category, InitialState.Unchanged); if (this.CategoryID.Text == "0") { mapper.MarkForDeletion(category); } // .. category.Name = this.CategoryName.Text; category.Description = this.CategoryDescription.Text; mapper.PersistChanges(category); LLBLGen Pro: (using the power of its dynamic query engine, which simply executes an update on the server, no read of data first) CategoryEntity category = new CategoryEntity(); // empty object category.CategoryID = this.ID; category.IsNew = false; category.Description = this.CategoryDescription.Text; category.Save(); And a last one, and I doubt Object Spaces should be used this way (the ObjectSpace should be kept in process, or not?) Object Spaces: ObjectSpace mapper = new ObjectSpace (Mapping, connection); ObjectSet objects = mapper.GetObjectSet(typeof(Category), ""); LLBLGen Pro: CategoryCollection categories = new CategoryCollection(); categories.GetMulti(null); Now, if I can cook up code that is this simple, MS must be able to do it even better, not? :)
The name FtpWebRequest suggests that its related to ASP.NET. But if I want to use it to ftp files across systems from Windows Forms or Services I could still use this. Right ?
Yea, good point, Frans :-) With the EntityBroker 2004 we also have the ObjectSpaces API, but we have a reason: we allow the objejcts to live on a remote server, and this - well - requires a factory approach. Sadly, between an easy to use appraoch (as LLGBRN Pro) and the feature richness of the EntityBroker 2004 (both avaialble NOW - not in a year with .NET 2.0), I stll think MS has basically killed the market. Noone can compare with a company that just puts the costs down into some area it does not care. long term (and I mean a year from now), noone is going to use any of our products, despite the ease of use.
Excellent comments guys. I still need to test LLBLGen Pro myself. It looks great, and I know EntityBroker is great. I actually did a demo of EntityBroker that ran flawlessly against both MS SQL and Access, and that's been a while so Thomas has added many more features since then. BTW, the ObjectSpaces documentation seems to imply that MS SQL is a short-term limitation, but I never could get this confirmed as the case from anyone.
Ouch Thomas. I doubt that. I would guess your biggest competition is Sysiphus, Norpheme, or something else that's free. I liked Norpheme, even though it was a long way from EntityBroker, and Sysiphus is provider-agnostic already, as well as being open-source. Surely there's a small but viable market for more than MS, but the problem is there a quite a few entries in that field already -- and I've only named the ones I have used or know enough about to think they are deserving.
Yes, its in the System.Net namespace, so it doesn't even require a reference to the Web stuff, and it suspect it should work on XP Home as well.
Well, Paul, thank heaven the EntityBroker is just what it is because we NEED it, not for sales primarily. We work on some stuff that would simply not be pssible with stuff like ObjectSpaces. Regarding Norpheme and Sysiphus - well, let me say they were competitors for 2003. For 2004 wejust dust them (all the features I listed as missing in my post above are handlable with Eb 2004 - you should see our remoting solution in action, with NEARLY the same speed as a local object, thanks to extensive local caching). But fact is: Microsoft has closed a door here.
Paul: OS is part of .NET 2.0. So when they fix the single db thing, they have to update .NET. This requires a service pack. It won't be there for 6 months I think. With the announcements by IBM and Oracle to support .NET in full strength, this is a major blow for OS. The current crop of open source products all follow the same thing: add attributes, and it will be fine. This is not working for projects with 50 or 100 tables or more (and that's common). Not only do you have to write the classes by hand, you also have to type in the mappings by hand. When open source tools will get designers that create good mappings and in a fraction of the time, it will be worth it to look at them. Until then, the tools are not really a solution to the real problem: having to type code you can also generate.
Thomas: about the cashflow, same here. We use it to make the company run break even (and even better than that) and we can build projects for clients in the rest of the time. Companies who solely rely on one software product like an O/R mapper will get a tough year. Not because competitors get better and a lot cheaper but also because MS ships a tool that will appeal to their target base at first (which will cause a dip in sales)
Strange naming. FtpWebRequest?
>This is a great feature, but there is little need for posting to another page of your own application! and I thought I was the only one who did not get it. I agree, like you said, the form should be able to post to "other" applications, services etc.
Well, I think the MS solution is focuing on maintaining the ASP.NET "feel" around. You know, having the old page available, stuff like this. Stuff that is very valuable within the complex of one application. THe problem is, though, that it makes it "impossible" to integrate - as you do with your control - forms that are pbasically NOT controleld by ASP.NET and go for other applications. I definitly see your point with things like payment processors. This is definitly a limitation that people will stumble over soonish.
>This is a great feature, but there is little need for posting to another page of your own application! I have to disagree with this. Posting between pages in your application is very useful if you want to transfer state from page to page without relying on server-side session state (or resorting to the awful Server.Transfer, which completely destroys the browser navigation model). On the other hand, I agree that cross-site posting can be useful, and I'm not sure why they disabled.
I agree its useful in the same app, just not that big of a need in comparison since there are plenty of alternatives in the same app, unlike the cases outside of your own app.
I hope I'm not misunderstanding this post... But I like that current system because it is nice to fire up dreamweaver or Visual Studio.net and make a change to the aspx file which doesn't effect the code behind page, upload it to the server, and NOT have to recompile. I hope that we don't lose this!
As long as you don't precompile the code-beside you will find those changes in the aspx file to actually be easier than they are now! On the other hand, if you choose to pre-compile your code-beside, then you will also be pre-compiling your aspx pages too, unlike today.
This is somewhat bad for me :). I just finished working on a library that I am planning on selling soon that contains a SerialPort class, an underlying stream, as well as integrated ZModem file transfer (and maybe some of the other ones if i have time to include them). Whidbey keeps implementing technology I've been working on for the past 2 years and have been planning on selling. I guess I have about a year of viability now.
There are several free libraries for .NET already, including one on GotDotNet that is supposedly the basis for what will be added to Whidbey, so I'm not sure you have much of a market even now. :(
Thanks Paul -- we'll definitely take a look at this.
Hi,using FtpWebRequest class can you write code to connect to remote FTP server and fetch files??????
Yes -- that's what FTP is all about.
If we write every code inside aspx file do we still need Code-Beside file which is most of the time remains empty???
No. VS.NET Whidbey will give you a choice to use separate code file or inline code. You certainly do not need the separate file if you intend to use inline code. Also, unlike today, it will give you full intellisense with the inline style, and a view that is code only. I would still recommend the separate file if you are in a team environment, as it allows different people to work on the GUI and the code.
Thanks Paul, I appreciate your help
Yup, like you say, it's a start. Still, it's difficult to build a palace upon a log cabin foundation.
I thought that ObjectSpaces needed to go directly to tables - and had no support for Stored Procedures (which, in my world is the ONLY way of exposing CRUD). I know that there is generally a lot of dissapointment around objectspaces - not only because of performance reasons.
You actually can use stored procedures for your selects (the R in CRUD) with ObjectSpaces, although not with the persistence methods (CUD). Its not immediately obvious, but you can use a datareader directly to populate the objects, and maybe they'll get the other methods in there yet. Anyhow, while it may not be wrong to use SPs with an O/R mapper, its also not the most effective way to use the whole O/R paradigm in the first place. For instance, the real advantages in my mind for an O/R mapper is to save the time and not write SPs, to have more query capabilities than SPs could ever expose, and be platform independent which SPs prevent. I came from the SP model, and I'm still using them at work, so O/R mappers are not for everyone (yet), but SPs aren't the end all anymore either. For instance, all queries are cached and reused in modern dbs, not just SPs, so there really isn't any performance differences. SPs are also often used for security, but there are just as many ways to secure the tables directly, or you can use views if you must. For that matter, I've seen lots of systems where tables are locked down and access is only allowed through SPs that must then either open up the tables or create views of them all in order to allow end-user reports! SPs make it easier to have db logic separate from code, but O/R mappers just do away with all of it in the first place, so that's not an issue either. It also assumed that you can better optimize SPs, but most optimization is done through db design and indices, and on the fly by the db, and if there really are issues remaining, then you can still use an optimized view instead of a SP. So, I came from the SP school, but I've pretty much been convinced that is not so special anymore, but I'm still not sure when I'll ever be allowed to use an O/R mapper in the real world. My biggest hope is that the inclusion of ObjectSpaces in the core .NET framework will make it more acceptable so that I can use an O/R mapper, ObjectSpaces or otherwise. BTW, I think O/R mappers make a lot more sense than trying to put all your C# business logic in the db as Yukon allows.
If object space object use external xml mapping file, does it mean I have to copy xml mapping file when I want to use an object from another project?
You specify the location of the mapping files, so there's no reason multiple applications could not share mapping files as long as the files are accessible to all of the apps.
Does anyone know where the full definition of this class can be found.
.NET v2.0: http://asp.net/whidbey/ Full definition? What do you mean?
Ouch! Am I to realize that I'm posting too much over too little?
The scrollbar bug is caused by the latest patches from Microsoft. They know about it, but have not issued a fix. http://www.eweek.com/article2/0,4149,1382912,00.asp
another random observation with IE after the latest patches ... CTRL+ F to search for a word you're looking for (e.g., Random) The word is found and highlighted as it should be, but then (with the find dialog still visibile) if you use the scroll bar to scroll the highlight word into view, it becomes unhighlighted! This never used to happen!
Hey, you should get Mark Dunn to come and speak. He's in your backyard. Carl
I feel people should be more focused on quality .net content rather then how they liked the new matrix movie or how the last last user group meeting was. Lower the signal vs noise ratio !
I agree. There does seem to be a wide variety of traffic coming through on the main feed. I just recently switched from many individuals feeds to the main feed, but I believe I will be switching back. We just need to be able to make an aggregate feed of those we wish to follow or something like that. A lot of repeated entries to when they are just links to other entries(i.e. Mike Deem's new WinFS blog seems to be the hot link right now)
it is very good
but it is giving a copy of this articles
Its a relief to know that scrollbar advance is a bug. I thought it was only my m/c, since none of my colleagues complained about it.
i just noticed the scrollbar thing last night. really annoying.
Woohoo!!! Another forums installation -- very cool ;)
I've written a few words on the problems I encountered in setting up the ASP.NET forums too: http://www.charon.co.uk/content.aspx?CategoryID=28&ArticleID=49
Thanks for your details and clear play-by-play of getting ASP.NET forums to work. (Jules, thanks for you description as well.) I just checked out dotnetAtlanta's new forums section. Looks good! I never thought of using tracing for detecting patterns for looking for patterns. I'll have to explore that more.
Sorry for the noise, Paul, but I just re-read my post and I seem to like finding patterns. :-) .text 0.98v needs commenter authentication and comment editing support...
You may want to take a look at MS knowledgebase article 814668.
hi, do you know when the .net 2.0 will roll out? I need FtpWebRequest and FtpWebResponse now and I am wondering does it worth to create a version of my own? Thanks! cliff@arialsoftware.com
Late 2004 hopefully. So no time soon.
I'm really surprised that none of the solutions that I've seen so far in the .NET O/R mapping space look anything like JDO, right now the holy grail of transparent object persistence in Java. The only thing better than JDO in Java is Gemstone Facets, where persistence hooks are built right into the virtual machine. I suggest downloading the spec and grabbing a trial version of one of the vendors' products (see http://www.jdocentral.com for info). Here's a quick sample of how JDO looks to the developer: // ignore details on getting a PersistenceManagerFactory for now PersistenceManagerFactory pmf = ...; PersistenceManager pm = pmf.getPersistenceManager(); Transaction txn = pm.currentTransaction(); try { txn.begin(); Foo foo = pm.getObjectById(new Long(1234), true); foo.setBlazz("sadfsfsdf"); Bar bar = new Bar(); foo.setBar(bar); Blah blah = new Blah(); bar.addBlah(blah); txn.commit(); } catch (Exception x) { txn.rollback(); throw x; } Some things to note: * Foo is retrieved from the datastore by id (could query for it, too) * bar & blah are reachable from a persistent object, so they are persisted during commit * Any changes to an object or an object's collection(s) are tracked and committed also What a .NET version of this would look like: PersistenceManagerFactory pmf = ...; PersistenceManager pm = pmf.GetPersistenceManager(); Transaction txn = pm.CurrentTransaction; try { txn.Begin(); Foo foo = pm.GetObjectById(1234, true); foo.Blazz = "sadfsfsdf"; Bar bar = new Bar(); foo.Bar = bar; Blah blah = new Blah(); bar.AddBlah(blah); txn.Commit(); } catch (Exception x) { txn.Rollback(); throw x; } --matthew
BTW, here are what classes Foo, Bar, and Blah look like. Notice that they don't extend some tool-provided base class, nor do they have any persistence code in them. References are lazily loaded or fetched with referencing class as desired. Use of standard Java collections is supported. public class Foo { private String blazz; private Bar bar; public Foo(String blazz) { setBlazz(blazz); } // no-arg constructor required; can be private if desired private Foo() {} public String getBlazz() { return blazz; } public void setBlazz(String blazz) { this.blazz = blazz; } public Bar getBar() { return bar; } public void setBar(Bar bar) { this.bar = bar; } } public class Bar { private List blahs; public Bar() { blahs = new java.util.ArrayList(); } public void addBlah(Blah blah) { blahs.add(blah); } public void removeBlah(Blah blah) { blahs.remove(blah); } } public class Blah { // ... } --matthew
TFSWAPI.DLL
Hi Paul, What do you mean by "have all the various feeds sorted together ?" Since I'm preparing my own Online Aggregator, which will be published in about 2 or 3 weeks, I'm gathering all feature requests and ideas to provide a valuable service :)
There should be an option to just see all items in chronological order, regardless of originating feed, instead of just viewing each feed separately. Like: Feed 1 -- Item 11/22/2003 6am Feed 2 -- Item 11/22/2003 2am Feed 3 -- Item 11/21/2003 9pm Feed 2 -- Item 11/21/2003 4pm Feed 3 -- Item 11/21/2003 1pm Feed 1 -- Item 11/21/2003 8am
Paul: The problem I have with Bloglines (and with MyBlogroll) is that it doesn't support xhtml:body. If the full text of a post is available in an RSS feed, I want to see it in my aggregator, regardless of whether it's in the description, content:encoded or xhtml:body. I also appreciate support for the Dublin Core extensions (dc:author, dc:date, etc.) nntp//rss (http://www.methodize.org/nntprss/) still kicks ass, as far as I'm concerned.
LOL You make me confused Paul.. It's early morning here, I read the blog by Robert in just 15 mins ago, and now... I see another blog in a "similar" structure again :)
I can't wait for the sequels...."Paul Wilson: Why I am so smart", "Paul Wilson: Why my Superman.NET nickname might make you think I have a high oppinion of myself" and the highly anticipated "Paul Wilson vs. Pascal L Deathmatch".
Excellent....wonder when the first 'look at this flashy banner, isn't it cool' post will arrive :-)
LOL.....Nice!!!!
I've got no problem with Robert's post, or even this one. I don't mind people talking up their own stuff, becasue if they don't who will. I've been around long enough to know not to throw stones in glass houses. I'm not perfect, and have made my share of mistakes in my time, so I try to remember it when I want to flame someone. Doesn't always work, but I do try. DonXML
Meow ;) I can't wait for the entry on "<blink>"
haha :) Great one, Paul :)
Hey Paul you forget the marlketing aspect. You should price your DynamicImage control for the safe of humanity, saying 9.99 $. It's so cheap !
too funny...
I'm just wondering what it is that we all don't know here.. like maybe Paul's girlfriend left him for Robert or something? I just can't get over how mean-spirited this is.
LOL :-) Nice one.
I read this and thought, "hey, this doesn't sound like Paul Wilson!" Then I read the postscript... Man, that's cold. I'm still laughing. :-)
I just want to make sure I'm on the mailing list when tickets go onsale for that "Paul Wilson vs. Pascal L Deathmatch!"
Thanks Paul. "domain name and the server name"
whoa! Thanks for the heads up, Paul. I just installed a test run for some software I finished a few months ago onto an end-user's computer (into IIS) and held my breath for a second while I remembered his computer name has a *dash* (-) not an *underscore* (_)...whew! Um, maybe I should click thru that link you got up there just to make sure.:)
This is not the first IE security fix that screws up the way IE works (KB 814458 for another example). I suspect these security patches are rushed out without properly evaluating the negative implications: in this case surely it would have been possible to allow underscores without compromising security. I understand that security is *the* priority, but that doesn't preclude making sure the fixes don't break existing apps.
What a wonderful bit of esoteric information! :-) Thanks, it was fun to read this post.
Paul - I fought that problem for SIX months. It happened with an I.E. upgrade and is only related to INTRANETs (ok on www). I could not get to the bottom of it because there was no pattern on why some machines at my client site were having the problem and others weren't. Oh, and it was with an ASP app which I had written in mid-2001. The problem started in maybe late spring of 2002. Finally I had the brilliant Chris Kinsman at my house when he was speaking at the user group (Oct. 2002) and I asked if he could look at the problem for me. He tried a few things, googled the CORRECT queries and found the answer that had evaded me for so long. So congrats for figuring it out all by yourself and very quickly too!
Wouldn't it be a good idea to add a setting in the web.config of Whidbey to allow this ?
Compare the time it takes to call a method in your ContextBound object with the time it takes to call a standard class. Then you'll discover why O/R mappers that use this approach are sooo slooow.
ContextBound objects vs. normal objects are very slow. Unfortunately, this is the only easy way to do this type of call interception right now (there are some other ways to do it, such as re-jitting stuff on the fly...but they are a lot more difficult).
Also ContextBoundObjects are no longer under development by Microsoft. They will not be thrown away, but nothing new is going to be done to them (so says Don Box at a conference I can't remember...I want to say the Chris Sells XML conference), and they won't support them if something breaks.
Justin's remarks aren't exactly true - remoting is getting some work done in whidbey. Also, I believe that Microsoft will support remoting if it just 'breaks'. At the PDC, Don Box launched is initial talks with the mantra that remoting as we know it is dead, but after a relatively large uproar from the developer community, he toned down that message by several decibels. By the end of the conference, Don was suggesting that Microsoft would continue to support remoting, and that if you wished to keep using it, 'go in peace'.
Posting to other pages will eliminate some need of Response.Redirect,Server.Transfer that causes ThreadAbortException Exception boosting performance
Wow!!! Very interesting scenario!
maybe it follows 'swatch time'.. :-)
Never used FullSource. Can't imagine anything better than these 2. Html Source Bar (live source,images, cookies, frames etc.) http://home.worldonline.dk/viksoe/htmlbar.htm IE Scripter (Inject script into a web page) http://home.worldonline.dk/viksoe/iescripter.htm
::Notice that they don't extend some tool- ::provided base class, nor do they have any ::persistence code in them. JDO uses code rewriting (changing the bytecode when a class is loaded). This is easily done in Java, but simply one thing in .NET: Impossible. It would be wonderfull, and I would push our EntityBoker over to it immediatly. Just it is not possible. There is no class loader that ever sees and can exchange the bytecode. Unless you make this a profiler, which is a debugging API and thus not usable for serious projects.
yup, known bug. It's actually a design bug, and microsoft's suggested solution is to purchase a third part product (Source Offsite) to fix this. My suggested fix is to use a different SCC solution, but that's really a tough sell sometimes. http://support.microsoft.com/default.aspx?scid=kb;en-us;248240&Product=vss http://support.microsoft.com/default.aspx?scid=kb;EN-US;150643
Hi, Your blog contains good info. Keep it up.
Hi, Good work, well done
I think this feature is a pathetic attempt at security and a nuisance at best. Why is it that Microsoft can't write a RegEx that is a little more specific to malicious code? Hm? <b> That seems threatening. *rolls eyes* Here's a hint for Microsoft, match this instead: <script>
I first came accross this when doing Y2K work back in 1999. Some of our developers were working with the clock set forward a couple of years. It caused more problems than the Y2K bug did!
VSS is totally clueless about a number of things! It's also very good about not letting others get updated files if an error occurs during the status file update. Checkout of the file again fixes this one though.
there is a beta product out there called loom.net that helps you design fault tolerance into your system. i believe the guy doing it is also sponsored by microsoft....you can download it easy enough (i forgot the exact url but you can google for it). it has some sweet content describing how it can be done and it can give you a rough preview of how it might be implemented into .net at some point in the future (conjecture but you gotta imagine it will at some point). also i have been trying to get an article or two published about using attributes to assign behavior (and validation) to class properties, method parameters and such. we are using it where i am at and it is pretty cool. i can share with you some of my thoughts on it if you like.
How can I get this class?
Check this out. <A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=80df04bc-267d-4919-8bb4-1f84b7eb1368&DisplayLang=en">Microsoft Enterprise Instrumentation Framework</a>
Lets try that again shall we... http://www.microsoft.com/downloads/details.aspx?FamilyID=80df04bc-267d-4919-8bb4-1f84b7eb1368&DisplayLang=en
EIF and most all the MS Application Blocks are just way overkill. Log4Net is almost always better, due to simplicity, than EIF.
Can't you just go download it?
Fabrice: one more entry for SharpToolBox ;-)
Best practices, $50? Anyway very impressive.
Wow, that $50 is getting to be a better deal every day.
::persistence attributes make my business ::objects very ugly for no important ::development reason Reality check: is this ugly? using Builder.Cms.ComponentModel; using EntityBroker.Foundation.Nodes; namespace Builder.Cms { /// <summary> /// This subnode of ContentNode represents a simple (not to say stupid) file. File nodes are the /// "we dont care" content nodes - whatever is stored there is just forwarded to the database and, /// when rendering, just returned to the user. This is necessary because there wil lbe a lot of stuff /// just to store in the content node hierarchy (like a file archive). /// </summary> public class File : Builder.Cms.EntityObjectSet.FileStub { protected override void EntityObjectPostCreate() { base.EntityObjectPostCreate (); Particle p = (Particle) EntityManager.Create (typeof(Particle)); this.Particle = p; } } } You just see a dozen mapped fields, some relations, actually plus a lot of logic in a base class. But wait - where are the attributes? Oh, see the inherited stub :-) And all generated. Again, just a reality check :-)
I've been working on a little Attribute based ORM in my spare time - probably not anything I'm going to release to the public, but i've used it in a prototype application, and found it to be quite useful. However, your arguments against the attribute based ORMs are quite solid... i may have to reconsider how I go about this... not to mention that mine currently has nothing to do with persistence, but is purely an access layer.
http://www.lazycoder.com/article.php?story=20040108150537554
My system, like ObjectSpaces, uses an external XML configuration to create the mappings between the fields in the underlying data store and the class fields.
While I prefer external XML mapping the advantage I can see with mapping attributes to the class is when you add/remove fields your maintenace occurs in one location instead of two. But of course as the tools mature its GUI will end up managing that for you.
I opt for mappings generated in code from a definition. This is far more optimal than xml (objects are constructed directly with the right code/data) and both are generated so it's no loss that the persistence info is inside code, you use the definition to change the mappings anyway. So I don't think it matters much what you pick, as long as the format you pick is NOT the source of your mappings: it always should be generated from a definition a user can design in a tool
Oh and this: "Why should I have to recompile my business objects just because someone changed the table or field names again?" is not an argument. Table names do not change frequently. If they do, go online, go to the first jobsite you can think of, opt for the first job available and leave the project! :)
Hi paul, I predicted this yesterday. I was right! :-) http://www.jnsk.se/weblog/posts/ormapperinterest.htm Best Regards, Jimmy ###
I'm not really up on the O/R stuff, can someone post an enlightening link about how attributes (System.Attribute based?) are used for mapping. A lot of reflection? When I think "map" think of a piece of paper, a document that I can use to get from one place to annother. I could esily envision using an xml file to generate source code that then must be compiled (being too lazy to write so much similar code, I already do this:).
Why should you have to specify the mappings at all? It seems to me you should only have to concern yourself with what should be persisted, not how the O/R mapper does it. I understand this is not always possible though, for example if you have to work with an existing database.
I just got an email today from someone that has some of those odd requirements to create tables at runtime. He plans on changing my mapping file at runtime to dynamically map to a class that will be a superset of each of the possible dynamic tables. Also, see Steve Eichert's post at http://dotnetjunkies.com/WebLog/seichert/posts/5386.aspx.
I have never seen an instance where tables had to be created at runtime except when I worked on a SQL DMO web app. There's no need to create tables at runtime except in those cases where you are actively administering the database. Having an app create tables on the fly is: 1) a security risk 2) poor database design In addition it usually indicates a poor understanding on the part of the developer about the problem domain and the type of information going into the application.
Do you support m:n relationships and the 3 types of inheritance mapping? Best regards, Deyan
Hi Deyan: I have only included the very basic 1-to-many child relationship (at least so far). I don't explicitly enable any type of inheritance mapping, but there's nothing preventing object inheritance and manual configuration of the mappings. Normalized inheritance can setup with views and stored procs, redundant inheritance could query the base type with a view that includes a union, and shared inheritance is a relatively straight-forward mapping. Sorry if I've simplified things to much -- they're all doable, but they will require some additional work.
::I just got an email today from someone that ::has some of those odd requirements to create ::tables at runtime. Hm. Tell him to get something like "SQL for people who have no clue about how to deal with databases". I have not found this requirement in any valid way in the last 10 years. And I am sure I will not find it until I retire. Oh, I have seen applications like this. But basically thwy were like - well - one example: * Invoice management. One table for every invoice, one for every invoice ' InvoiceDetails (makes tables per invoice). Comment: so that the tables do not get too large. Well. Some poeple think a db is as stupid as they are in handling data - they can not remember more than 10 invoice details, so the db will surely also have problems. Show me a valid example and I will change :-)
I totally agree in principle that this type of requirement sounds ludicrous. But that doesn't really change the other arguments that I found. Also, should it really be our business to tell our customers what they can or cannot do, especially when its so easy to change our approach to enable them to do what they want? Here's a reality check -- you enable your customers if you want to sell them something.
::First, some customers do have their own ::class framework, Ah, this old rumour. * If it is the client's framework, can the client not inherit from the persistence base class? * Oh, it is a third party framework? Name it. Name ONE. One that allows me to plug in my own persistence mechanism and that requires a base class. In 8 years I work with O/R mappers I did not ONCE have the requirement for a framework to use the b ase class. Not once. I had countles people complaining about it - like little children - but when asked to provide some real world example, noone ever came up with one. Noone. Never. ::A base class approach lets you retrieve ::multiple copies of the same instance of an ::object, each with it own state How? This has nothing to do with base classes. Try doing this in the EntityBroker - you will be surprised.
::Here's a reality check -- you enable your ::customers if you want to sell them something. Here is another one: I dont help them raping a database server :-) No, not me.
http://weblogs.asp.net/aconrad/archive/2003/12/12/43172.aspx#FeedBack There was a discussion regarding ObjectSpaces in a distributed app over on Andrew Conrads blog a little while back. The gist was that: a) ObjectSpaces object can, of course, be sent across a web service. b) Being able to map the OS objects across a web service is interesting and something the MS team is working on. My first question had to do with support for other providers. http://www.lazycoder.com/article.php?story=20031212011303281
Paul, your reality check bounced. ;) If the customer is hiring us because of our experience, they should listen when we speak from our experience. I have never had a customer force me to write bad code or design a database poorly after I've shown them what's bad about it and given them an alternative. There is always an alternative to adding tables at runtime. Unless you are working for a technically savvy customer (say, Microsoft or Oracle) you should never let the customer dictate the architecture (unless their suggestion makes sense of course).
I agree poor requests shouldn't dictate my architecture, but when there are two approaches and one satisfies those additional requests (and in my opinion other issues) without sacrificing the real issues . . .
Not having a base class makes you have to implement ITypedList etc on the collection classes yourself (or IEditableObject on the normal classes). You can't mix this code in via MI, because .NET is SI. Not supplying a base class in an SI environment as .NET will thus force your customers to jump through all these hoops themselves, stuff which should be SUPPLIED by the framework of the O/R mapper. "a) ObjectSpaces object can, of course, be sent across a web service. " No they can not. Say I add this member to my objectspaces filled entity: private IComparer _myComparer; *poof* there goes XmlSerializer...
Well said, frans. There is quite a lot the EntityBroker base classes do by now. Pages full of code, a lot of interfaces that 99% of the .NET develoeprs out there don't understand and never deal with. Still they are all necessary for good databinding integration and generally well behaving business objects.
Paul, does this scale well with Jet MDB files (Access). I'm thinking that OLEDB/Jet is faster and more robust than people give it credit for, as long as the data being read is cached well to minimize db hits and as long as the CONCURRENT number of writes are either kept to a minimum or synchonized (serialized). Does your O/R mapper deal with this issue?
"Next, if you agree that the Manager Design Pattern is the approach to take, and you don't plan on actually having Save and Delete methods in your base class, then you also have to question if the state of the entity objects required by the mapping framework belongs in the objects or the manager." Also not true, a good tool offers this ability. :) (okok, I need to get it out of beta and ship the basterd, but it's almost release material). You should offer choice, some want the persistence logic in the objects, others want to add it as a service. I don't see why it would be hard to offer both after all I did both. The real pain for the customer is in the extra functionality he otherwise has to implement by himself and which is offered by a base class, espcially in databinding scenario's, which are the scenario's all objects end up one day or the other.
"Pages full of code, a lot of interfaces that 99% of the .NET develoeprs out there don't understand and never deal with." Same here. I still remember the WEEK it took for me to get something working with ITypedList which was truly useful in a complex databinding scenario... You don't want your customers to deal with that... (or IBindingList... how to sort? :) or Find? :) ) "Still they are all necessary for good databinding integration and generally well behaving business objects." Exactly. I really don't understand why there isn't a base class in .NET 2.0 for offering all this. Now the customer has to develop all that by hand. Well... it's really hard. My generic property descriptor producing engine still requires an attribute and a factory to produce properties for EMPTY collections (one of these fine situations you NEED ITypedList!) There is no other way your code can know how deep the navigation is and what the type is of the objects inside a deep nested collection the grid has navigated too :)
I'm not doing any elaborate caching or anything else that will help Access -- I'm just working with both MS Sql and Access (and others untested). I definitely don't want to make any claims that my ORMapper is high performant -- its simplicity at its best, but that has many downsides when more is needed.
I played around with things like this and took the approach I saw many n-tier samples and applications take. You have a basic IProvider interface and then for each database you just implement the IProvider for that specific database and boom you have access to O/R mapping for any database that implements IProvider ... you could even then optimize for each operation for the database ... I've seen other O/R mappers take on this route but only ever implement one for SQL Server ... Take note this affects objects composed of data from several different data sources.
The in house O/R mapper I wrote for our applications supports paging also. Basically specific implementations (Sql, XML, Access, etc.) choose how best to implement this under the covers. The Sql one, for example, uses TOP statement to limit the max results returned from the DB (i.e. PageSize * PageIndex) and then chops the front off the result set locally.
ANSI SQL? Try to use ANSI joins on Oracle 8i. Very simple stuff, yet it doesn't work. You have easy talk summed up, but when it really gets exciting, you have to dig deep into the custom code per database to support what you want to do. Want to support updates with multi-table filters? How are you going to do that on Oracle, where no FROM clause is supported with UPDATE? Or deletes with filters spanning multi tables? No second FROM clause. TOP clause? No can do on oracle. (rowcount). Sequences support? You don't have 'em, but you have to on Oracle. How about synonyms, one of the cornerstones in every oracle database. Does your schema reader read these? Ansi joins? Not on oracle 8i, still a database very widely used. To support joins on Oracle 8i, you have to use stuff like: SELECT * FROM A, B WHERE A.Foo = B.Foo(+) For left joins. Stored procedure support? Kicking an open door even more open. How do you filter on entity Foo by using a random field of Foo? Or combination of fields? Or filtering on a related entity of Foo to grab a set of Foo entities? You think you can do all that with stored procs or ANSI SQL? You can't, trust me on that. My Oracle SQL generator is completely different from the Sqlserver Sql generator, because of all the Sql differences. Simple inserts or single table updates, big deal. Try to support left joins (weak relationships) on Oracle (and I don't mean just 1 single version) or other basic stuff. As I said in a reply to Ingo's ramblings (which were completely missing the point btw): A good tool offers options to directly manipulate entities where the entities really live, like update a set of entities directly based on some criteria. I do that. It's common sense, because entities live in the database, so why can't you manipulate them directly? Paul, a tip, forget about ANSI-SQL. It's a nice dream but it's simply not there. It won't cut it, you need custom Sql constructs per database. That's reality.
Frans, Here is the snippet of the discussion I was referring to from Andrew Conrads blog. "1. What happens to ObjectSpaces objects when they cross web service boundaries? To be an ObjectSpaces object, there is no requirement to implement any interfaces or abstract classes. So in effect, any clr object can be an ObjectSpaces object and thereby is not at all tightly connected to the database. That is, once ObjectSpaces materializes the object the user is free to do what ever they want with the object. In other words, this is the same programming exercise as a typical object remoting scenario and is already solved by a number of features in the frameworks." of course if you add any member that can't be serialized using the XMLSerializer it's going to break. So for my own sake and the sake of others like me who are just doing simple CRUD operations and not entering the deep end of the .NET pool, why does adding the private IComparer member break the XMLSerializer?
Frans: I don't have any significant problem with your LLBLGen Pro or Thomas' EntityBroker when it comes to multiple database support. The only one I singled out was Microsoft's ObjectSpaces, but there are others on the market that are also MS Sql only. I also did not mean that you should use only ANSI SQL at all -- I simply meant that there's no reason you can't use it to provide a minimal generic database provider. I don't want to say that its "necessary" if you support the major players (as you do), but its easily doable so I don't understand why you would not. But in no way do I think you have to use ANSI SQL for the major players, although I will readily admit that my rather simplistic ORMapper mostly does. Yes, that's probably a major flaw if I were to ever try to compete as a highly flexible and extremely performant O/R mapper, but that's your market and not mine. As for stored procs, all I'm asking for again is minimal support, which I believe your O/R mapper has anyhow, so what's the beef? I'm not intending to say they will solve every problem, just that they are easy to implement and that they should therefore be optionally allowed. I also don't mean to gripe too much about the paging, since I just invented that request (although it sounds like others thought of it before me from the comments), but its something I do think you and others should consider going forward now. I still believe that your LLBLGen Pro and Thomas' EntityBroker are the best O/R mappers on the market, and that it also appears that this will continue to be true even after ObjectSpaces is released. I do however believe that some things can be better, and many common things can be simpler, even in your tool. My early feedback has been very much that my simplicity has made it understandable and easy to use -- surely you guys can keep your tools more powerful while still adding some simplicity for the many many people that just want to get rid of very basic CRUD! That would also increase your sales phenomenally, since there are many more people that need to do the basics and can't handle the complexity of the more advanced tools that you are offering. Again, I have and will continue to point people to you and Thomas when they need more, and certainly many do, but consider the little guys out there too (you remember the guys that liked your original stored proc generator :). Thanks, Paul Wilson
Paul, stop it, you make me blush in public ;) Seriously: normal, simple CRUD stuff isn't doable with ANSI SQL so you can support multiple databases. Here are some examples: 1) a deadsimple autonumber field as PK. Do the insert. ANSI SQL doesn't contain constructs for autonumber fields. This is different per database system. SqlServer (and sybase) uses Identity columns, and you should NOT specify a value for the column. Oracle and other databases use sequences which supply the value for the column and you SHOULD specify a value for the column (the sequence). How the get the new value back? Sqlserver2000: use SCOPE_IDENTITY(), Sqlserver7: use @@IDENTITY, Oracle: use SELECT sequencename.CURRVAL INTO :parameter FROM DUAL. Other databases use even more different schemes. ANSI SQL? You will not get far for even this very simple insert statement! -> you need special code per database 2) multiple schemas vs. multiple catalogs with multiple schemas. SqlServer uses catalogs and inside the catalogs it uses schemas. Other databases use just schemas and don't understand the concept of a catalog. So code targeting SqlServer will have to deal with selects which can span multiple schemas inside a catalog (which means schema info has to be supplied WITH the fields and tables!) and/or multiple schemas in multiple catalogs (for example look up table select in the lookup table catalog using a FK field in another catalog. Simple stuff, yet it can't be done with the same code which is used for Oracle too, because Oracle doesn't understand catalogs, so you can't formulate the query for Sqlserver using oracle constructs, you can't specify the catalog info, however, you can't use sqlserver's constructs on oracle because oracle doesn't understand the concept of a catalog. (so doesn't understand what database.dbo.tablename means.) -> you need special code per database 3) table names/field names with spaces. Stupid idea to include spaces in tablenames or fieldnames, yet people do it. (hell, even northwind contains a table with a space in the name). How to execute the most SIMPLE CRUD routines on these tables/fiels? How to specify the names? Oracle doesn't understand '[foo bar]'. SqlServer doesn't understand '"Foo bar"'. -> you need special code per database 4) You mention stored procedures for very simple CRUD. Ok, let's do that. Let's use the most SIMPLE procedure for retrieving a simple entity: SELECT * FROM Table WHERE PkField = @PkFieldValue. You think you can call that proc with portable code? Not at all! Ever looked at how Oracle (and other databases!) return resultsets? That's right, through cursors, the Oracle's REF CURSOR parameters. Now, SqlServer does this differently, a proc simply executes a SELECT statement and the results are the resultset returned. With Oracle, you have to bind the REF CURSOR parameters to a dataset and then populate the dataset using the cursors. (or run through them manually). Furthermore, if you use the Oracle provider shipped with .NET, the Microsoft one, you are out of luck with REF CURSORs and smooth code: if a proc returns 2 resultsets, you have to walk through the ref cursors by hand, binding them one by one by hand. ODP.NET does this automatically. Your idea about ANSI SQL is good, I had that idea once too (I spend a lot of time looking for the ISO/ANSI SQL docs to build my query language upon) but I let that idea go the minute I started working on the Oracle code: a lot of simple SqlServer code didn't work on Oracle simply because a lot of it is different. Remember, I talked about very very very basic stuff in this reply :) I didn't even mention ANSI joins which are not supported on Oracle 8i. I also didn't mention the paging you implemented. On SqlServer you can't implement reliable paging, you have to requery every time and the new results can differ from the previous call. On Oracle you can use a rownum value to implement easy paging. Difference again. IF you want to support even just simple CRUD but you want to do that IN FULL! for multiple databases, you have to bite the bullet and implement various paths in your code for each database vendor. That's REALITY. Thinking you don't have to is naive. I'd like to see your insert code do its work on Oracle with sequences, or inserting data in my 'Test' schema in my SqlServer catalog. Not to criticize your code, Paul, but your, sorry, naivete about this subject. :)
A good page to check differences from the ANSI standard in various databases: http://troels.arvin.dk/db/rdbms/
And here's another one (I was looking for this one, while I stumbled upon the previous link which points to this one ;) http://developer.mimer.com/validator/comparison/comparison%20chart.tml
There is not much to add to Fran's statement. My experience when working with Oracle & SqlServer & Access is identical. SQL is great as programming langauge, but sucks as hell as abstraction. No standardisation that is really worth mentioning. You need special cases everywhere. One of the glories of our EntityBroker is that I really don't have to care about this (as in every other O/R mapper). This IS a MAJOR pain to do manually.
What though if it is not practical to change the name of the computer or server? Is there another way round this fmercer@blueyonder.co.uk
I didn't find a work-around, other than using localhost. I suppose you could use DNS to setup some other recognized names.
Thanks for all the links and info Frans. :) I'm sure I'll be adding more vendor specific stuff as I start dealing with more bugs and features. Right now I just do the auto-ids differently: "SELECT KeyField = SCOPE_IDENTITY()" for MS SQL, "SELECT @@IDENTITY AS KeyField" for Access, "RETURNING " + keyField + " INTO KeyField" for Oracle (this should work for Oracle 9.x if a trigger is setup to add the key from a sequence -- big assumption but it works) and "SELECT MAX(" + keyField + ") FROM " + table + " AS KeyField" for the rest (very bad yes, but its my generic attempt at workable) Good proof of my naivety (spelling?)! I'm committed to getting the basics right, and I'm sure there are lots of assumptions I've made that will result in bugs that I need to fix. I'm not ever going to touch the advanced cases that Frans and Thomas have though. Thanks, Paul Wilson
Well, what about the BASIC stupid errors. Now, I have a lesson for you: .NET framework is full of bugs. Parameter. Let's set a value :-) * OleDb vs. Access: you can NOT assign DateTime.Now safely - blows. You HAVE to assign DateTime.Now.ToString (); * Oracle: you can not assign an empty string "" without also setting he length explicitly. Blows. NULL and strings WITH a length are perfect, and neither in SQL Server nor in OleDb do you ahve to set the length. Stuff like THIS makes we want to take a big club and visit the programmers. In the EntityBroker we work by having a "SqlContext" specific for every database - itcontains the sql generation templates, but also helper methods (formatting dates etc., in such a way that the database can deal with it). With every iteration we add new methods. Pretty often - by now - just for handling errors in the access libraries.
Oh, last saying :-) I jsut decided to add support for "paged queries" to the EntityBroker :-) You are right - sometimes you just want part of the result set. Now, while I can not actually stop the data to be transmitted from the SQL Server (YET - this will change once YUKON comes around and our server version moves the logic of our DAL into the database), I can make sure it never leaves the DAL. This means fast discard, and this means: * No queries for potential additional data (as in: tables that subobjects may have, inheritance wise) * No transmittion to the object broker, which may be on another computer (as WE do support a remoted DAL). Yes, makes sense in some scenarios, and is acutally half an hour of work at maximum.
Excellent Thomas! Although you could use filter the page in the database (see the SQL I posted once before that I linked to). Its actually well-performing for millions of records, and far beats bringing more data back and then dropping it.
Nice analogy, Paul. As someone who did carpentry (both residential and theatrical) for a living before getting into computers, I can definitely identify with that sentiment. :-)
I am not so sure your SQL is "right on track and optimal", but it is a pretty nifty idea to run a query within a query - pretty nice. I will see that I get this put in as optimization for SQL Server :-)
Great! ObjectSpaces Lite!
Good analogy, and while "doing it yourself" is often rewarding in both knowledge and immediate cost savings, it sometimes is more worthwhile to pay someone who can do a better job faster. But, yes, there's nothing like doing it yourself... :-)
Before you start to worry about redesigning the mapping layer, I would suggest you sit down and actually stress test your code. If it is orders of magnitude slower, perhaps a redesign/rethink is in order. However, a mapping layer, by nature, is going to add performance overheads to your system. That is the tradeoff with the mapper. Ease of use versus speed of execution. A reflection based mapping layer is never going to come close to hand rolled sql + hand written object instantiation code. Yes reflection is slow. No, it really isn't as slow as everyone thinks it is. (Take a look at the asp.net runtime code... theres a lot of reflection going on there)
I designed my O/R mapping architecture so that it's essentially pluggable. The default mapper uses Reflection. Not only does it use reflection, but right now it doesn't even try to be performance friendly and cache the FieldInfo, it pulls it every time. That's something I'll fix when I start to worry about performance. The other thing I was gonna do is still use reflection, but instead of looping over the fields, generate a mapping helper class per persisted entity type with the CodeDOM. A third approach certainly could be the same thing as the IObjectHelper idea. The point is though, it's completely pluggable. You can choose what mapping technology is used for your application via the configuration file.
Paul, while on the surface I can agree that, - to be pedantic - it might seem like a good idea to increase the performance of your OR mapper by replacing the Reflection, don't you kind of think that this is exactly the type of problem that Reflection was built to handle? It's probably not as if you are going to be handling MILLIONS of calls per minute :-) and having the Reflection cause bottlenecks. Either way, I'll bet that the bottleneck caused by the Reflective calls are significantly less than the bottlenecks caused by the system you are replacing :-) - I.e.: hand coding.
Implement the Data Transfer pattern. This will force you to create a 'fields' object which is in fact the object which contains the data which is persisted and which is filled by your data-access code. This fields object is 'plugged' into an entity object and the entity object then is populated with its own data. The fields object contains 'entityfield' objects which are addressable by index (int) or name (string), and contain the actual data of the field, persistence info (if you want, you can store that separately, like you have in an XML file) and some code to deal with IEditableObject (very important). This solves your problem. CustomerEntity.CustomerID is a property which indexes into the _fields object of CustomerEntity, passing "CustomerID" or CustomerEntityFields.CustomerID as index and sets/gets _fields[index].Value. No reflection needed, everything is taken care of by base class code like IEditableObject, rollbacks after a transaction (also very important: two autonumber entities are updated in a transaction, the first succeeds, gets the key value, second fails, the first has to roll back in memory to the old values!!). Here's a good article which describes this feature (in a somewhat different structure, it's a java O/R mapper) http://www.uq.net.au/~zzabergl/simpleorm/whitepaper.html Sun's pattern pages about Data Transfer pattern: http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html Sun's pattern pages for J2EE: http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html No MS pattern pages? Well, look at the Sun pages and you know why.
Paul, I compared Master Pages control ASP.NET 1.x to ASP.NET 2.0 check it out: http://ipattern.com/simpleblog/PermLink.aspx?entryid=22 Let me know what you think, Maxim
Frans, My old O/R mapping layer (non-.NET) was implemented using that pattern, but I felt like it didn't do enough for the user. I believe the user just wants to work with their own strongly typed fields. I believe that asking the user to write a ton of casting logic in their entity class' properties/methods is a pain in the butt for users. I believe the complexity should be in the O/R mapper, not in the entity objects themselves. As for the example of versioning the fields, that's easy enough to do within the mapping layer itself. Obviously the trade off is performance. There's a billion ways to skin the O/R Mapping cat. I guess it will be up to the users to choose a framework that makes the most sense to them.
Let's say at the top-most MasterPage I want to expose the EncType of the Form so my image upload UserControl can set it and set it to accept user uploaded files. For the life of me I couldn't get FindControl to work (is string matching based on the ID the best way? what if the ID changes? if every page has to have a form, shouldn't we be able to find it by the type rather than by its string id?) My current hack in the UserControl is: ((HtmlForm)this.Parent.Parent.Parent).Enctype = "multipart/form-data"; // HACK That _roughly_ translates to UserControl.AspxPage.Region.ContentContainer. Depending on whether or not the UserControl is used inside of MasterPages or on a normal Page, that syntax will break. I've tried adding a property to the top-level MasterPage so I can restrict my UserControl to the Form's EncType only: public string FormEncType { get { return ((HtmlForm)Nobugform1).Enctype; } set { ((HtmlForm)Nobugform1).Enctype = value; } } But I can't get a refernce to the top most page. I'm all about using the following syntax to pass just the HtmlForm into my UserControl so it can work in or out of MasterPages: uc.TopLevelForm = Page.Form; or uc.TopLevelForm = Page.Master.Form; but those don't work for various accessbility reasons. Yes, I've tried looping through the Controls collection and looking for a Control of type HtmlForm. As of this writing, my two posts to the Asp.Net forums are still unanswered: http://www.asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=439907 Ideas? I hope its just something simple I'm overlooking. - Ron
Ouch - this is a problem in my case: I have a server control that used the render method exclusively to output the html. The control simply gathers user input but, since it can be used in any application, needs the ability to post the input to a "results" page in a particular application. I found the only way to get this to work was to send down javascript with the control that sets the form's action attribute when the submit button on the control is clicked. I also found that I had to explicitly set "enableViewStateMac" to false in the page directive on the receiving page - setting in the property dialog for the page seemed to have no effect. So seems like a problem case is anytime a server control is created using the render method (i.e. no events associated with the rendered controls), and the page hosting the control has to post the inputs to another page in another site...
Andy Smith at metabuilders.com has some code that exposes the top most HtmlForm Control: http://www.metabuilders.com/Tools/FileUpload.aspx My this.Parent.Parent hack seems to be crude but correct. His EnsureEncType function offers a more robust way of locating the HtmlForm Control. - Ron
What's your goal with this O/R Mapper - to figure out how things work, or are would you like to use it in a production environment?
Hey Jerry: While I am interested greatly in how things work, I am also interested in more than that. First, my site (http://www.WilsonDotNet.com) is largely an example of best practices, and O/R mapping is something that I wanted to include because I think it is often (but not always) a best practice. I am working on performance now, and let's just say that the numbers are really very good (which I'll be blogging and announcing in the next few days), so I also do plan on using this O/R mapper in "real" production systems beyond my site. That's not to say that it will suffice for all cases or everyone that needs an O/R mapper, since I won't be including all possible features. Thanks, Paul Wilson
I would recommend taking a look at the architecture of two Java-based solutions, Gemstone Facets and JDO. Facets has persistent hooks built right into the JVM; Microsoft has the capability of doing that, as there is only one CLR, and it is the ULTIMATE as far as transparent persistence goes in the JVM or CLR world. It is not, however, practical for just anyone to do, as you'd have to get access to the CLR source code. JDO originally attempted to take the Facets direction, but the spec group got shut down by the JVM spec group, saying that there were too many JVM implementations out there to change if persistence hooks were to be included in the JVM spec. So, the JDO architecture does the next best thing: if the JVM won't supply the extra bytecodes for field interception et al, then a tool-supplied enhancer will. It would work like this in a .NET environment. You supply the enhancer with the assemblies that contain your persistent classes, along with a persistence descriptor file, and the enhancer spits out new, modified assemblies that contain persistence capable classes. Debug information is preserved, and it's a build-time event, not a run-time event. The upshot? * No use of reflection at run-time, * no requirement for public things that really shouldn't be public, * built-in lazy loading without having to use IObjectHolder to do the lazy loading, and * the ability to decaratively use spans (and other things like transaction isolation levels, etc). There is already an upcoming product from Poet called FastObjects.NET that uses the enhancement strategy successfully. See http://community.fastobjects.com/community_fastobjects_net.htm for more information. I would love to see Microsoft take the persistent CLR direction, but, if not, at least go the enhancement route. The impact on the developer is that persistence is very much transparent, leaving the drudgery to the tool. --matthew
Hai, up to this is good need more
You should be able to loop through the page's controls and find the HtmlForm without any problem -- just make sure you are recursively looping through each control's child controls as well! Thanks, Paul Wilson
All right, I've got my performance up and comparable to DataSets now, beating them in some cases. Later, Paul Wilson
Well we all now know to ignore my posts about how costly reflection is :) Nice work Paul! I enjoyed reading how you went about speeding things up. As many people noted it was probably "fast enough" before, but, hey a little extra speed certainly can't hurt!
WOR Mapper
Cool stuff...
could WilsonORMapper recognise dirty flag of property? eg: if i wanna update name of product,i will write: Product product = New Product; product.id = "001"; product.name = "example"; Global.Manager.PersistChanges(product); i hope only the name of it can be update and don't affect other property of product. the dynamic sql will be: update product set name = 'example' where id = '001' does WilsonORMapper work like this? vs.net in my computer does not work now,so i can't run your demo.
Hi Program: No. Right now at least it updates everything every time, although that would be relatively easy to change since all the state is already being tracked. So I may implement it at some time, although its not very high on my list right now -- but you could create your own custom version to do just that. I'm curious, I've seen a few people note this feature of some O/R mappers, but I don't really get why it matters much, at least in most cases -- can you share? The traditional stored procedure approach for updates certainly did not in most cases make such targeted updates, and its that approach that is my personal background, so I'm still learning other approaches. Thanks, Paul Wilson
this feature is very important to me. eg:i have a form to edit product,but the price can't be edited here,it will be built by many factor. if i edit the product information in client A,and maybe it's price be modified by client B just then. so i must post these dirty values to database, not involve "price".
considering the concurrence,a O/R Mapper also must support increment operation. like this:update product set quanity = quantity + 10 where id = '001' otherwise the consistency will by destroyed.
when WilsonORMapper begin tracking the entity instance, what will be recorded? and when it release this tracking? Manager class must be static? i hope the entity class will be "pure data class" for portability and the manager class will be stateless for performance scalability. but lazy-loading require the manager class's life-cycle be continued, this is a conflict for my O/R Mapper's thought.
Well done, Paul. But can you compare performance of dataset to WOR? Do they offer same functionality? And for me crucial question: can it be used for real-world apps? You know, that ones with some bussiness logic in SPs, not with just simple selects... Wouldn't it be better, when WOR could generate SPs and developer would be able to modify them? Good luck, <a href="http://blog.vyvojar.cz/radim/">Radim Hampel</a>
Hi Radim: DataSets and custom object collections are certainly not interchangeable in all situations, but there are many cases where a user of an O/R mapper simply wants to retrieve a collection and display it for presentation, which is very much like using a DataSet. On the other hand, once you go beyond that simple display of data, and start implementing business logic in your custom classes and then proceed to the actual persistence, that's where an O/R mapper certainly has the upper hand. Can it be used for real-world apps? Most certainly it can. Of course, real-world apps vary, so it may not be the best thing in every case, but there are many many applications that can easily benefit from O/R mappers, and the fact that they are so common in the Java world proves that. As for stored procedures with business logic, I already support using stored procs for inserts, updates, and deletes, which is where there often is a real need to have integrity checks and denormalization and simple business logic. I will probably be adding support for select stored procedures too, but while that may be nice in some situations, it will also mean a loss of basic search, sort, and paging functionality that comes for free with the regular type of O/R mapping. As for generating stored procedures, there are already countless code generators out there, with CodeSmith being my recommendation, so I don't really see the need, nor is that what O/R mappers are really about. Thanks, Paul Wilson
Hi Progame: The entities are tracked automatically when they are materialized from the database, or when a new entity is created using the GetObject method, or when an entity is passed to the StartTracking method. The tracking is released by a timer that wakes up periodically (default is 5 minutes, but its configurable) and removes all instances that correspond to entities that have been garbage collected and have not been accessed for some time (also configurable, defaults to 0, but necessary for server based systems that won't retain weak references). The manager class is not static -- you can create multiple instances of it to handle different databases simultaneously, as well as you should be able to use it in remoting situations. The entity classes do not have to have any structure, i.e. there is no required base class, although implementing the optional IObjectHelper interface will give you better performance. As for lazy loading, you can specify to not use lazy loading for child collections, which would be required for serialization cases, like remoting, but that's not really related to the manager tracking object state for other reasons. By the way, I agree not having "quanity = quantity + 10 where id = '001'" is something less than desirable, but this is where you can use a stored procedure with my O/R mapper, or you could be using triggers which may actually make more sense for pure data integrity across all applications. I may try to add that functionality as well, but I haven't given it much thought yet since stored procs and triggers are both viable solutions that already exist. Thanks, Paul Wilson
can this tracking recognise any change of property? or only compare property's value? eg: product.code = "001"; product.name = "name"; ....starttracking(product); product.name = "name"; ...persistencechange(product); .... in this case,wor will recognise this change?
It doesn't have an internal event that is triggered when a property changes, since the entity can be any class with no special base class required. It can compare the values that you send when PersistChanges is called (although it does not right now) with what was sent originally with StartTracking. Currently this means that you can call GetObjectState to check for Updated (i.e. IsDirty) and you can also call CancelChanges. Later, Paul Wilson
i want to ge dirty flag of property,instead of class. although the "name" property value not changed,but it's dirty now. i hope the mappers can recognise this change in spite of assignment of the same value.
i want to recognise this change, do not need invoke any event.
btw: can you change font color of your blog? blue is not comfortable :(
I see now. Mine would only know if the class was dirty, and only because a value differed and not simply because it was set again to the same thing. You could certainly code that type of stuff in a mapper, but it would require either a significant base class, and/or a new dynamically compiled class that inherits from the original. Some of the more advanced mappers may have this functionality already, but I don't think it sounds like the direction I want to go. Sorry you don't like blue -- what if it was <font color=navy>Navy</font> instead of <font color=blue>Blue</font>?
yeah. the dynamic proxy in java can do that works. navy is better than blue,but i think black is the best. sorry for my requirement.
Paul, When I first started hearing all the hype surrounding SOA I thought that I must be missing something since it sounded just like a lot of the principles that we use everyday. It took some reading and investigation to realize that there really isn't that much new with SOA. As you mentioned there is new ways to build them, as well as new standards to ensure we build them in an interoperable way, but most of the principles are things we've been doing. - Steve
It is a hot new website for teens.
VS.NET is ok if you've got nothing custom that you have to do, such as specialized screens to collect information about installing a database, for example. You can get around this by writing cutsom applications to assist your install, but then you lose the 'look and feel' that customers expect of your install. Sorry about your problems with Wise. My observations have been that Wise presents more problems at design time in the IDE, and Installshield presents more runtime problems. Of course, this is only one datapoint. I'm not impressed with VS.NET deployment solutions for anything but the most basic of installs - if that's what you've got, then go for it! I'm working in InstallShield DevStudio 9 right now, writing an install. It's not bad, but it is also quirky. Once you figure out the quirks, you can get around them. The problem is then that you get strange code to fix quirks from 3 versions ago!
Another thing that I forgot to mention - by changing the product code and upgrade code affects your ability to use windows installer for patching or upgrading your product in future releases. While changing the product code in development may be ok, it's not a good idea to do this in the field.
All the docs say that changing the version and product code should be done, and I tested that they were required in order to get old versions auto-removed. Actually, try to change the version inside the IDE and will ask if it can also change the product code (and package code), and it warns you that you should do so. The upgrade code, however, is clearly marked in the docs as not something that should be changed, and I have therefore not changed it. Is my understanding correct, or is there something else?
Ok, I should clarify - I was kinda vague, but this is a pretty involved topic that not even the windows installer documentation is very clear on. For example, the guidance on when to change the product code goes something like: A Major Upgrade is "a comprehensive update of the product that warrants a change in the ProductCode property." Changing the product code is required to get the experience you are looking for, ie, a removal of the old product and an install of the new. However, this is not always what you might want. For example, if you were issuing a patch or a minor revision, changing the product code might not be a good idea. Again, this is an involved topic, and as long as what you have works the way you want and expect, I really wouldn't sweat the small stuff. Other than upgrade behavior, changing these GUIDs shouldn't affect you.
I've really struggled with finding the right installation package. I'm still using VS.NET, mainly because I haven't found an affordable package that I believe will do the things I want it to. I'm mainly building installations for web applications, and I just can't justify buying Install Shield or Wise or whatever, when they don't really seem to offer any better support for web apps than VS.NET does. At least as far as I can tell, maybe someone else has better information than I do. (This post describes some of the things I'm looking for in an installation package: http://www.coolbits.nu/238.aspx. For my latest project, I wrote a VB.NET application that acts as a wizard for installing my ASP.NET web application. It doesn't do everything I wanted it to do, but it isn't too bad.
I do not like vs.net or Wise... I have been using nsishttp://nsis.sourceforge.net/site/Home.2.0.html
is the class downloadable somewhere?
.NET v2.0 is in private alpha right now, it will be in public beta this spring. The docs for the SerialPort class can be found here: http://longhorn.msdn.microsoft.com/lhsdk/ref/ns/system.io.ports/c/serialport/serialport.aspx
I use Installshield with Windows Installer every day, pretty much. It's honestly not that hard to use once you get used to it/familiar with it. If you're curious how VS.Net does the GAC actions and what have you in the MSI, build an MSI, and then crack it open in Wise. You could probably even rip the custom action out of the MSI and use it later if you wanted to. Not sure though, never tried opening a VS MSI in Installshield. --brian
Hi, I'm looking at building a win form app running on citrix for one of my client. Thank you for the heads up. More info regarding performace once you sort out your 3rd party control problems would be great. Clarke
See also Aaron Bertrand's comprehensive survey of techniques for paging a result set in SQLServer: http://www.aspfaq.com/show.asp?id=2120
We are just starting to look at some .NET in a Citrix MetaFrame environment, though none of it is WinForms. As you pointed out, it is really difficult to get clear answers on this, isn't it?
Loading a DataSet while it's bound to a DataGrid, is much slower than loading it and then bind it. That's probably the issue you are running into.
We use SMS Installer. It was based on an old version of Wise and seems to work very well. A bit strange but we install 40-50 systems with this. We are also going to be looking at the latest version of Wise.
You're da man!! - I mean it!! :) - Why do we need ObjectSpaces in the first place?
Hopefully, ObjectSpace team will be challaged by one man like you Paul!
I just by happenstance noticed this blog. My company is, from what I understand, Citrix's largest deployment of a server farm. I don't know what the count is but I know our server farm is 100+ running citrix and of those 25 boxes will be used for an application we are developing using .NET winforms also (using several NLB App Servers, SQL 2000 and remoting). The application is basically a CRM app with a bunch of other fluff. We will be starting up some System Testing in a couple weeks across a couple servers with about 20 testers. Within a couple months our training environment will be handling about 300+ users and our final deployment will be around 3000 users (1200+ simultaneous) across around 25 servers slated for june. I'd be happy to share my experience with you guys if you'd like (unofficially of course). I was in the same boat as you guys when we were looking for any real world, large scale, .NET winform citrix deployments but came up with Nill and we've had to rely on the fact that they're both supported environments for .NET. We also have a third party grid that I'll now keep a close eye on hehe (infragistics). Regards, Josh
Hey Josh: I don't know if we have a 100 yet, but I know we will by the time this project is rolled out to everyone, since this project alone will have over 50 citrix boxes when done, on top of quite a few we already have. I'd love to hear (unofficially drop me an email) more about your experiences since it sounds like you've gotten farther than us. BTW, Infragistics is what we're using too -- the leak was in an early version of 2.0, the fix was out a long time ago, and hopefully everything is still good in 3.0. We do know that 3.0 performs overall much better than 2.0, but we're still talking about using a custom version since we have the source and have already found some problem areas. I'm in Atlanta -- where are you?
::If O/R mappers are to support multiple ::database platforms, then how can we honestly ::ever expect the mappings to only ever be ::specified once in the code as attributes? Paul, this is ignorant AND arrogant AND wrong. It just works. In the EntityBroker we specify mapping information in code. But this is not database dependant. Basically, a string field is annotated as "string, variable length, max 50 chars". Whatever SQL is generated out of this is NOT part of the attribute at all. On top of this the mapping contains table name and field name - which, again, are NOT database specific - using "'" instead of "[" for mapping is not what the mapping file does - this is what the database adapter should do. We DO use attributes, and we DO have customers running one assembly with the attibutes against Oracle and MS SQL, and it just works - so, you CAN do it, unless you are totally idiotic with the data you put into the database. That said - I should really sit down half a day and get MySQL supported :-) What native interface library should one use for this?
As soon as you start to use joins you'll fail with ANSI-sql. If I would just use CRUD stuff, I could generate my sql with 60 lines of code, maybe less. However the various aspects of non-CRUD sql demand serious customization. For example this Sqlserver query (pseudocode) UPDATE Table Set field = value FROM othertable WHERE Othertable.field2 = table.field2 No can do on oracle, you need a subquery construct for that. Delete FROM table FRom Table2 where Table1.foo = Table2.foo Same thing. These situations are the hard part. With the release of my Adapter template set yesterday, it's now possible to fetch an entity from oracle and save it into sqlserver, including data contained in the object, and vice versa, or develop 1 system and target oracle and sqlserver, depending on what the customer wants. This however ALWAYS database specific details, how else would a boolean field be stored in for example oracle? Varchar(1)? NUMBER (1)? You tell me. You do a good job developing your tool, but you do a bad job getting the O/R mapping message accros. You tell the people it's so simple and so easy, but it isn't. Not by far.
To be honest, it gets annoying. You try to sell a story that writing an O/R mapper is so easy, that supporting a truckload of databases is like flipping a switch, but your mapper is severily crippled and because of that can 'support' multiple databases without a lot of effort. This obviously raises questions like: "Why can paul wilson write a mapper that supports a lot of databases while others have a hard time supporting multiple databases?". The answer to that is: because if you just want simple selects and simple CRUD operations on a table, you don't need sophisticated code. However reality isn't served with simple crud and simple selects on a table. Still, you blog continuously about how easy it was/is to support all these databases. You don't tell the people that you needed custom code for Oracle's sequences for example, or how you would work with a REF CURSOR stored proc output on oracle vs the stored proc output in sqlserver. I appreciate your work but I'm really starting to get annoyed by the way you try to tell the world how easy it was to write your tool, which indirectly says that others apparently are doing something wrong. You even say it in your blog here: "Yes, I know I'm just talking about the simple CRUD operations, but apparently I've guessed correctly that this really is all many people care about, judging by the responses I have received. " How wrong can you possibly be. Writing a good, useful O/R mapper targeting a lot of databases is hard, not easy. Supporting a database type in FULL is very hard, it requires a lot of custom code per database, because every database type has very specific SQL syntaxis for a lot of constructs you run into with an SQL generation engine, or even with the mapping of types to .NET types, to name a few silly things. Telling your readers it's a walk in the park as you tend to do is misleading. Sure, you don't compete with 'the big guys' as you said, that however isn't what I read in this blog as it seems according to you that a large group of people is only looking for simple CRUD.
See http://weblogs.asp.net/pwilson/archive/2004/01/29/64778.aspx
Look at it this way. Without Paul's O/R mapper, I would have never even considered learning about them or using them in my business. Once I am able to understand the basics, I may find that the benefits are worthwhile and end up purchasing a product like Entity Broker. There is very little info about O/R out there and only by looking at Paul's 'simple' code have I been able to appreciate its application.
if I can't walk through the code within a day or two and understand exactly what is going on and how much work it would be to port to my application, I won't even consider it. With limited resources and time, I can't spend 2 weeks researching how to use a 'full-featured' mega-application. For people like me, KISS!
Paul, Keep up the great work. Keep in mind that Frans and Thomas are in a fight for their lives. They're about to become MS competitors. Yikes! Your O/R Mapper is just the thing that many developers need to help them understand what an O/R Mapper is, and how it can be implemented. The thing I LOVE about your mapper is its simplicity. You've done a killer job, as have Frans and Thomas. I hope you all keep it up!
Hi Paul, I work for a large health insurance company and I'm actually in Raliegh NC but I run solo down here. Our core group of developers is located just outside Pittsburgh PA. I'd be happy to shoot you off some details and maybe we can keep in touch and share some experiences. We're actually in the first phases of the project and we're starting off system testing on one of our citrix boxes at the end of next week. To be honest I'm expecting more problems from our app then from citrix :) but we do have a lot of unknowns. At the same time we deploy the application they're updating our citrix farm from NT/Citrix to Windows Server 2003 and Citrix Metaframe XP so they're anticipating better performance and being able to fit more users on one box but there is a lot of unkowns and risks because of those unknowns IMO. I think the project is a very typical corportate project that starts out with the best intentions/timelines but is turning into a test of stamina, gotchas, and "wish I would have known/done that" but I'm having a good time with it outside of the extra hours and I'm learning a lot more then I ever did in my lab and building small asp.net sites or the cram sessions at VS Live(although those are great). I'm far from a newbie but I traded in my servers and testing labs for a family recently so I haven't been keeping up on things as much as I used to but I'd be happy to share my experiences and planning (what's planning hehe) with deploying a .Net solution on Citrix with you. There are likely other developers out there in similar circumstances looking for info so if we could somehow help share the knowledge that would be great too. Well another long night... heading home now.. I'll shoot you off an email. Kindest Regards, Josh
Keep up the good work and don't worry about them, lot's of people appreciate what you are doing. -James
Paul: I agree with the above comments. Great learning tool, and I'm really impressed with your enhancement turnaround. When I was looking at O/R tools I had cost, support, and source code in mind. When I saw compliance with ObjectSpaces I was sold.
Well said! - I couldn't agree more that many applications out there will do fine using a simple O/R mapper without COM+ support and without advanced caching support for distribute systems. Heck, right now people manage to get by <gasp>_without_</gasp> such a tool, even if it hurts at time. I still think there is (a lot) of room for simple O/R mappers and also a necessity to have more complex ones. Preferably it would be a single tool, but I doubt that this will happen. Paul, you have done a fantastic job, as have Frans and Thomas, and I'd love to see more of it.
"And that's what I don't get -- why are so many O/R vendors totally ignoring the simple users? " How simple do you want it to get, Paul? :) Point, click, go, start coding. I can't make it easier than that. The problem with simple users is that they do not exist. Let me illustrate that with an example. In 2002 I wrote LLBLGen, which is a stored proc/call class generator for Sqlserver. It generates simple CRUD stuff and some advanced selects. In other words: pretty basic but enough for a lot of situations. "Enough for simple users/usage" Right? Well... no. You see, only the very very small, home-brewn projects are requiring very simple data-access. You very fast run into aspects like "Get all records X which have a record Y where Y.foo = 10". Is that simple stuff also? No. Most basic tools for simple stuff can't do that. It's a simple query though. The problem thus is: if you offer a tool, people start using it, but it's very very likely that the user runs into its limitations sooner or later. With a simple tool, it will be 'sooner', with an advanced tool it will be 'later' or probably 'never'. Does the user knows this up front? You might think he does, but I think he doesn't in a lot of situations and according to the big pile of email requesting flexible where clauses in the simple LLBLGen 1.x tool tells me I'm right. Like I told you before, your code is ok, your tool is ok and you did a good job writing it. It's your marketing skills that need some perfection :) For me you didn't have to write an article and mention my tools name, but it's appreciated very much of course. For me, it's important that you understand that what YOU say, or better: don't say, is read by a very very big audience who think and know YOU are the man to listen to. In that light it is important to understand that if you paint an image of the reality which looks very simple and easy, it might misinform your readers, although I don't think that's your intention. I hope you see my point. There will always be room for tools which simply do very simple things, because they can't do a lot, but what they can they do well. Like I said earlier, that's fine by me. You obviously have had great fun programming your tool and that's a great thing to have in life, so I'd be the last person to tell you to quit (not that you would do that if I said so ;)). I hope you now understand why I was annoyed, again: not because of the presence of your tool, but about the wrong image you created of reality.
And what I'd like to know (and please provide me with an example) is who I tortured with a hostile attitude? My native language isn't English, it's Dutch. We have different language constructs to be 'polite' and when I write a sentence it might sound rude, although I really don't know that, simply because I'm not a native English speaker. (English written by Dutch is said to be less polite, due to the sentence constructs). I always try to be reasonable, even if some people are not that polite to me or very stubborn. However you mention in your blog I apparently have a hostile attitude, and I'd like to see proof of that or examples.
I know very little about O/R mappers, definitely not enough to debate the topic but I do know about having professional courtesy which the two of you seem to have very little of. Whether it be because English is not your first language or you really just don't care I don't know. It's very clear what both of your feelings are concerning the WilsonORMapper from many of your threads in the ASP.Net forums, many of which I and others have considered borderline hostile and felt the mods should have locked (and there are threads wondering why the mods let this go on). Now to come trolling around his blog basically looking to pick a fight is pretty pathetic. If you don't find Paul's contributions valuable or his product sub-par that’s fine but it's obvious that others do and despite your guys's constant barrage of "criticism" which boils down to "yours sucks mine is better" Paul has stayed very professional and I applaud him for that. If any of my developers had provided "Criticism" in the manner in which you guys do you'd have been out the door a long time ago. And as for your products they sound like excellent full featured products and I hope your businesses are successful but I can only say as developer if I was looking for a O/R mapper and witnessed this kind of behavior I’d think twice and likely just wait for MS. Regards, Josh
I agree completely with Josh's comment above. I have been following the .Net O/R community since its inception and have to say that the behaviour of several prominent individuals in the community is extemely unprofessional and unproductive. Their behaviour is quite clearly nothing to do with any language barrier or cultural differences; it is a simple lack of professional courtesy that does nothing to enhance the reputation of those involved. I evaluated several O/R products for my company and although I was fairly impressed technically with both Frans and Thomas' products, I was put off by their behaviour in a number of public forums. I was not comfortable recommending products where the main public representatives of the companies were given to rudeness, arrogance and ad hominem attacks on perceived critics and competitors. Real software companies do not allow their staff to mouth off at potential customers in this way. This is all IMHO of course, but a quick browse of the relevant google groups will show many examples of the kind of behaviour that has put off myself and many others. I think the fact that this is being discussed at all is more sad than anything else because Frans and Thomas have both made great contributions to the disussion and development of O/R mapping in .Net, and would perhaps be taken more seriously if they could turn off the aggression and insults when trying to promote their products.
can this work in VS 2002,where can i download this
Once again, this is part of .NET v2.0, which is not publicly available yet, and no it will not work in VS2002 anymore than .NET v1.1 will. There are third party serial port libraries, both free and commercial, if you google on them.
Dang! That was fast! I haven't even had the chance to blog about it yet! TTFN - Kent
which will be supported as a ORMapper? CRUD is the base function, and must support a object query feature. as Paul said, simple is the best, but database independence is very important, and this is very easy to implement for CRUD but not for QUERY. i think of the query design for a long time, and i find that it's very easy for a developer to learn a object query language. this learning maybe only spend a few hours. and the query script is more understandable than others: 1?select name from employee where department.name like '%s%' 2?List lst = cv.addClass("employee").addSelect("name").addFilter(LIKECRITERIA("name","s")).execute().getList(); if somebody also be interested in query design, please see my design in my blog: http://progame.blogger.cn
An article on automated testing procedures for asp.net would be nice.
Thanks for this article. We've been trying to do figure out a way to do this where I work for quite some time.
hey i just started it!!!!please check it out i would really appreciate it thanx and im azn RYCE RYDER 4---->
See http://weblogs.asp.net/pwilson/archive/2004/02/02/66155.aspx for additional details on how to combine Windows roles for authorization as well.
thanks. it works great.
Thanks for the update to an already nice job.
Did you profile using a tool like NProf (http://nprof.sourceforge.net ) ? I did some simple benchmarks with LLBLGen Pro today compared to datasets (the 2 different template sets and a dataset compared together) and found some serious bottlenecks using the profiler in places I never thought of as slow. I'm now close to 45% off the pace of a dataset when loading lots of rows into a collection (200 times 100 rows: adapter templates: 0.98 seconds, dataset: 0.54 seconds), haven't checked single object instances yet, which should indeed be a lot faster than datasets. I'd suggest to profile some code (if you haven't done so ;)) with teh profiler to check out the bottlenecks. Mine are located in GetOrdinal of the datareader (I can't remove this, because I want to stay flexible with fieldname-fieldpos relations) and IsDBNull, also a datareader member. IsDBNull and GetOrdinal are not used by the SqlDataAdapter of course to fill the dataset, so some bottlenecks will stay. Nevertheless what surprised me was the speed of the Sql generator, which I thought would probably be a bottleneck but that was totally not the case. Some interesting things I found out: - switch(myStringVar) { case "foo": .. case "bla": ... } will be converted to a static hashtable by the C# compiler. - sortedlists are extremely slow compared to hashtables. If you can use hashtables, do not use sortedlists instead (I thought it wouldn't matter... well... it did ;))
Hey Frans: My performance tuning so far has just been lots of hand placed timing statements where I gradually drill down until I find the lines that are taking longer than expected. Its time consuming, but I've actually found it works wonders in the hands of someone that has experience, like you or I. I tried to play with the demo of DevPartner Studio, but it returns way too many false positives to be of much use for me. I may try NProf though -- I've seen the blogs about it, and your results do sound intriguing. Thanks, Paul
This class is based on the work done documented @ http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=b06e30f9-1301-4cc6-ac14-dfe325097c69 that will work with VS2002 & VS2003 after some tweaks!
Damn, I saw your post and was relieved that they were finally adding that so I wouldn't have to create my own. Unfortunately I need it now rather than later, so I'll have to build my own anyways.
Have you put in an incident into Microsoft Support re: the perf counters? And, thanks for blazing the way in Citrix. We may be doing this kind of stuff in the future, and I'd rather see you feel the pain than me!
>And why is there another 3MB that is lost in total system available memory that isn't reflected in the .net memory performance counters for that process? What is "total system availabale memory"? There's no such counter in perfmon. Are you looking at Available Physical Memory in task manager?
"...memory is low when you only have 32MB left on a 4GB server" - and why exaclty would you want to have 4GB of RAM and only use half of it? A production server should have zero available memory under normal operation. If it doesn't than it's wasting your resources.
>A production server should have zero available memory under normal operation. If you have zero available (physical) memory on a production server it's definitely not normal. While some memory hungry apps like SQL Server tend to consume most of the available memory, they usually leave at least 10 MB for other processes. If a server consistently has less than 10 MB of physical memory available it alsmost always means lots of paging and horrible performance as a result.
I'm referring to the regular memory performance counter for total available memory when I mention total system available memory. That seems to reflect just available RAM, and all of it, which may not always be the best number ideally, but its certainly a far better number than the .net global one that simply doesn't work.
I don't know what causes the behavior that you describe, but I just wanted to say that counters like Memory\Available MBytes are not the best way to measure memory usage. Available physical memory can jump up and down depending on how the OS feels. If you want to measure how much memory a single process has allocated, use Process\Private Bytes. For global memory usage, use Memory\Committed Bytes.
While the development is nice, installation of your developed programs on a PocketPC is much harder than it should be. I have spent about 3 times as much time on installation as I have on development. A conversion program among Web, Windows, & SmartApplications would be a nice. Why have to write the same code multiple times. Also, certain controls have different properties and display differently depending on the fornat, specifically, I would avoid using the TabControl component if you want similar programs on both the PocketPC & WIndows environemnt.
Take a look at www.dotnetpark.com web hosting. Thay are better than webhost4life and they install ASP.NET forums, DotNetNuke etc. for free.
I've looked -- webhost4life offers more for a lower price, and I've been with them long enough to personally know their great support and performance. Besides, you really missed the point -- I'm a developer and I do my own thing because I can customize it -- why would I want someone to install forums for me?
They do a very good job covering ASP.Net. I can't think of anything else.
Paul, whilst I've not run in to this problem it would be benificial if you could explain how you "just create it once and reuse it" - just in case I (or others) run in to the issue. :-)
what's the asp supposed to look like?
Create the serializer once, and keep a reference to it.
(sorry - I should have mentioned that my previous post was in answer to Phil's question).
SOme good info there on how .net works with memory ahd GC. I think you have verifyied some things I have told folks over on GDN.com at least a few times. but I think the question was posed there: why run 40 users thru meta-frame to run a .net app?? it seems to me (untill I would know more details) that a better design could be built? are the 40 users unable for some reason to run .net software on the pc's that use meta-frame? even if this is the case I think you might see if you could perhaps run a second server and have it do some form of "Pooling" and or "Cacheing" of data and objects thus taking a large load off the meta-frame box. 3 tier design.... handle the meta-frame as if it was a web-client and use a middle server as if it was a web server / app server....
Hmm, I personally used to write some data hungry .net winforms applications, and I think that it's not so good idea to have everything in memory as datasets. I used DataReader or save-query-to-disk techniques to handle such things. Anyway, finally I found out that it's much better to use web-service oriented architecture (like MS did with their business products like MS CRM). It's especially important in case Citrix or other terminal based scenarios, since you an "outsource" data processing activities to some other box(es)
Why use Citrix? First and foremost is security -- we don't want our data on individual machines. Its also a TCO issue to limit deployments and upgrades to centralized servers. While I would prefer a non-Citrix solution, its hard to argue with these valid business concerns. Why not a middle tier? In this case it would make things worse! The problem is not getting the data, its working with it in the rich client application. Our issue is that we've designed no limitations, so paging or limits on number of records do not exist. Our app depends on everything being loaded into a feature-rich 3rd party grid control, which means all the data has to be in memory in the client process. I'll agree that these design decisions are what is hurting us the most, but given the requirements . . . We've looked at save-to-disk techniques, and may yet go that way. The key is that any type of "paging" we do with the data must not slow down the user's experience.
"Our app depends on everything being loaded into a feature-rich 3rd party grid control, which means all the data has to be in memory in the client process." that sounds like the "Kiss of death" right there..... Paul, I have used sql databases with up to 5 million rows of data at a time.... I NEVER had to give the client all 5 million rows.... the "WOrst case" was doing odd-ball searches for some set of rows .... but I never found that giving the client a set of less rows was a problem... as long as the app design worked with the user to give them a logical set that they expected to get based on what they were doing.... also if 20-40 users are using the same app the question is: how much data is *exacly the same* for all 20-40 users? if they can edit the data then you have updates to deal with but ..... that can be done without re-inventing the wheel. I just think that perhaps some form of common data object could be created that would start each user with a reference to one common data object, this would have a "Local" object that looks at the global to read data.... then an update would cause the local to write the data to the sql database and pass an event to the global to cause it to re-load changed rows, that would then push an even out the the local proxy objects to re-fresh the local views. under a model like that I can visualize 40 sessions having one common 100-600 meg data store and 40 local images of 1-10 changes to write seems like that could reduce local memory stress a whole lot. basicaly (this is .net data sets right??) you would create a new data-adapter and data-set objects that comply with the normal interfaces and extend them to work with a common memory based store.
I fully agree its not a good technical design -- "kiss of death" is appropriate. We currently have a 100,000 row limit in place -- and some users are quite upset. As for shared data -- there will be very little, if any, in most cases for this. Also, updates are not allowed to the original data, only to new copies of it made. I'm talking about multi-GB databases, some of them in the TB-range -- very large. Single users look at their "small" chunks, which might be 100MB, or maybe 1GB+!
Hi Paul, great data, I found myself in similar positions when researching 'best pratices' for .NET based systems, although not on Citrix, so I very much appreciate you sharing this information with us. Thanks!- I also wish that MS would provide some more info on these kind of things publicly as I am sure they have done tests on terminal server/citrix... One other question? - Why didn't you use a browser-based approach? Best regards, Marc
It makes perfect sense to nullify global objects that doesnt need to be lurking out there anymore. But this doesnt mean that you need to nullify each and every object; Its all about reachability. Your objects can not be collected when some code call still use/reach it. In other words, objects that are created and only used within a certain scope do not have to be nullified.
Marc: A browser-based approach would be nice, but it simply does not provide a rich enough GUI, nor fast enough performance with this type of data. Think about it this way, would you drop all of your everyday tools and move them to the web? Ryan: Sounds like a nice theory, unfortunately the reality I've looked at shows that even setting local scope objects to null "can" make a big difference. Again, it may not be "needed", so it may depend on the scenario, and I certainly don't see the need with small apps and less data. But for large memory intensive apps, you really do need and can help the GC by setting at least the large objects to null. I didn't believe it myself, until I saw it.
Ok very big data + grid + Metaframe Yuk! yes this is a "Rock and a hard place" indeed. last comment: smart-client? gets users out of meta-frame, keeps rich gui, spreads out memory footprint, keeps control of code and data central, clients code is updated on the fly by a server based code share. you then manage "data on the client" with some custom classes .... the only hard req. for this is all clients run WIn98 or later and get a 1 time install of .net framwork. as for row-limit's I'd tend to think a custom data class could make the data "Virtual" to the client.... just a matter of how you present the data and let them scroll thru it.
I agree that would be my choice too, but security concerns have overriden technical preferences.
Why not to run garbage collector after an user finished working with the data? Running garbage collector can be a bad idea for a server application, but for an user driven application it should not affect performance so much.
We're starting to add a few well-placed GC.Collect method calls. My frustration is that there isn't any real direction on these issues -- or its wrong when there is.
Regarding Fran's comment: "It's your marketing skills that need some perfection :)" I personally have seen numerous threads where Frans completely rips a user apart for disagreeing with his perspective... ending up just saying the other guy was stupid. Regarding the comments by Josh above, I agree also.. When you are producing a product that you want people to buy, first and foremost professionalism will sell more copies. It might lose you more arguments, but hey, you're not getting paid to win arguments over who's idea is better or whats right / or wrong. Fact is, for any given problem there are possibly dozens of solutions. Only an arrogant fool would argue that his was the "best" solution. I tried Entity Broker and yes, I was flooded by its complexities and could not use it. If LLBGen was so great, why not use XSLT from the start rather than hard code all the sql generation in code? I disagreed with that. So, I wrote my own using XSLT and a database reverse engineering process that generats xml schema from the db. The moral of the story, use what works for you. And keep in mind that tools for the masses usually means masses of features a single developer does not need [but pays for anyways].
Paul, I have change some code of your test app like: private static void CreateArrayLists() { int arrCount = 2000; int max = 20000 * approxMB / arrCount; int count; if (random) { count = new Random().Next(max / 2, max); } else { count = max; } for ( int arr = 0; arr < arrCount; arr++) { ArrayList list = new ArrayList(); for (int index = 0; index < count; index++) { list.Add(index.ToString()); } } } When changing arrCount into 1 value, I get the same behaviour like your original testprogram. However when creating more arrays, the GC seems to do a better job. I do recall that the GC is handling objects with a large footprint differently than their lightweight counterparts. This behaviour was already "discovered" by other people. I hope someone with more insights on the GC than us will comment on this issue...
Per your memory management issues. It has been my experience that although the GC does a great deal of good work for you, i hope to see future releases be more preemptive in recapturing resources. I read in interesting article on the GAC and it did open my eyes a bit to how it worked. If I can recall the Microsoft Blogger I will forward it to you. What was interesting was how some of it worked. For example, when you create an object, it puts it on the heap and your variable is just a pointer to that space (nothing new here), but when you set it to null you are merely just informing the CLR that you are no longer interested in that chunk of memory. Furthermore, when a variable leaves scope, the GC has to first recapture the variable that holds the address to the chunk of memory. Then once all variables have been recaptured and all counters have been decremented to 0, it can reclaim the memory that the variables point to (this is a bit of conjecture on my part but I think I am right...if i am wrong someone please correct me). If all of this is true, then setting it to null must help the GC in its collection efforts because it does not need to recapture the memory the object variables are pointing to and the GC can more readily capture the underlying memory the objects were pointing to. My 2 cents anyway, -Mathew Nolton
...continued ...this extra step of reclaiming the variable directly affects the GC's ability to reclaim the memory the variable points to and can cause the GC to fall behind in its efforts to reclaim memory under a heavy load. That is why setting it to null helps the GC...Again this contains some conjecture but we have run across similar issues of the GC falling behind. -Mathew Nolton
Sounds like a good explanation, short of hearing one from the clr team. Thanks.
Paul, it's interesting to read your comments. My organisation is in a similar situation (Citrix, Server, GC not releasing memory, the works). I have a couple of points so far: Firstly, I think the reason why nulling out your reference to the list shows a benefit is because you are first building up a new list, then assigning it to the reference. Of course there will be GC activity while building up such a big list, and as you're still holding the reference until the list is assigned, the GC will not be able to collect the memory. I believe you could change your code with one of the following methods to get the same results, which clarifies that it's not some mystical "We're telling the GC to collect it because when we set it to null, the GC knows to collect it" behaviour. Instead of making a new local ArrayList, then adding to it, returning and assigning it, you either assign the new ArrayList straight to the list variable, then build it, or clear it without a new assignment, and build it. In reference to Matthew Nolton's post, I am confused. As far as I'm aware, the .Net GC uses no reference counts, so if that's what you are referring to as "counters", I believe you are mistaken. I also disagree with the statement that the GC has to clear some objects out before it can clear out the objects that were referenced by those in the first clearing. The GC presumes all objects are garbage until proved otherwise. If an object is garbage, then the GC will never trace references from that object to any other object. Hence, if a garbage object references another garbage object, both are marked as garbage in one sweep, and collected at once. I would love to hear of any solutions that come up for the issue with the GC. Niall
This discussion really got me thinking. It also helped clarify a few points for me that I had wrongly assumed. For example, there are no counters, but the GC does walk its internal pointers to determine if an object should be marked for collection. As for GC clearing objects in one pass, that depends upon the object's generation...interesting read. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/dotnetgcbasics.asp
<b>
Yes, sorry, I didn't go as far as considering the generations. It will clean the objects in one pass as long as they're in the generations the GC is going after. This is the same for the case where you're nulling out references to objects - if you null out a reference to an object in Gen 2, and a Gen 1 collection is run, the object will remain. A good article is this one, and the Part 2 linked at the end. http://msdn.microsoft.com/msdnmag/issues/1100/gci/
Thanks, I will have to check it out. Richter always seems to get it right. -Mathew Nolton
Simple debugging techniques and procedures.
A simple example with User Controls, Events, and Delegates.
Multi-series article on how/why IBuy Spy was designed and built.
How to use XML for menu content.
Database structure, SessionState and Cookies for Language selection, Drop-down user control, etc...
Excellent point Paul. I was laughed at when I went the null/nothing route. It seems that when I have forgotten to do this, I may have had problems. When I do go the null/nothing route, I have never had a problem. Good points Paul! Wally
After downloading your example, I noticed a flaw in your analysis. Setting Object To Null is usually not necessary, because the JIT compiler tracks the LAST use of a variable within a method. In such cases, the garbage collector ignores variables, when the instruction pointer exceeds the address of the last known use of the object variable. However, if the variable is still used further down a function, then setting object to null does help. In your example, the garbage collector has no way of knowing the variable is no longer used, because the variable is still used further down the function.
Let me also point out GC.KeepAlive(obj), which is a function call that is used to prevent objects from being freed prematurely. In the following example from Rotor, the GC can prematurely close the stream before MethodThatSpansGC() finishes. This is because the Foo object is no longer used in Main and the this pointer is no longer used when stream.MethodThatSpansGC is called. // class Foo { // Stream stream = ...; // protected void Finalize() { stream.Close(); } // void Problem() { stream.MethodThatSpansGCs(); } // static void Main() { new Foo().Problem(); } // }
Hi Wesner: Again, as I noted, my example was concocted on purpose to show the worst case. But I had an example previously that I did not upload, since it was not my point, that did not suffer from this "flaw" and which was still helped by setting objects to null, although certainly the it was not as great of an impact. Also, if you look at the graphs I made, you will see that the total committed memory even in my "flawed" example was quite frequently much more than could be explained by this "flaw" alone. So while I can't really explain it, I've seen the proof, and there certainly are situations where setting an object to null does help the GC.
An elegant means of inoking Dispose that have adopted is using the "using" construct. For those of you who may not nbe familiar with the construct, it provide a means to implicity invoke Dispose() on an instance that implements IDisposable even if an exception is thrown durring the operation. The following is an example of the using construct: using(DisposableClass dc = new DisposableClass()) { dc.PerformActionOnUmanagedResources(); dc.PerformAnotherActionOnUmanagedResources(); } In the previous example, if an exception was thrown in the PerformActionOnUmanagedResources() method, although the PerformAnotherActionOnUmanagedResources() method would not be processed, the using block will still implicity invoke the Dispose method on dc ensuring the realese of any unmanaged resources.
The Using keyword will also be added to VB.NET in .NET v2.0.
Isn't it just easier to use unmanaged C++ if you need control over releasing resources? I thought the whole selling point of managed environment was that you don't have to do that...
Also, remember on things like a SqlConnection you may not want to call Dispose because it actually closes the connection while the Close method does not if connection pooling is on. So you would see performance loss if you disposed the connection because a new connection really would have to be opend and thus connection pooling would be a waste.
Sorry Adam, but I disagree. First, I've looked at the source code in Anakrino, and all Dispose does is call Close and null out the connection string -- nothing more. I've also tried this for myself, and I didn't see that behavior. Maybe this is another myth that is making the rounds, but there's nothing like trying it for yourself.
I completely agree with you!
Leak in .NET ContextMenu
On Saturdays I tend to wake up at noon and just read leisurely, not being prepared to do much more, except catch up with the outside world. Paul Wilson posted an interesting series of articles on .NET garbage collection, where...
1. design patterns in ASP.NET framework infrastructure 2. developing ASP.NET apps with design patterns
Real world case studies about using MS application blocks
Paul, I still think you are incorrect about the nulling of objects being a cure. It does work, but there are logical reasons for it, and it's not something special about null and the GC suddenly realising that it can do something different. If you check the managed heap usage in your test app, before and after you null out the ArrayList, you see it go from 8MB to virtually none (this is with a 1 minute run). If you check before the ArrayList.Clear(), it is around 70MB. So clearing the list brings the managed heap usage down from 70MB to 8MB. Subsequently nulling the list takes it from 8MB to ~0. So you might still think that using null is serving a purpose. It is, but not because null holds some special value to the GC. After the list is cleared, the internal array in the ArrayList is still allocated. At this point, there are 2 million elements in it (using ArrayList.Capacity). At 4 bytes per pointer, that's all of the 8MB which is the difference. If you call ArrayList.TrimToSize(), then all the memory is gone, and there is no benefit from nulling out the list. So once again it comes down to the business case. If you are going to be reloading that list back to the same size again, nulling out the list will only mean you have to spend all the time allocating the memory again. If you are finished with the list, then trimming it after emptying will do exactly the same thing as null.
Hiya, Just as an aside, this problem occurs also on MainMenus - not just ContextMenus.
Thanks for that info Zubin. Very little, if any, of our main menu is dynamic, so hopefully that's why we haven't noticed this one yet.
Another note. Jerry Dennany shows that the GC works differently in depending on Debug/Release mode.
But Paul, you didn't write the most important thing. Why should we explicitly call the Dispose method? It is still being called by the GC, so why call it manually? Is there any performance gain, can you point to some whitepaper saying this? Thanks, Radim
Hi Radim: Why should you explicity call Dispose? First, because it is NOT automatically called by the GC! That seems to be a very common misunderstanding. The only way to automate the call to Dispose is if you using the C# using keyword. Otherwise, objects that implement IDisposable must have their Dispose method called manually -- it will NOT be called by the GC. That said, the typical implementation pattern, but not guaranteed, is that the same code that frees the unmanaged resources in the Dispose method will also be executed in the Finalizer method. The problem with this, which is itself a big assumption, is that in order for Finalizers to be executed they have the side-effect that such objects don't get GCed very quickly at all. Instead, when the object would have gotten GCed it instead gets Finalized and then promoted to the next heap generation. It will then only get GCed when that next heap generation is actually GCed, which could be quite a bit delayed since that's the point of heap generations. By the way, the proper implementation pattern for the Dispose method is that the code in that method should also call GC.SuppressFinalization to turn off the Finalizer and avoid the usual GC delay that Finalizers incur. So if you are not calling Dispose manually, or using the C# using keywork, then you are relying on the Finalizer, which will always incur a large cost, and you are also making an assumption that there is a Finalizer and that it does the same thing as Dispose. Dispose is your friend, and its there for a reason -- call it when it exists! Thanks, Paul Wilson
Paul I agree. At the same time you shouldn't have to apologize. The whole point of living in our community is to freely and openly discuss ideas and rants...as long as the information you present is fair and factual...who cares. -Mathew Nolton
Richter also has a great discussion in his .Net Framework Programming. Its a good read on implementing the Dispose pattern as well as finalizers (its in line with Brumme).
Yes, as far as I'm aware the optimisation for not reporting roots for locals that are still in scope, but not in use only occurs in Release mode.
I'm swore I read somewhere on msdn that calling Close() will call Dispose(). Which kind of makes sense for the idioms we see. Open() the connection, Close() the connection. I've seen no idioms where Dispose() is called instead in this case. Let me know if you think this is correct or not. If not I'll try to locate the source that I read it from.
Decompiling it shows that Dispose calls Close -- Close does not call Dispose, although the effect is the same. However, the point I'm making is that the only way you can say its safe to not call Dispose is because you have some inside knowledge, either from an expert or from a decompiler. But internal implementations can change, and its a very bad practice to ignore the very pattern, IDisposable, that was included for a reason just because you think its safe to ignore it. Trust me, I've code this way too, and I don't like adding an extra line when I don't think I need to do so, but its these types of assumptions that have proven to be wrong in many cases, even if not in this case. Thus my advice is to trust the pattern, not the assumptions of insider information.
Paul, I cracked open SqlDataReader in ildasm and you're correct, Dispose() calls Close(). However, I opened up the TextWriter and in this case Close() calls Dispose(). Is there a "theory for everything" reason for this? Or are different developers at MS implementing their own interpretations of patterns? Thanks.
The lack of consistency is probably related to at least two things, maybe more. First, the IDisposable interface wasn't added until the very last minute, which explains why there is both a Close and a Dispose in the first place. The other issue is that even now the IDisposable interface is more of a pattern to follow then something baked into the .NET framework, since the GC is ignorant of it. So while we all agree that there is an IDisposable interface to implement when there are unmanaged resources, there really isn't any specific implementation standard.
Have you ever tested with SQLite? I don't believe it has an odbc driver, but it does have an ado.net provider. SQLite is a great offline type database like access. thanks Paul
Another Paul W.? :) Sorry, but I've barely even heard of SQLite. The architecture should make it very easy to extend to other providers, even without OleDb or Odbc drivers, once you have the source code.
Looking pretty sweet. Nice work!
fyi: Your news and examples tabs are not working.
They work in IE and Mozilla for me -- what behavior are you seeing, and which browser?
u r an asshole ur dll's are not registering. fuck u and ur components
The first public showing of ObjectSpaces used a type of code injection. You authored your objects as abstract base classes, leaving all your data properties abstract. At runtime the system generated code to turn your abstract classes concrete. This had the drawback of not being able to use 'new' to construct your object. The next version that never showed up at PDC used ContextBoundObject like you described in order to intercept references to properties, etc, to store original values and such. Unfortunately, all that stuff was designed for building remoting proxies and the cost for in-memory cases was just too heavy. The current ObjectSpaces implementation does not rely on either, simplifying the process greatly.
Ok, I'll bite. What then does the current ObjectSpaces implementation do? Please inform us, don't leave us hanging!
As far as I can tell, the alpha version that is available now uses something similar to RAIL -- they create dynamic assemblies that get substituted for the real things at load-time. This was exactly where I was also heading until I stopped and decided that things needed to be more flexible anyhow. It would be nice for Matt to confirm it though, since its really hard to tell for sure.
What are you trying to register? You don't typically register .net dlls, although you sometimes install them in the GAC. If that's what you mean, then you are right that I have not strongly named my components, so they will not install in the GAC. Everything comes with the code, so you can strong name them yourself if you desire, so . . .
"Optimistic concurrency works by adding some portion of the record's original values to the where clause of the update statement to make sure no one else has updated it first. " Heh :) Optimistic (or pessimistic) concurrency doesn't work. Either way someone looses work done. It's OR the one who saved first, OR the one who tries to save last OR the one who started first OR the one who started last. When do people start seeing that low level concurrency is not the way to go?
I've solved it this way (but it's probably not appropriate for you, as you use the non-intrusive way) I've defined an interface, IConcurrencyPredicateFactory. This interface has a method which is defined to produce filters based on the entity passed in and the type it is required for (delete, save). An instance of this interface can be inserted into the entity object, for example at construction or whenever you want. The advantage is that you can produce whatever concurrency scheme you want! Timestamp and some value? just a value? just a set of values? just a timestamp? no problem. Just produce the filter object. When you have constructed an object hierarchy at runtime (like customer with some new orders, orders have new order detail objects, perhaps some other referenced objects), you can simply save the Customer and all objects get persisted recursively, AND the concurrency predicate factories inside these objects are used at the moment they're required. Set and forget :) This approach has also the advantage that you can set concurrency on a per-object basis or on a per-entity type basis.
I was wondering if you had an example of using this code with an asp.net datagrid, complete with paging and sorting. email: mwpat@rogers.com
I use it internally at work on a project, but that's not an example I can share. I also use this, but wrapped up in my WilsonORMapper, on my site, but there I use repeaters since I don't like datagrids. There are lots of other examples that show you the asp.net code that you want, so I haven't bothered to recreate one yet again -- the only thing I'm pointing out is how to set up the stored procedure in a better way.
I totally agree that optimistic concurrency is often, and incorrectly, given a very lofty place. That's why I didn't even bother to include it in my first version, and even now make you set it up. I also don't like the fact that its the default in MS ObjectSpaces, although I assume (hope) there's some way to turn it off. I have seen very few systems over the years that have multiple people updating the same records, although its very common to have triggers or other checks against common summary data, but that's not really the same thing at all!
it's just the problem make me puzzed.TimeStamp can avoid the conflict but can't resolve it.
I have the same problem. I have download the last drivers for my alcatel, and the problem continue. I need help for this problem! Sorry my English, I'am Portugues. lol Thanks
The latest driver fixed my problems. I don't know anything else to tell you.
I totally agree.
I can almost here George Bush, Sr. in the background. "Not gonna do it." Keep dreaming. It's a nice dream.
MS never learns. They're junkies hooked on locking users in. Does that make all of us co-dependants? Begin very long rant... [snip: you've heard it all before]... ah I feel better, but no better off. Time to think what to do about it. P.S. The silence from MS staff bloggers is deafening. I hope against hope the staff is revolting.
See ya there!
Ok, point taken. It's good that the word is getting out, and that these sessions take place. I just wish that there was more for the avid .net junkie.
What happens to session objects, containing, say an xmldocument object with data? I am using several objects containing from 3KB to 80KB data each.... Memory does not seem to clear when I uses Session.Abandon... even after setting each object to nothing...
Keep in mind that you have to wait for the GC to come around, and any long-lived objects as session usually is will be in gen 1 or gen 2 so they won't get GCed as often. And large objects are always in gen 2, so once again you may have to wait awhile. So, when you say memory does not seem to clear, does your server have more than 32MB of memory left? If so, then you haven't reached a critical point yet, so the GC may not occur for a some time! In other words, lots of memory being allocated should not matter unless you are running very low, which is going to occur far more often if your system is running many things at once.
Is there any way to explicitly invoke GC to clean up the large object heap? I am in a situation where the ASPNET process kicks out when memory reaches 250MB... done all kinds of performance and memory monitoring with Microsoft, and they can't figure out what it is... crash dumps and all... so I'm contemplating working with smaller objects in string form only (serializable) and using state server. Machine.config processmodel memory limit is set at 60% of 2 Gigs RAM, so 250 Megs shouldn't be a problem.
Partly. You can call GC.Collect, but that's a strong suggestion, and it could impact performance in several ways. That said, my app with lots of large objects does use some GC.Collect calls when windows are closed to help cleanup, but its not a web app which would have multiple threads of requests that would be impacted. There are several reasons why ASP.NET will recycle, not just for exceeding its memory limit. I don't recall the others off the top of my head, but I would make sure you check into those also. Also, is no other design you can use to avoid xml documents in session? If they are shared you can use a static field, or maybe use the cache with sessionid as a key if they aren't always reused since it will clean itself up as needed. My app with large objects would be much better off redesigned, and there are many ways to do so usually -- in my case its a management thing though.
Good to see you there as well Paul. -Mathew Nolton
description kya hai
Do you know of any online reviews of this book? I see that no one has reviewed it yet at Amazon.
Paul. Check out my comment to Roy. http://weblogs.asp.net/rosherove/archive/2004/03/29/100773.aspx
I assume there is no review because its so new. Paul Speranza linked to his comment on Roy's blog where he says its good so far, and I've seen several other blogs say the same. Also, I think someone indicated the authors are part of the NUnit development team, so this is really coming from the experts.
Here's an article on unit testing your data layer.
Here's the url for testing data layer: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/aspnet-testwithnunit.asp
I still think posting to other pages is not needed, even if it involves pages on different websites. It was probably disabled because of the better alternative, i.e. posting the data using XML Dom from one website to a webservice on the other website.
Sorry, but I never did post an update -- Scott Guthrie noted that my protest was heard and that it will now allow you to post to other servers and applications. See http://weblogs.asp.net/scottgu/archive/2003/11/15/37802.aspx. Should you really need this? No, but that's not the point -- the point is that html allows this, sometimes you have to integrate with others that expect this, and there are some cases where it is just nice.
When are we gonna see some perf numbers?
How about 2 months ago -- http://weblogs.asp.net/pwilson/archive/2004/01/14/58721.aspx :)
The article code is good. but the document doesn't cotain the details of the TAConfig file. As it plays imp role, it is difficult to understand without it
LLBL stands for: Lower Level Business layer Logic :). So the generator for that is called LLBLGen :) The name is abit of a pain as it is unpronouncable, however because it is widely known, I'd be mad to change it :) Btw, I wouldn't be surprised if Alex will say tomorrow it's an April Fools 'joke'... (but a bad one, a lot of people will be dissapointed).
quite helpful - babu
Sorry, I'm new to sql. Why the extra "SELECT * FROM ~ IN ~" statement? Why not just do a "SELECT TOP ' + @SizeString + ' * FROM ..." and make the second select the top select (if you see what I mean). Wouldn't this have the same affect?
GOOD ONE
After talking with some Microsoft folks yesterday about this it seems they want to make sure they get all the ADO.Net issues lined up completely before diving into ObjectSpaces. A more stable and fully optimized version of OS that takes advantage of all that ADO.Net 2.0 offers certainly would be preferrable. Also, this might leave some extra time to provide a multi-backend version out of the box. Still, this is a bummer.
Well, I think past history had indicated exactly how much leaks regardless of who you tell. I'm NOT saying that you or any other MVPs have been a leak source in the past. That said, maybe the announcement is tied to something bigger and we want to keep the whole thing under wraps until it is announced. There are many levels of NDA and the information is tailored for the specific NDA audience. So, just because you have an NDA does not mean that all information is available.
"That said, maybe the announcement is tied to something bigger and we want to keep the whole thing under wraps until it is announced." This in fact says more than Paul has said. Apparently MS has something in the works to solve versioning control once and for all (perhaps working in a class db directly? ) :) Although I think too much ground has been lost to Vault or free alternatives like subversion to win back the hearts and minds of the developers to support sourcesafe again. I've never had probs with sourcesafe myself, it did what it promissed and I think a lot of hte bad publicity is also fed by lack of knowledge, but nevertheless, it's bad publicity and a bad reputation.
I hate to argue, Frans, but I would point out that a lot of the good publicity that Source Safe gets is from people with either a lack of knowledge, or an extremely simple source code tree with minimal branching. I have yet to meet a Software Configuration Manager who looks at Source Safe with anything but disdain. -- And, as far as Paul's original post, he's correct, this has been stated many times. Every time I ask a Microsoft employee, this is the answer I get. Unfortunately, I work in a Microsoft only shop, and there is no opportunity to bring anything else in, even if it is free. Else, I'd be jumping on the Subversion bandwagon right about now.
Like many others, I have moved onto SourceGear's Vault, and I have no desire to move back... And we're a Microsoft shop!
Jerry: our database is not that simple I can tell you that :) All the people I've spoken to who had probs with sourcesafe, did use the tool wrong (very big databases, multi-checkouts per user, etc. etc.). Admitted, working with a lot of branches is hard in Sourcesafe, that's why we moved to subversion recently. Not because sourcesafe is a big piece of crap though, a thing I keep on hearing.
It's true, both the author of the book are part of the Nunit development team. Here is the site to the team if someone are interested. http://www.nunit.org/
Yep, that was one of the hottest searches on Google right after Comdex last year. MS says they're not going to release it, either. Too bad, I think it would give them some good pub.
Then there was the one at the 2000 PDC where Balmer was Dr. Evil and Gates was Austin Powers, followed by a "Real World - Redmond" segment where the duo were joined by Tom Brokaw and (was it) Leslie Stall and (IIRC) some other celebrity, all living together in Bill's house. I waited for the DVD set of the PDC that we ordered at priceline, only to be disappointed when they faded out from Bill's keynote, then just faded back in without the video. sigh.
Hey Rob. I'm stuck. How do I convert the scottgu snippet to vb? eg: public class OrderSystem { public List<Order> GetOrders() { List<Order> orders = new List<Order>(); orders.Add(new Order(123, "Dell")); orders.Add(new Order(345, "Toshiba")); orders.Add(new Order(567, "Compaq")); return orders; } } Any ideas?
Well, I'm not Rob, but . . . Public Class OrderSystem Public Function GetOrders() As List(Of Order) Dim _orders As New List(Of Order) _orders.Add(new Order(123, "Dell")) _orders.Add(new Order(345, "Toshiba")) _orders.Add(new Order(567, "Compaq")) Return _orders End Function End Class
Might the revitalized interest in MasterPages be due to this article? Creating Template-Driven Web Sites with MasterPages http://aspnet.4guysfromrolla.com/articles/040704-1.aspx ??? :-)
Ha ha :) No doubt some of it is Scott -- and thank you very much ! Of course, some may also be due to the now public nature of the Whidbey previews.
here is another recent and related article: http://www.devx.com/dotnet/Article/18011/0/page/1
ObjectsSpaces will not be added to Whidbey beta 1, however, it remains part of the Whidbey/Yukon wave and will be made available as a downloadable add-on pack for the .NET Framework version 2.0 shortly after Whidbey ships. This is confirmed by the ObjectSpaces team at Microsoft.
Agreed -- this has been confirmed multiple times in the last 10 days. Sorry I didn't update the reference to it being a rumor.
The 4GuysFromRolla article sure sparkled my interest...again. I've wanted to implement MasterPages for some time but never had the time. Hmm, thought it was more complicated that it was. Now when I had the time I wanted to see if I could learn some from it so I dissected the Microsoft sample, translated it into VB.NET, but still ended up using Pauls version. My trials are found here http://www.pdc.se/blog/DisplayEntry.aspx?eid=13 Anyway, thanks Paul for some great work.
Speaking of SourceGear's Vault product, what are peoples opinions of it? How well does it work in a remote development environment? Would you recomend switching to Vault, or waiting for MS to upgrade VSS? Thanks CT
We've been using Vault for the better part of a year now and love it. Working with it remotely is faster than SS ever was working across a LAN. Additionally, since SourceGear is a small ISV, they are able to respond quickly to their customers' needs. I have no idea what the future holds for SourceSafe so I can't say I would never go back. But, it would require a huge change before I would consider using it again.
I would recommend most anything over VSS right now. Will that change -- I hope so but I honestly don't know much else.
Congratulations - judging by the service you give the community - you'll have a rip roaring success on your hands
Congratulations. I've been independent for about 3 years and have no plans of going back to the daily grind. It's a great life as long as the pipeline is full and the bills are paid. :-) One bit of advice...get a good accountant. mike
Congratulations!!! One day, it'll be me. :)
Congrats, I have been doing it for 2 years and 6 days now; best decision I made!
Congrats. I have been doing it for 4 1/2 years and I hope I never have to be full time again.
Congrats! I made the switch last September and my only regret was not doing it sooner. Best of Luck!
Good deal Paul. I can totally relate to the atlanta traffic. I spend an hour and a half in it every day as well. (on a good day). I looked for you at DevDays last month in ATL, wanted to introduce myself. Oh well, always time for that some other day.
Congratulations! From what I've observed, I'm sure you will do very well. I came very close to going independent last fall when my contract with WebMD was coming to a close. Instead, I took a job with a very small company (I'm employee #4). I guess it's almost like being independent. The office is 1 hour away from where I live, on the other side of Nashville, TN. But, I get to work from home one day a week, which is very nice.
Congratulations! :) Working in/for your own company is much nicer than working for others :) I've my own company now for 7 years and I'll never ever go back :) As said before: get a good accountant. Another tip: never trust on 1 client. You're still a contractor, so if you can manage it, get another client. You wouldn't be the first who gets out of business as fast as getting in business because of the fact that their initial client goes out of busines, ends the contract etc. and they never paid attention to getting new clients.
Good going Paul. I was surprised you hadn't done it sooner. I also would like to reiterate what Frans said about a good accountant. A good one will cost you a few $ but will save you even more. -Mathew Nolton
Good news. I wish you all the best. I have my own software company for over 14 years now and I don't regret it. I hope, you'll be able to keep up the good work on WilsonOrMapper!
Take care. IRS has strong rules for Indepent Contract vs. Employer. It's better for you to have more that one client to be corp., otherwise you will be under hidden employment.
Great move Paul! I hope you will let us know from time to time how things are going. BTW, why an S-Corp and not an LLC?
Congrats! I can't wait for the day when I can make the same move!
Congrats, Paul. When I lived in Atlanta I enjoyed the heck out of riding Marta everyday to from Buckhead to Five Points station downtown. But hey, it still doesn't beat working for yourself. There's nothing like coding out of your home office!
Congrats, Paul!
Why an S-Corp? That's what my CPA and several other independent friends all recommended. It sounded like it had some serious tax advantages, although a little more overhead, but that's the CPA's job.
Congrats too Paul. I went "independent" back in 1987, so I know what you mean. I too immediately thought LLC as I've been advised against S-corp in the past. Curious why the specific benefits are to you on S-corp vs. LLC.
SqlConnection.Close() puts the connection back to the pool. You can reopen it later by using Open(). If you use SqlConnection.Dispose() it releases the ConnectionString, so you CAN'T open it again. That's the main difference.
Hi! Excellent fantastic work! You've made my day as I was experiencing with paging scripts but the only solution I came up with supporting DESC and filtering doesn't perform very well. I probably would have spend the next days coming up with something like yours. Thanks very much!
And congratulations once again. A lot of success and fun to you on your new course!
All this and you still have one week still to work at your "job".
Two weeks actually. :) The cool thing is that I only had to "integrate" the changes from others for this release, along with one bug fix. That's not necessarily always trivial, and in fact there was some work to do, but its really cool to not have had to do it all myself!
So do we get multiple inherits as well
No -- but neither does C#. Try Effiel for .NET if you need it.
Good to hear Paul, with the amount of work you shared with us you certainly deserve it!
Congrats - it's almost like being set free!
Do you think it's fair to post this on the main weblogs feed? I have enough junk to filter through without your classified ad. *sigh*
Post pictures! I'm not interested, but I'll ogle them for new ideas for my house due in December. :-)
Microsoft's improving. Usually they're 10 years late and 100 dollars short. Now they're only 1 year late and 10 dollars short.
The funny thing was that I was just investigating this because I was having the dickens of a time figuring out how to talk to the serial port with VB.NET 2003, which I now really regret shelling out $100 for. Best to wait and download the .NET 2.0 framework and write the code in C# entirely from friggin notepad.exe. Or better yet, use Mono/Java on Unix. MS doesn't piss me off nearly as much when I don't have to pay for their perpetually half-baked software.
AJ, it's a BLOG and ..... throwing water on my own flame. Moving on.
Generally a great tool, but I'm still finding it very hard to programmatically set my header titles at runtime from a code behind class, whilst everything else seems to work as advertised. If I try to use a Literal I find that it's .Text property is always empty - I assume that I'm sending it the title string too late(?) Are there any docs lying about that give a good example of this?
I can't say what you're doing wrong without seeing your code, but almost everyone one of my many examples show techniques to get your titles working, and there are multiple ways.
INSERT INTO TestIds VALUES (newid()) ?
*smack*, *mumble* read before reply *mumble*
INSERT INTO [TestIds] DEFAULT VALUES GO
Just wondering the purpose of the table... The Jeff
Thanks Darshan -- that works great for MS SQL. Now, is there a solution for Access also? And Jeff -- no real reason other than someone told me that my mapper didn't support it. :)
SET IDENTITY_INSERT TestIds ON INSERT INTO TestIds (TestId) VALUES (1) SET IDENTITY_INSERT TestIds OFF Should do the trick.
Sorry Scott, but I actually want the identity inserted if that wasn't clear -- I don't want to turn it off and insert an explicit number.
CREATE PROC usp_createID AS BEGIN INSERT INTO testids DEFAULT VALUES SELECT @@IDENTITY END GO EXEC usp_createID
OK thanks Jason. What if its an Access table?
Paul - for Access, chances are they're using an "AutoNumber" field for a primary key...this should work INSERT INTO TestIDs (TestId) SELECT MAX(TestID) + 1 AS IdValue FROM TestIDs Even though it's an AutoNumber it will still let you specify a value to insert...so you could always insert a value that's one higher than the greatest using Max()...not sure if that's ANSI compliant or not though.
Although SELECT @@IDENTITY does work for SQL Server, you should really use: SELECT SCOPE_IDENTITY() because @@IDENTITY does not work properly if you have certain types of triggers on your table.
The problem is that Access isn't really a database. That's why it can't do a lot of things you take for granted with real database engines.
Here's a way to do it -- classic ASP but the main idea is there. http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q221/9/31.ASP&NoWebContent=1
AJ: I agree with you that the main feed is polluted. Although, I like to read this kind of stuff sometimes, it should be filterable through categorization. My vote is in for the ".net related" category. Paul: congrats on the new house!
FWIW, as the guy who reported this issue, it's possible for an entity to only play 1:m relationship roles with other entities. In this case the entity would consist of the key and one or more collections. The case I reported was for type entity. A customer has a m:1 to it's type and it's type has a 1:m to all customers of that type. In this case the customer type played no other functional roles so the entity consisted of the key CustomerType and the collection Customers. jMM
So John, since you've came public :) I know in your case you seemed to indicate that the read-only option was sufficient, but I'm thinking I should cover all scenarios. Obviously it will work if the single field is not an identity, but I don't want to make it doable in MS SQL for this bizarre case, while still leaving it unsupported for Access. Yes, I still have no solution for Access, since the support doc didn't seem to apply that Jason posted. So right now I'm not going to try to resolve this scenario, although I'll change my mind if I can ever get the Access case to work -- what do you think ?
"And Jeff -- no real reason other than someone told me that my mapper didn't support it. :)" heh, sounds very familiar. :) These tables are not useful btw, in any scenario, as it is just a number, there is no data identified by the number. "A customer has a m:1 to it's type and it's type has a 1:m to all customers of that type. In this case the customer type played no other functional roles so the entity consisted of the key CustomerType and the collection Customers. " I wonder why you add the type at all. Perhaps a description field is appropriate, so you can specify which type a customer is :) (which will automatically solve your problem). Otherwise setting the type is problematic as the specification of the type is based on a number, but what that number means is vague.
Paul - what about the thing I posted for Access? It won't work?
In my senario the key was not an identity but rather a user defined value. Further there is no CustomerType table. The customer type entities are derived from the unique values of customer type in the customer table. Yes of course adding a functional description role to customer type resolves the issue by forcing the creation of the customer type table with at least two columns. But I think my senario is realistic and need it to be supported. It's possible that someone would want to control the possible values of customer type by forcing customer type into an independent table consisting of a single key column. While it's also possible for the key to be a surrogate key, given the difficulty in supporting this variation of the senario and it's unlikeliness, plus the fact that I would never need it :), I see no reason to support it. Whenever possible, I preserve any existing uniqueness constraints when introducing a surrogate key, which would introduce a functional role and resolve the issue. jMM
Is it just me or is anyone else severely confused by what John Miller is doing here and what Paul is saying he was asked to support? What point is there in having a key value if it doesn't point to anything?
Everyone: I can see the value of the single field that is user defined, and it looks like that's all John was really after anyhow, although I too can't really claim to fathom all of his statements. :) I wasn't trying to say someone (John in this case) had asked for me to support this specific case -- I was just saying someone had asked for something that was similar enough to make me realize I was not able to handle this case either. Like most of us, I then became too curious to forget it. :) I've actually seen people have a table with identities that they used to get a unique key for other tables without identities, kind of like sequences in Oracle, although I think those tables always had a second "junk" column too -- now I know why. Jason M.: There are actually 2 different Jasons posting things, so sorry that I just referred to Jason earlier. Your solution is certainly "doable" if that's the best Access can offer, although I was really hoping for something better I suppose. Afterall, even Access supports @@Identity, although that's not really going to work either in a situation with multiple inserts at the same time. So maybe I will use it, but I think I'm just leaning to saying why bother with this one.
To clarify for those having trouble fathoming my earlier posts <g,d&r> Given these requirements: Every Customer is identified by one distinct Id. Each Customer is assigned some Customer Type. Each Customer is assigned at most one Customer Type. Every Customer Type is identified by one distinct Code. Examples: Customer Acme is assigned Customer Type RENT. Customer Bender is assigned Customer Type SALE. Customer Carter is assigned Customer Type SALE. Customer Demble is assigned Customer Type RENT. These requirements can be implemented in a Customer table with a CustomerId column and a CustomerTypeCode column where Customer Id is unique. A business object representation of these requirements would consist of a Customer class with a Id property, and a CustomerType property which is a reference to a CustomerType object. The CustomerType class consists of a Code property and a collection of Customers. You could argue that the Customer class needs a CustomerTypeCode property, but I would argue that it's the persistence engine responsibility to populate foreign keys. But thats another thread. <s> There is no need for a ClientType table to meet these requirements. Also, the ClientType class has a structure that WORM currently cannot handle. A class with the key as the only property. jMM
Great stuff! I spent last couple of hours looking for something similar and I could see this proc working very well in my project. Thanks!
There's a nasty one associated with DataTable as well. ADO.NET will let you assign a text string to a GUID column of a DataTable, but then crashes with the casting error when you attempt to save it. I reported this under 1.0 and it came back "by design" - you do wonder who designs this stuff sometimes :-)
Cross server posting is an absolute essential for us to be able to fully take ASP.Net on board. Lack of the facility severely limits the amount of inter-application integration that we can do. Going into a .asp file to cross the border is rather ugly.
Congratulations! I hope to do the same someday...
Paul, You are really not talking about O/R mapping here but about any tool that allows you to map a relational database to .NET componentes. I mean, DeKlarit is not an O/R mapping in the strict technical sense and it has all the same advantages you described (and it does not have any of the shortcomings that Andrew Conrad described in his post ;).
Hey Andres: I agree 100% that what I said does not have to apply only to O/R Mappers. Sorry if it seemed that was the inference -- my point was to talk about O/R Mappers, not to imply they were the only choices. I also mostly agree with you that DeKlarit has the same benefits, as I noted in my review of it last year (see http://authors.aspalliance.com/paulwilson/articles/?id=18). That said, I do have some fears that DeKlarit forces too much "lockin", although I heartily recommend it in some cases. My personal opinion is that DeKlarit makes a great prototyping tool, but that a good O/R Mapper is much easier to use, with less lockin, in many cases. Thanks, Paul Wilson
>That said, I do have some fears that DeKlarit >forces too much "lockin", although I heartily >recommend it in some cases. My personal >opinion is that DeKlarit makes a great >prototyping tool, but that a good O/R Mapper >is much easier to use, with less lockin, in >many cases We can discuss about this another time... TechEd could be a good place ;) Regards
IMO the real answer inherent in the intrusiveness of OR Mappers is that they are a kludge. They are a product of the lack of market penetration of Object DB's and the lack of standardization of Object Query Languages. If we agree that we want to program in Objects, it follows that our data should be Objects.
Mike: That sounds good in theory, but its not real life. Why? Developers are the only ones that want objects -- the business wants data that can be queried any way they may want -- in other words relational data.
My ignorance is showing here, no doubt, but what kind of data cannot be represented as objects? We decided to adopt objects and your framework because dealing with data in C# was just too painful. And now though I'm waiting for Object Spaces, I can't help but think how nice it would be to get rid of the mapping between me and the information I want to represent.
I wasn't trying to say there was some data that could not be represented as objects if that's what it sounded like. I meant to say that business people could care less about objects -- they want to see and query data. Putting raw objects into a "database" is great for developers, but it makes query and reporting tools next to impossible, and most businesses need to get to the data outside of your applications and its definition of objects. True, OODB have mechanisms to get around this problem, but they tend to not work very well in real life -- its just shifting the object-relational mismatch somewhere else, and to a place that is far worse far business users. There is a reason OODBs haven't been successes -- they solve developer needs while leaving business needs worse than RDMSs do.
Thanks for the clarification Paul.
Why not to save property info object for any BusinessEntity in shared hashtable and retrieve it from there when ever we need to set the value for any property through reflection.
As Steve noted, and I verified, most of the performance hit occurs when actually "using" reflection, regardless of whether or not the reflection "object" was reused or not. I actually do reuse the reflection "objects" to get the small amount of efficiency this provides, but its simply not at all the same as direct access, so I must recommend the interface approach when performance is really needed.
What, no more Citrix!? After chatting with you at the Summit I had gotten to wondering what happened; glad to hear it is working out well for you. Congratulations on your bold step, I'm sure you won't be sorry!!
Paul can you clarify what you mean by 'Another feature of O/R Mappers is greater flexibility in your search and sort functionality'? I would say that exactly the opposite is true for me. The search capabilities to retrieve focused content that may not exactly map your object schema defined (think lookups and lists with only a couple of display fields) or bring back denormalized results in RDBMS code is pretty tough to map to an OR mapper. You can do this, but at what performance and complexity penalty?
Yes Paul, you are right, I tested that and there is a small performance gain you get, but during the test, I found one interesting thing that if you set private member through reflection it takes a lot more then setting public member, any idea why it is so?
Yes that was also noted in earlier results by Steve -- I believe security was suggested as the reason since you have additional security checks to see if you can reflect on private members.
Well I was assuming a comparison to a stored proc based system, and in that case you can only search and sort on what has been exposed through your stored procs. So the gain in flexibility would be true for any dynamic sql based system, not just O/R mappers.
I think the syntax is just fine.
Question for you Paul and anyone else who has the knowledge. I like many of you have the dream of going independent soon. One of my main concerns is health insurance. If you work for yourself and don't have any employees under you, how/where do you get your health insurance? Regardless, it is expensive as heck, right? If anyone has any tips and can either post them here or email me at rhino200 @comcast.net (no space), I'd appreciate it. thanks
I'm getting my through my wife -- at least for now.
Paul, I think your new and improved MasterPages implementation is fantastic, but I still have some reservations about performance. I've compared the new MasterPages approach with your page templating examples (using both direct render and user controls) and found that there general "slugish" feel to how pages load when using MasterPages. Looking at the trace output, the MasterPages approach is about 2-2.5 times slower than your other templating techniques. The aspx pages just don't have the same snappy feel with MasterPages. I was just wondering what your thoughts were on that? Thanks again for your work on this.
Hi James: There's no doubt it is "slower", although everything is relative to some degree. The direct render approach is definitely the "fastest" possible, since it totally avoids the performance "hit" of server controls, but it also offers the least design experience. The user control technique is a little faster than master pages since it doesn't have to rearrange the control tree, but it still lacks some flexibility that master pages provides. So the question really comes down to what is the performance "hit"? If you only compare the simplest of pages with the simplest of templates then the user control approach is about 30% slower and I think I recall master pages was about 60% slower. But that's not the whole picture at all -- there is typically much more going on then the simplest cases. I've found through experience that the performance "hit" on real-world pages, especially when there are things like database connections, is actually pretty neglible. Also, as a final comparison, even the simplest 60% slower master page is still faster than the equivalent classic ASP page since ASP.NET is compiled! So yes, master pages are "slower", but I haven't found it to be a concern when you look at the bigger picture -- and I believe my website proves it since it runs on master pages. In the end though, you have to do the tests and decide for yourself. Thanks, Paul Wilson
I have VS 2003
yukon's first casestudy http://dotnetjunkies.com/WebLog/stefandemetz/archive/2004/05/07/13091.aspx
Wouldnt it be less costly to check for this on your login page?
The point is that I do NOT want to be redirected back to the login page. Now you could have your login page dynamically change from being a login page to a page that tells the user they aren't authorized, if that's what you mean -- but that's not really the behavior I want.
More alluding to the fact that you could check at the load of the login page to determine if the user is authed and if so then transfer them to the appropriate 'you got no access' page. In this case you are only using cylces for this logic in the case that your user happens to actually come across a page while having insufficient credentials, whereas in the GASA event you run the logic for every single request.
OK, I'll buy that. It does also simplify the logic: if (this.Request.IsAuthenticated) { this.Response.Redirect("~/Login/Unauthorized.aspx"); }
I've run into this problem before and couldn't find a built in solution so I placed the authorization logic in a base page while having asp.net responsible for authentication. The inheriting page overrides an abstract method that returns the allowed roles. Not the best solution since an access change requires a recompile but in most apps I've come across this isn't often. Hopefully this will be addressed in asp.net 2.0
Hi, I can't seem to get this to work, I believe my problem is I don't have a control named <control id>_Template on my page Could you email me if you have a solution to this? gabrielhesse @ hotmail.com
I don't think you can blame MS on this one, but the IETF: Quote from RFC2821: To promote interoperability and consistent with long-standing guidance about conservative use of the DNS in naming and applications (e.g., see section 2.3.1 of the base DNS document, RFC1035 [22]), characters outside the set of alphas, digits, and hyphen MUST NOT appear in domain name labels for SMTP clients or servers. In particular, the underscore character is not permitted. SMTP servers that receive a command in which invalid character codes have been employed, and for which there are no other reasons for rejection, MUST reject that command with a 501 response. This probably also should be true for all DNS names. My guess is that MS conformed to this standard. Reinhard
Turn on tracing to see what you can "find" -- it will be the master, not one of the regions.
Diogenes Revisited: Looking for an Honest Data Reporting Solution
Paul, Actually doing the odd things is where you find where the best laid plans of mice and men fail. Sounds like an interesting project and client. My current client is like that also. He gives me just enough rope to hang myself sometimes, which gives me a chance to try alot of things. Maybe he just likes to watch me dangle a little. Paul
Dude you have such a nice place! I envy the appearant quality of life you guys have. If I wanted something similar I'd have to drive an hour to work - or pay 800K +
I enjoy hearing about what you're doing with the O/R mapper, robust business layer, hashed password, and so on in a working environment. Thanks for the update.
Beware of NOLOCK - it generally turns out to not be nearly as good of an idea as it initially appears. If you find that your large queries are causing lots of contention (because readers block writers, in a lock-based DBMS like SQL Server), the typical SQL Server solution is to set up log shipping to a second database, and run your large queries there instead.
Cool work. :)
I've faced the same situation, but the solution you provide is not working in all cases. Let's say you want to add a link "Connect using another login" to the Login page on the "Unauthorized" page. In that case, IsAuthenticated is always true, and that prevents the access to the Login page to reconnect. Unless your link performs a postback and signs out. What I ended with is the following: - In web.config, the loginUrl is the Unautorized page. - The user gets redirected to that page when he tries to access a page without being authenticated AND when he tries to access a page without the right permission. - The Unauthorized page has to links : "Go back" and "Connect using another login". - If the user accesses the application through the Login.aspx URL, he doesn't see the Unauthorized page. Of course, if he tries to access another page without being authenticated, he will see the Unauthorized page. Let's hope the ASP.NET team cooked something better for the next version!
Excellent comments Fabrice. Thanks.
Not sure I understand this. where is the logic to decide which template.ascx is used? for example, if I have a button on the DefaulTemplate.ascx which i want to click to switch templates of _any_ page (e.g. to view the same page using PrintableTemplate.ascx), am i supposed to make this switch somewhere between the buttonclick and the Init event? so where do i override the AddParsedSubObject method? in the DefaulTemplate.ascx codebehind? or on each page?
You override the AddParsedSubObject method of the page, or a common base page to do it for an entire site. As to the logic, that's up to you, as everyone's will be different, but you do need to realize that you cannot do it in an event. Why? Because they all occur too late in the page lifecycle, and you need to do this even before the Init method/event in the AddParsedSubObject method. Sound impossible? Not if you recall your classic ASP, where you used the Request collections, like Form or QueryString, since you can easily check those values as early as you want. For instance, on my site, I have a drop-down that has an auto-postback, but I don't handle it in the changed event since that is too late -- instead I look for the appropriate Request.Form["xxx"] value.
That page is entirely too depressing to ever think about again.
The only thing more depressing is the fact that I have 12,401 more days. Not that I wish I was older - I just wish that day was sooner.
Woo hoo! Only 6,118 more days! I get to retire at 40, right?
got it! i am using a linkbutton server control, then looking for its ID in the Request.Form["__EVENTARGET"] field, and makeing the switch that way. thanks for your help!
If we get to complain about Source Safe here, how come Shadow Folders dont update when you check in using VS.NET only when you manually check in using Source Safe itself?? JB
I've noted that as well. My site, <a href="http://www.safebitsolutions.com">Safebit Soltuions</a> is also suffering from similar issues. I've taken off my ASP articles to re do the site.
Speaking of your ORMapper, would you ever consider putting up some kind of un-moderated forum on your site so that other users could help each other with issues that come up from time to time?
The problem is that I would get lots of spam if I just allowed any post through. Maybe I can change it in the future to allow logged in subscribers to automatically be approved. How does that sound?
I don't know the reason yet, but I also had a similar issue, and I fixed it by running WWW service in IIS 5.0 isolation mode.
Maybe some changed the ACLs on the web.config? - After you replaced it by a web.config from a different web everything was working fine again, so if the contents of the original web.config were similar or even identical to the other one AND you did not change the IIS settings, it may well be the file rights?
Oh, and what about impersonation? - Do you use it in one of the web.configs or do you use the standard ASPNET user?
I'm afraid I don't have any answers either, but I ran into a similar situation last year, which I solved in the same way (http://www.coolbits.nu/Code+Poet/Cool+Tips/83.aspx). I'll be interested in learning the magic combination of settings that causes this problem, if anyone ever figures it out.
As far as I could tell all the permissions (acls) were the same, and there is no impersonation.
Are you using accounts for which the passwords have been automatically expired?
No, and I'm not using any Windows auth anyhow.
Has Service Pack 4 for Windows 2000 been installed. MS have added a new security role and it's turned off by default. We had to change a few things. They were mostly dev servers set are incorrectly.
great!
Paul or Robert W, do you guys have a more verbose example of the dynamic masters implementation?
I'm not very good at verbose, but I've got a silly example (not very real-world) in the article download noted above on MSDN (the download has both a v2.0 and a v1.* example). Other than that, my site is of course a fully working real-world demo, and I think all of the pertinent code is actually in the free section, in the template directory.
well, i think i'm having the same problem as robert w had. where in my code do i make the template "switch"? i have a base MasterPage class defined with the override AddParsedSubObject method per your implementation. i'm still confused though where do i listen for request and how do i change the TemplateFile of the Template control. could you post a little snippet? i looked though your msdn whidbey example and still couldn't make sense.
The AddParsedSubObject method must go in your page classes, or a common base page -- not in your master template. As for how do you make the switch, something like the following would work if you have a drop-down or cookie that has a client id of master: protected override void AddParsedSubObject(object obj) { base.AddParsedSubObject(obj); if (obj is MasterPage) { if (Request["master"] == "alt") { ((MasterPage) obj).TemplateFile = "~/AltTemplate.ascx"; } else { ((MasterPage) obj).TemplateFile = "~/MainTemplate.ascx"; } } }
Is it still for sale? How much? pdubda@yahoo.com
Craig's reason for complaining about links is actually a design flaw of Wiki, not a problem with links themselves. Wiki's problems with spiders such as google can be solved with a robots.txt file or a META tag. However, then the page won't get indexed by google. Thus, Wiki's design flaw.
Not all robots respect robots.txt or the META tags. I agree that it's a design flaw of the site, though, which is why we changed the rollback feature to be a button. There are, of course, other ways to handle it, but in general one should assume that any link on the page can and will be visited by something other than a human.
I totally agree, Paul... i hate seeing code that postsback only to response.redirect immediately... seems horribly inefficient...
A reader asked by email for clarification: I don't know if "race condition" is a good description, but I went with that term since that was what Eron called it. Here's what Eron says in his comments: Postbacks within DataGrids do not exhibit the race condition if ViewState is enabled and the DataKeys collection is used. Another solution is to persist the DataKeys collection outside of the DataGrid control itself; in that way ViewState can be disabled for the grid as a whole but the keys are tracked. I couldn't say it any better. Basically, if you disable viewstate, which is common on grids since the viewstate is so large, then things can get out of sync if data is changing. The postback simply says to do something (approve or delete or whatever) a certain item in the grid by its position -- and that position may not be the same if the data has to be requeried! I've actually even deleted the wrong post in the forums because of this. As Eron noted, there are other solutions, although most people either have very large viewstates with grids, or disable it and potentially get things out of sync.
Frans, you call it "using the tool wrong", the rest of the world calls it "big databases, multiple-users, decent branching support are all features that any source control product should handle gracefully."
how do you get it? that link was bad and it didnt say anythink on the microsoft website.
It was an offer that long ago expired -- it was about VS.NET 2003 -- and its 2004 now.
Show how small/middle companies realy work: What Source Control? How many DB (Testing DB, Production DB, Stage DB)? What Quality Assurance?
I can relate to all of that except for the source control part -- afterall VSS (Visual SourceSafe) is free even if it isn't great.
Is this available on the Compact Framework??
I honestly have no clue, and since we're talking about a product not even in beta yet I'm also not sure its really possible to know yet anyhow. It would makes sense though!
The IDisposable pattern has left it open for class library designers whether to have an alternately named method or simply have Dispose. If the design warrants a domain-specific method name (i.e. Close for streams), the intent than is to explicitly implement the interface so that not both Dispose and Close are available when viewed as the object's type. If casted to IDisposable, than Dispose becomes available. In the case of the SqlConnection class, the designers did not follow that guideline, but made both Close and Dispose available with slight differences in behavior. Although, I recognize the goal was to allow reopening the connection, it has actually led to far more confusion than reaping the benefits, IMO. Add to it that earlier MSDN documentations incorrectly stated that Dispose did not return the connection to the pool, it has been difficult to get developers to switch to the using/IDisposable temporary resource pattern with connections.
A bit off-topic, but I've found quite a serious lack of reviews for ORM tools for .NET on the web. At the rate they are appearing today, evaluating all of them would be a mission even Tom Cruise would hesitate to take on. Has anyone read a decent review that looks at the pros and cons of the good ORM Tools for .NET?
We've had quite a few discussions about O/R mappers for .NET, some that were "reviews" of certain products, on the ASP.NET forums in the architecture topic. I myself have the decently popular WilsonORMapper (http://www.ORMapper.net) now, so I try not to make too many comments, but I still highly recommend EntityBroker and LLBLGen Pro if you need more advanced features than my simple mapper offers.
A lot of people are coming to this site searching for .NET Serial communications on Google. And while Paul Wilson made it known that System.IO.Ports.SerialPort will arrive in .NET Framework 2.0, that fact is not really useful to you if...
Anybody figured out how to specify the physical location of your web site when the MSI is installing into IIS?
Actually, IMHO, it is the SQL standard committee create this whole mass. The purpose of the SQL standardization is originate on the hope that there is a 'standard' way of the "Structure Query Language" which can be used across all kind of the backend. Granted that using a AutoIncrement number/ timestamp is a bad practice of the "good" database design -- but everyone use it. It bother me that when the SQL committee keep on ignore of the actual usage of the database and add their "value" into the standardization process. When they leave out this section on the standard SQL lanuage --- guess what, all database provider do just their own stuff. All different identity method have on MSSQL, ACCESS, ORACLE, MYSQL, FoxPro, DB2.. all have different meaning and functionality --- the tools writer just get caught in between. As to why identity column is bad database design -- just don't scale to well, image that for a big database table, your costomer just constantly add 2 records then delete 2 records. (Guss what, the two deleted records identity number can't be reclaimed becuause there is no guarantee if it is used or not when on multiuser secnario.) The similiar problem go to timestamp, it just doen't scall well. When you have multiple records open on the multiple layer of transaction (if it is supported), does the timestamp should be the time you first create on that connection or when you commit the transition. or there it two transitions affect two different row on the same table which happen to be occur on the same time. Do yo get two record on this table with the exact the same timestamp? How does a database guarantee the time stamp across the time of transition commited? etc... Yea, it work great for the trivial case when you don't consider Y2K similiar secnarios(as the same assumption was made for Y2K problem-- they assume that all those old programs by the time we hit this problme, they would already been fixed, right? --- Not) Ming
So how did the dinner go?
It was a very enjoyable dinner. I don't know the official count, but it was probably about 20 people. The downside was there were no women. :( It was nice to see some folk again, and it was also nice to meet and chat with some new folks. I won't even attempt to name any names since I'll miss more than I would get right. Of course, I'm a homebody, so I was probably one of the first to leave.
Haha. Tech based dinners rarely attract the women folk. I'm going to be in the ATL later this year, and if you have another geek dinner around that time, I'll stop by. I ain't a girl, so it's another sausage to the count, but I can drag the girls I know there along.. or at least try.
Sorry I missed it - I was home with the childrens.
Amen
No kidding. Let's get back to things we all (or at least me) really care about.
They all did the same thing with the Orkrap invitations a while back. Enough already. We get it, you're all sheep. Baaaaaaaaaaaaaaaack to tech talk!
Gmail kicks ass. I can't believe a MS follower would call somebody else a sheep.....
who's talking about gmail?
Gmail may indeed "kick ass", but I don't see how more than a couple of posts bragging about how many more free email accounts someone has acquired can really be justified. And while MS makes my life easier and enables me to make a good living, I'm certainly not a sheepish MS follower! See http://weblogs.asp.net/pwilson/archive/2003/10/29/34597.aspx for one example in these blogs, and see my resume at http://paul.wilsondotnet.com to see my background with Oracle, Sybase, Delphi, etc. So please don't assume that someone making a living with MS tools is simply a sheepish MS follower -- if my next client that paid the bills asked me to work with Linux/Java/MySql/PhP then I wouldn't hesitate even for a moment.
Its classic BlogCycle. Last month it was MVP this, MVP that.
Well, honestly, I can't even get into my gmail. It's borky and buggy to say the least, and I've submitted well over 10 bugs they have. I think they're kicking me out because I'm actually giving them negative feedback.
i do da*mit.... no...not really but someone had to be a contrarian.
Have fun, and don't forget sunscreen
it is good
I'd vote for Active Reports. I worked with their AR2 and .Net version and both won my heart indeed. The only thing I don't like much is the Excel output.
This isn't always true. Is it? If I have an application that allocated several medium sized (2KB to 10KB) sized objects for some time causing over 100MB of heap memory to be allocated,' and then released them all and went into a suspended state because there was no more "work to be done, I would expect GC to release most of the managed heap back to the system. I would be interested in knowing what kind of triggers can cause unused memory from managed heap to be returned to the OS.
While the GC "might" release it back to the OS, it appears that it only does this in certain situations, like a very limited amount of free memory available to the OS, or minimizing an app. There may very well be other triggers, but it appears you can't really expect the GC to just un-reserve its memory for no reason.
select max(TestId)+1 into tempTable from TestIds insert into TestIds (TestId) select expr1000 from tempTable
I am not sure why everyone seems to be oblivious about ORMappers and are only focusing on ObjectSpaces. As a working developer I am grateful for "gurus" like you who have provided code and solutions for such tools for 1.*. It is frustrating to realize 1.* is pretty much forgotten by many of the "gurus" out there. I am always looking for the proper tools to get the job done efficiently and it seems that the current answer is...wait for 2.0.
Lazycoder weblog » Where have all the gurus gone?
Paul, I'm glad to know I'm not the only one "turned off" by all the 2.0, Whidbey, and Longhorn stuff. I subscribe to a lot of "guru's" RSS feeds, and I'll tell you that I am tired of reading about all the great new stuff coming. I am an everyday developer of ASP and ASP.NET - I don't have time to play with RC's and Beta's and Tech Previews. Of course I like to stay abreast of future trends, but I need to read about stuff that helps me here and now. I need to know tips and tricks for how to do the things that I want to do now - not 18 months from now when I finally can get my hands on the "new" stuff. It's gotten to the point that 75% of the blog posts that get pulled into my News Gator are about ASP.NET 2.0 and Whidbey. For about 2 weeks now I've just been deleting them before I even read them.
I agree. I went through the Beta ASP.Net Forums 2.0 pretty thoroughly (written in 1.1) and you can see most of these "great features" that whidbey will bring implemented and working. I've since adopted most of these features for two key reasons: [a] hopefully quicker adoption of whidbey in my applications [b] some of these features are must-haves A couple examples in addition to the ones already mentioned: - Provider model (in fairness, there was a article on msdn about how to do this in the 1.x framework) - Themes - Strongly-typed and non-embedded resource files (this was a huge "must have" for us, and we definetly weren't waiting around for the fix) - Death'o codebehind (not as elogant as partial classes, but alteast it gets us in the right mindset) -strongly typed configuration files. If any of this sounds interesting, I'd strongly encourage that anyone look at the beta forums. Karl
http://weblogs.asp.net/rchartier/archive/2004/04/30/124044.aspx
Don't hate the players, hate the game. I'm out, yo.
Has anybody tried this for tables with a few million rows yet? Thanks.
I actually just got done reading http://codeproject.com/aspnet/paginglarge.asp -- and I may switch what I use. I've never heard any complaints, but it does look like there are better solutions.
Naw, I agree with some of the whidbey articles out there. It seems like everyone wants to be important, but I don't see them taking their time in their foundation before putting up the billboards.
We have a WinForm application running on a Citrix that is having an interesting problem. We are having a problem where the application hangs after a period of time and the application throws a "unhandled exception error". It seems to be coming from the 3rd party Grid that we purchased. Does this sound similar to your memory leak issue?
Sounds very similar. However, I don't remember how much this post was updated, but we eventually found our issues to be much bigger (if not entirely) elsewhere. I know these other leaks were noted in my blog, but maybe not in this post. This isn't to say there wasn't a problem in the grid, but the problem only surfaced in reality when there were already other memory pressures in the first place. Once we got those more under control, then we never had another grid problem. We still couldn't put too many people on the same Citrix box, but that was due to the very bad business requirements of giving users ALL the data they wanted.
Lazycoder weblog » AUIML by IBM Alphaworks
I wrote a UI mapper in ASP, which generated XSLT (and applied the transform client-side or server-side) (we used SqlXml), and whilst it worked very well, the hardest thing was form layout. PITA. Probably easier now that I understand CSS. I must admit to thinking that ASP.NET kind of makes it unnecessary in a lot of cases. Building a form/grid isn't too tricky now (as it could be with ASP).
Another little "feature" that gurus forget to mention is that Edit & Continue in Whidbey will only work for WinForm apps. So ano E&C in ASP.NET
<i> I've got my own in beta now -- what would you like to see in order to make it truly worthwhile?</i> I'd like to see it work in a production environment. ;)
I'd love to see this.
I'd like to see it based around the Observer pattern, personally - I've found that using the MVC pattern with the observer pattern works REALLY well..... tho I guess all of these could be used together..... :)
I am curious how this will compare to the User Interface Process Application Block (http://www.gotdotnet.com/Community/Workspaces/Workspace.aspx?id=0af2b0ef-b049-401a-a2f2-f55a070c1572) from the Patterns and Practices group. We are currently evaluating some expensive GUI tools for doing this typoe of mapping more easilly (BizTalk, Teamplate, K2 Workflow). If you could list a comparison between the UI Block and your UI Mapper then I might have more suggestions.
I think it is great idea. It's another must have part of truly solid framework(like o/r mapper). The big question is does asp.net 2.0 with ObjectDataSource and Grid/Form View with two-way databindings eliminates this need?
Well, I would say that this sounds like a very waterdowned version of XAML. The alternative, what you are trying to achieve is to have two providers for the rendering of the UI file: one for ASP.NET applications and one for Windows Forms.
http://www.projcomplete.com/PCI_WebUi/Pages/Default.aspx
there is definately a need for ui mappers. i'm looking for one since late 2002. i then discovered http://www.alphora.com and later then http://www.dotnetbuilders.com . But I think the problem with all these tools is the integration in a existing enviroment/framework. so an o/r mapper with ui mapping in mind would be really great because you'll have a lot of flexibility and RAD... for me an ui mapper is the missing for real RAD (RRAD ;-)) i was so desparated that i developed one but only for ms access at the moment...
UI Mapper: Meta-data driven, enables personalization and localization, avoid boring data-hookup, ultimate reuse ASP.NET Designer: Total control of layout, but requires lots of boring data-hookup code, and little to no reuse ASP.NET v2.0: Many enhancements make easier, but not revolutionary changes, so still need code and little reuse UIP AB: Concerned with navigation, not layout of individual list/edit screens, same for other workflow engines XAML: XAML is like ASP.NET markup for Windows, and still requires boring data-hookup code, and very little reuse WebMaestro: Appears to be just another template/skinning system, no list/edit screens, nor any data integration
To Phil: I got an email from a Phil in Switzerland, but I was not able to reply to the email address -- so maybe you can send me another email address instead. Thanks, Paul Wilson
Hi Paul, first of all, I like the idea especially if it will be executed in the same excellent way as your O/R mapper; and I have no doubt that you'll manage to do that. There are a couple of tools out there that produce the full cycle (mapping, interface, business logic), so the idea is not that new. While I dislike code generators for O/R mappers, I would prefer them for a U/I generator. The reason is that I don't want go deep inside the code of the DAL as for me the whole purpose of having such a tool in the first place is that I do not have to do that in the first place. With U/I mappers it is different. I see them more as starting points to get results quickly, but it is quite clear from the very beginning that I will need to do extensive changes. Why? - As with race cars, I will buy the engine (DAL) and build or tweak the chassis ;) - A couple of examples: sometimes I may need to use a certain special UI part such as WebGrid.NET or ComponentArt's treeview. I don't expect a U/I helper tool to know everything about all these tools, so I really need source code here in contrast to the DAL (where is it ok to have 'hooks' just in case you need to do something special). So, the tool should supply simple pages as you suggest, use a master page/template approach, concentrating on CSS, preferably work in conjunction with your O/R mapper and should produce source code, so that I can tweak it if I need to. Best regards, Marc
I wnat to second marc's opinion. I would love to see some work done in this area, but I do Nnot think it would be applicable. See, UI is design, and design needs to look good. And is something we will never be able automate. Most generated UI's look like some dumpass without a clue in design worked on it. Personally I think a limited use set of objects along the line of "make it easier to make standard ui's", together with IDE integrated wizards (coming with Whidbey) are a better approach. But I would be more than glad to see myself prooven wrong.
The main thing would be performance I think. I can generate list and edit usercontrols very easily using generation. The benefit with using a template generation (shameless plug of CodeSmith) is that I control the implementation and the style of the code. I think using a UI Mapper would negatively affect performance, but I am open to the idea I suppose.
I totally agree that a UI code generator may be the way to go for many cases -- I think it depends on how much control you need (code generator) vs. how much flexibility you need (meta-data driven). I also don't think there are many applications where you can get away with ALL of your screens dynamically created off of meta-data, but I do think many (if not most) apps have a lot of boring admin-type screens that could be based on meta-data. I think those are usually easy to create with the typical UI controls, and I do want to have some type of hooks for custom controls also, although you're right it may never be able to incorporate all the advanced features of those, but will those really apply to the simple cases. Anyhow, I think UI code gen is better than manual tinkering in most cases, if you can't go the meta-data approach, so I hear you -- and I heartily recommend CodeSmith for code generation and have no intention of competing with it. BTW, I doubt I'll ever prove Thomas wrong. :) But I do know that many have communicated with me wanting something along the lines of what I'm describing as a UI Mapper.
Me and my team researched O/R UI Mappers for one of our projects and we are now testing a solution from Modularis. Do any of you have experience with this product?
Performance -- My initial data suggests that my list is at least no worse than using a datagrid, and probably better actually. Why? The datagrid (and 3rd party ones only get worse) is very very heavy, and creates a heck of a lot of controls. My ASP.NET list is just an html table that is rendered much more efficiently, and my mappings are cached. The edit "control" does perform slightly less, but its a fraction of a second that is insignificant to me, just like any list gain I have is insignificant to me. In other words, there are some tiny performance gains (list) or losses (edit), but they are miniscule when compared with working your database and sending the response to the client, so . . . Anyhow, I have nothing against code generation, and heartily recommend CodeSmith for it, if you need complete control, as opposed to additional flexibility driven by meta-data. Modularis -- never heard of it, but looks interesting if you are going down the code generation path -- but make sure you look at what it generates and hopefully you will also be able to modify the templates it uses. DeKlarit is also a very good tool if you want to code gen an entire app, but I would personally use CodeSmith if I wanted to code gen since it gives you complete control -- I have used DeKlarit though as an excellent RAD prototyper.
I actually wrote something very similar. I had my business classes that implemented a fairly standard intereface. I then added a few attributes that controlled how they were displayed. The attributes could be applied either on the original class or on any class that inherits it. (For my purposes, I usually created a class that inherited my original class, and called it View). So for example, my code would look like this: public class Data { // fields } [Exposed(true)] [ExpectRole(Members.Editors] public class DataView { [Validators(NotNull)] [ReadOnly(false)] public string Field { //... } } Anyways, I expanded out the library a bit, and I have used it for several clients.
Paul, Have you read Kathleen Dollard book on Code Generation in .NET? It is exactly what she tries to provide with XSLT trasformation. It is a wonderful read: http://www.amazon.com/exec/obidos/tg/detail/-/1590591372/ref=olp_product_details/102-8629871-1928918?%5Fencoding=UTF8 Maxim [www.ipattern.com do you?]
Paul, Agree with what you said, but I have to give credit to authors such as dino esposito for the recent of making the same feature enabled in .net 1.x version and demostrating it in v2.0. By the same token, I would like to say that I am sick and tired of "community leaders" feeding me the fish. I want them to teach me how to fish! My two cents, Maxim [www.ipattern.com do you?]
I've written both an O/R mapper and UI Mapper using CodeSmith templates. We use it at the company for which I work to generate business objects and simple list/edit views on those objects. The UI Mapper is only a decent headstart though. It's not configurable and only emits text boxes for input fields and no validators. It also only targets web forms. It only takes a few minutes to change certain text boxes to drop down lists if needed, and add validation. It's definitely something worthwhile creating. An xml-based UI Mapper with all the features that you mentioned would be awsome. I've never looked into a third party option.
I've seen good things about Kathleen's book, and I know she's a great speaker personally, but I haven't really followed her code gen stuff. I'm just not a big fan of the XSLT style -- not to say its bad or flawed -- its just not my style so I haven't bothered with it. CodeSmith works great for my code gen needs already, and I don't have many needs with my mappers. :) I do think its great that she and others have really tried to push code gen though, since I do think code gen and/or mappers are preferable in most cases.
XAML, XUL, databinding, etc... are showing a strong shift to more loosely coupled UIs. I agree with you Paul that there is room for another layer of abstraction that compliments this shift quite nicely. Thinking of a layer just a bit higher than html, for example, <TextBlock> <Heading/> <Text/> <Image> <Subtitle> <Image> <Text/> </TextBlock> In this case there is no formatting...just good ole contextual XML. A TextBlock control would dictate fonts, spacing, color, etc... A lot can be done with XSLT, but with a Java/Flash/.Net control you could include some rich behavior as well...such as images fading in, Editable grids, or whatever. Think of defining your pages in the above markup. You can then spit it out into whatever technology you built a component set for. The more repetitive and similar your Views are the more beneficial this technique would be to you. -andy
I think that like O/R mapper which doesn't create database, UI mapper doesn't need to create UI either. It must <b>MAP</b> between businness entity ant UI, handle security issues like hide buttons, grids, and so on, may be validation. Still the problem is: how to do it with 3-party controls?
Let me start with saying that I don’t disagree with you, but here are some of my opinions. “Community leaders” is an interesting choice for the title. What is a community leader and how have they become community leaders? By community in this sense I am assuming you are talking in a general sense, which means that one is a leader for the entire group (the world). This does not refer to a leader that actually goes out into the community. If these leaders are actually leaders they would be looking forward for us and not telling us to rewrite the code ourselves. Most of us today have been complaining about the fact the large articles don’t talk about how to program for today. I think that is not true. Maybe some of us haven’t been reading Dino Esposito's cutting edge articles that tell you how to do .NET 2.0 work today in .NET 1.1. My feeling is that what you are saying is that the community leaders should get out and understand the community. I agree with you 100%, but my feeling is that you are saying that the community leaders should lead us forward as well as tell us what we missed already. I don’t really think that a leader or guru should tell you how to implement your own SQL cache dependency if you can wait for .NET 2.0. The last time I saw an MVP (community leader) at a user group it was to sell me training. I am not saying that MVP’s aren’t busy, but let’s not complain that guru’s don’t have time if MVP’s don’t have time to do everything also. Case and point: Where you and I are from, we have community leaders and those leaders usually don’t attend community events. (Please don’t take this as I am attacking anyone I am just stating my feelings)
I totally agree that Dino has been a pleasant exception. And I agree that's sad if the only times you see an MVP is to sell you something. I don't typically attend user groups, but I make it to other events, and I try to do the dinners and things.
Paul, Where was this idea 6 months ago when I started toying with the idea?! I have been working on this concept myself for about 6 months. Now I don’t have the skills that you have and this is why I am not 100% done but I am almost there. I started looking at different O/R mappers about 6 months ago, the main ones I locked at where Olymars and LLBLGen Pro. Olymars is cool as it also generates lots of controls and GUI objects for you….but I did not want to use stored procedures. Using LLBLGenPro was the best solution for me as it uses dynamic SQL. I am writing reporting apps and did not want to create Procs on my servers. Anyhow the approach I took is a follows. 1. Create LLBLGen Pro Project . The new version of LLBLGen Pro supports custom properties. I store custom properties in the project file and these are used in step two. Generate code using adapter config this will generate 2 projects. a. DatabaseGeneric b. Database Specific 2. I have a template set that runs in codesmith. I create a custom property browser that will open the LLBLGen project file. I run the master template set and the following projects are created. a. BL – Business Layer Project b. WebControls – For each entity I create a custom dropdown, datagrid and repeater c. WebApplcation – Creates web forms and web form lists for each entity Bert email if ya want 7fgi-waja@spamex.com
I think you hit it on the head Anatoly. The mapper vs generator is a key point.
you are on the right track. i did a bit of this with a template{x} product i wrote (http://www.cybral.com/solutions/templatex.htm) and people were always asking for the UI piece...plus it demos much better to senior managers and above. O/R Mappers are typically too abstract for management where a nice wsiwyg does well for the "abstract-challenged" ;) -Mathew Nolton
Hello Paul, I work for a firm that is also currently trying to deploy a .net application on Citrix. I was wondering if it would be possible to give even a ballpark of the kind of hardware that you were running citrix/.net app on? The reason this is of interest is our numbers are not much better than you have described here, getting about 15-20 users per citrix box (.net app + citrix). In our case the average Citrix box has a single 3.0 GHz CPU and 2GB of RAM. Any feeback would be a huge help! thanks! Raif
Our boxes were dual-processor with 4 GB RAM -- I don't know the CPU specs. Keep in mind our biggest problem was the very bad business requirements to allow unlimited number of records in a rich grid control with too many other features to count. I honestly believe a better set of requirements would have yielded more users per box, although I also am not convinced it would ever get the 50+ users that were common with Access and other non-.NET apps!
Thanks for the feedback Paul! We have exactly the same issue here, as our client wants complete sets of data in the grids (no record limits). So we end up in some cases with very large memory requirements to load in all that data, just so they can get the same rich grid controls that you are likely describing. I am also convinced based on our observations that 50 users would be an amazing feat for a .net application via Citrix. At least an application that loads such large sets of data. I have a round of more interesting testing to be done on this whole setup in the weeks/months ahead. If I find anything that might be of help, I will let you know! Thanks Again, Raif
I wonder if you should call tech support to help you figure out why the software won't install?
Ha ha -- that's a great idea.
^heh flawless.
Agreed, an attribute based UI mapper doesn't make sense and it ties your biz objects too closely to your UI. I notice that O/R mappers map class members, not necessarily fields. They could be fields or properties.
I dont think that using attributes would necessarily be a bad thing, it just depends on how tightly coupled you want to have your UI mapping with the business object, and how much of an abstraction you want to create your mappings. The biggest advantage of attributes is that you wouldn't need another designer to make the implementation. I have noticed that the new 'DataSources' panel is VS2005 beta seems to do something like this. It allows you to reference a data object and select which type of UI input model you want for the property, which seems like a big time saver. Since I don't have the beta yet I don't know if this works for Web forms yet (hopefully), and how much flexability it has. One of the things I've been thinking about is Indigo's 'DataContract' model, specifically the 'SharedContract' model, and how it might apply to UI construction. It may be a dead end, but the mental execise might give one an insight. It's also always a currious question on who should be 'InCharge' when designing UI. By 'InCharge" I mean providing the control between the UI and the Data. Should the work flow process be incharge? Should the data object be in charge? Should the model be a hybrid? Maybe I should go back and get another look at MS UI Application block. It's at 2.0 - maybe it's a better product.
LogiXML .NET and web-based reporting is free now. It is a reporting system (like Crystal) rather than a reporting component (like Active Reports), but cost-wise, it is free for develpment and deployment on sigle-processor servers with a low-cost upgrade to support multi-processor servers. Find more informtion at http://www.FreeReporting.com.
You link to MiniApp. What do you think about it? How does it compare to your solution? I heard about NakedObjects (http://www.nakedobjects.org/), are the concepts there close to what you want to achieve?
I believe I read somewhere the sp_executesql will compile the dynamic query and create an execution plan for it. This may speed this up a bit if the same exact query is executed.
As Beavis would have said..."You RULE, RULE!"
Sweet deal! haha
How do i set my internet explorer to allow for flash aniamtion playing well?
? Flash ? Never heard of it. :) Seriously though, I don't know anything about Flash.
Excuse me but i have never used a stored procedure before, and although your code works great (thanks a lot by the way :)) i want to ask how can i get the PageCount value from the second table generated by ur stored procedure? Thank you very much in advance :)
Assuming you're using .NET and a DataReader then the NextResult method is what you want. If you are using a .NET DataSet then you will look at the second table, i.e. .Tables[1].
You are here now too: http://www.dotnetinfluencers.org/default.aspx/Wiki.PaulWilson :)
I'm using sql server, and the NextResult method doesn't work, is there another way, i mean using sql server? thanks
Does this work with sub proceedures as well? I am trying to call a sub proceedure located in my template from my implimenting page. Any ideas?
Where does this code go...on the template page? or on the page using the template? When I add it to the page using the template I get an error saying MyTemplate is not defined...my class is called MyTemplate For Instance I have this in my template code behind... Public Class MyTemplate Inherits System.Web.UI.UserControl as my class declaration..along with all the other proper stuff in there... Now when I put the code you gave us above Private ReadOnly Property Master() As MyTemplate Get Return CType(FindControl("mstrPage_Template"), MyTemplate) End Get End Property Into my template code behind...either it doesnt work..or I don't know how to reference it... When I put it into my page code I get MyTemplate not defined.. When I use it with your code in my template page...then try to call a sub procedure (located in my template code behind) called ButtonLib() it doesn't work..no matter how I preface: MyTemplate.ButtonLib(), Master.ButtonLib() etc...just don't know how to call it.
You put this code in the page itself, or in a base page if you are using that approach. If MyTemplate is not defined then either its not compiled or you have the namespace/class name incorrect. I notice you are using VB, and that automatically prepends the name of your project to all your namespace/class names, unless you change this setting in the project file. I can't think of anything else.
Thanks for making-up the name "UI mappers". I've been writing "UI mappers" for the last 5 years and my best at naming those was "metadata UI frameworks for database applications" which is way too nerdy.
No problem Olivier. :) It sounds like lots of us have made such solutions over the years, but maybe not generic enough to actually sell and easily reuse until now. As for MiniApp Fabrice, it appears to get the job done easily, but it mixes maps the UI directly to the DB without an in-between O/R mapper or other plug-in. That's great if you want the utmost simplicity, but its a little too inflexible from an architectural point of view in my opinion. I'm also not sure it has any other hooks for custom actions or controls, although I can't claim to know for sure either. As for NakedObjects, it appears to also be very easy at the expense of flexibility. I'm still working on the hooks for mine, as I use it myself and get early feedback from some beta testers, but I think it must be flexible to really be useful. I really like creating my entity objects with business logic -- very OO and easy to program against. My approach is allowing that pure OO developer desire, and then providing a dual O/R and UI mapping framework with a great deal of flexibility. Its more work than the simplest solutions, whether they be dynamic as MiniApp and NakedObjects, or code generators like others, but its giving me the additional control that my architecture needs and my users demand.
Thanks for adding support to WilsonORMapper for our VistaDB .NET data engine -- thats great stuff Paul! Anthony Carrabino www.vistadb.net
at least the pay is worth...hehehe :)
And boy, was that ever a project! It's nice to have a few minutes to surface after being heads-down for so long, though, isn't it?
Maybe this is dumb question, but can I use the WilsonORMapper to perform distributed transactions? Can I use the objects/object collections in a distributed architecture? Meaning, can I pass objects back from web services or remoting servers to a client application?
Distributed architecture -- yes, distributed transactions -- no. There are no restrictions to your objects (i.e. no base class), so if your objects can be remoted or serialized then you can do so. There are certainly a few things that you cannot do, but no different than you should expect. The obvious ones are that you can't remote or serialize an ObjectReader or a Transaction object. The more subtle ones are that you cannot use any lazy-loading (no ObjectList or ObjectHolder), so you'll need to setup any relationships with lazyLoad="false" in the mappings. Of course, you should carefully think whether you really need automatic relationships in a distributed system in the first place. So yes, you should be able to use my ORMapper in distributed systems. But there is no support for COM+ distributed transactions -- just normal ADO.NET transactions.
I have to agree. I used to be a CVS then SVN convert. Then I used Sourcegear Vault. I'm a converted man. Now, if someone wrote something like GDN workspaces, without the VSS-backend, and put SGV in as the version control system, I'd be a SUPER happy camper. BTW, thanks for releasing WilsonWebForms - I've had a look at it previously (being a fellow MVP :) thanks!), and it looks like it would solve a load of problems I've had in the past. Nice :)
This is a fantastic move Paul, thanks! I've been dying to know how you did this - I guess than now I can find out :-)
Paul Wilson discusses his thoughts on SourceForge and what it is like for developers to get a project started there. I found his thoughts on this interesting since I have always had a good experience there as the end user....
I agree with Scott! Thanks very much for making it open-source I'm sure many people will appreciate it. I know I do! John
Can you put a WilsonWebForm inside a normal asp.net form? For instace, if you use a WilsonMasterPage template for all of your pages and an ascx UserControl for your left-column navigation, can you put the WilsonWebForm inside that left column navigation control?
The problem with that is html and browsers. In other words, while there's nothing to stop you from putting a WilsonWebForm inside a normal asp.net form from the asp.net view, most browsers don't support a form inside another form -- its html that gets you here. So I would recommend you redesign you master page so that the entire page is not inside the regular asp.net form. My site has a left column and a preferences area at the top of the rest of the page -- then the rest below that is the main content region which is where my regular asp.net form is at. This way I have a WilsonWebForm on the left side for my search box that posts to a separate search page, and another WilsonWebForm for my preferences area -- while still having my main content area work just like normal.
Good writeup ! and I think that perhaps the *REAL* issue is the bad database design problem!!! I am working on some stuff right now that I am 99% sure the performance problems come from the first db design having been done by a non-dba who was more used to working in a big firm where the sql was handed to him... two key tables have no relation and others that are related have none... and so indexes have to be built and extra code to prevent relational errors.... I am trying to fix it but have to step with caustion as 4 programs access the sql db and have some odd code embeded in each app. one benifit to s-procs at times is this: if none of the apps had hard-coded sql then fixing the db would be a lot simpler. O/R maping and code gen are things I want to use more of but this is a system written in part in MS J++ part in Sun Java part in C# and now some is moving into Web Services.... so each change has to be tested for each apps embeded logic... a pain!
Hi Paul, I'm one of the developers of DocuLive, an electronic patient record system used in Norway and in Denmark. DocuLive's kernel is constituted of close to 120 tables and 600 stored procedures. The originality of our approach is that the kernel, implemented in T-SQL, *IS* what you could consider as an O/R mapper. So, if I come to your questions, I could anwser "yes" to almost all of them, excepted "do your stored procs allow you to sell your product with support for any database?", but that's only because we've never had the occasion (and were never asked) to migrate it to another SQL platform. More information on DocuLive is available here: http://www.xhovemont.be/PrvImages/DocuLiveECOOP2004.pdf That's a short DocuLive presentation done at ECOOP 2004. DocuLive in Norway (in Norwegian): http://tinyurl.com/6kuqz
Thanks David. There's no doubt there are ways to use stored procedures in such ways -- but I don't think its typical, nor is it what most of the people debating "dynamic sql" vs. stored procs have in mind. Again, I'm not so much arguing against stored procs as I am for trying to better focus the discussions on the real issues.
To me, a true developer/application architect should have the ability to design a decent database from the ground up. I pride myself in being able to do this, but always make it a point to get the design reviewed by a *qualified* dba (let's face it, some aren't...). So to Denny's comment, if an application designer is designing a database with no keys and relationships, they probably shouldn't be building software (IMHO) anyway. You MUST be multifaceted to succeed in app dev these days.
Paul, I won't allow the interaction between my client application and database to be controlled by an O/R mapper. I have never found a piece of code that can look at my database and provide me some type of interface into that database that provides acceptable performance. I know how to setup a database with primary keys, foreign keys, and indexes. My code provides a high performance interface. Whenever I have seen an O/R mapper, it has always had some serious performance problems compared to what I can manually write. I have found that the client will pay for this type of performance. As for the argument about dynamic sql vs. sprocs, well i don't see enough programmers that know how to properly call sprocs, so I try and stay out of them because they need code that they can support and understand. They can understand dynamic sql. As for the suppossed security problems, well if you just take the input and try and put that into the database, well yeah, there are problems with that and you can get what you deserve. I have some parsing routines that resolve the sql injection security problems. For me, a properly designed database combined with proper sql statements provides the best performance and are secure. Wally
yeah, that was a dumb question, huh? It was Saturday, I forgot to think first. :) Thanks for the reply.
That's totally fair Wally -- I like a good O/R mapper, but its definitely not for everyone. I do hope you do some code-gen though, which you can do with CodeSmith using your own templates and style. That said, while I don't have a problem with anyone doing there own thing (if done well), I do think that good O/R mappers do not suffer significant performance loss -- in some cases they even do better.
BTW, I am not trying to trash the Wilson O/R mapper. :-) I have much more confidence in you than in most developers (read 99.5%) and in your capabilities to create a feature rich app. I've been dealing with this project that has an O/R mapper and the O/R mapper is driving me crazy. Basically, it is an O/R mapper that they rolled on their own. Yuck. As you can guess, I have a bad taste in my mouth. I have tried to stay away from the code generators for two reasons. 1. Performance reasons as mentioned above. 2. Problems in making the finetuning type of changes that a code generator does not like me to do. Wally
I read an interesting post from Paul Wilson regarding the never-ending debate of whether to use stored procs or dynamic SQL for your data layer. As I mentioned before, I've always been a stored proc kind of guy. Why? Really just because I love them. I love to get a change of scenery everynow and then and work with some T-SQL. But after reading Paul's post I got thinking. I've never really even given the dynamic SQL route a try. We'll I've tried it, I love the idea of O/R mappers, but really just as that...a try - knowing the whole time I was just seeing what it was about then going back to my typical stored proc route.
I read an interesting post from Paul Wilson regarding the never-ending debate of whether to use stored procs or dynamic SQL for your data layer. As I mentioned before, I've always been a stored proc kind of guy. Why? Really just because I love them. I love to get a change of scenery everynow and then and work with some T-SQL. But after reading Paul's post I got thinking. I've never really even given the dynamic SQL route a try. We'll I've tried it, I love the idea of O/R mappers, but really just
Nice post and a good discussion/description of true dynamic sql. Thanks.
I also won't argue either way yet (my jury is still out), But don't dismiss that "move the burden" argument as absurd - moving burdens from one group / person to another is critical to team software development. The fact that the responsibility stays in house but moves to a different group can be an asset, not a detriment (or absurdity).
Great post. It really got me thinking. I've always been an sp-guy but maybe it's time to at least try another approach. Starting a new version of my framework soon and I'll implement ORMapper into it. BTW, I'm using CodeSmith for code and SPs, so that's never been a real problem. ;)
A good friend of mine had a hard time understanding the concept of dynamic sql in O/R mapping. It took me the whole evening explaining and finally convinced him to read some articles regarding this. :-) This is a great post Paul. I think this will clarify some issues regarding "dynamic sql" which some people thinks its hard coded somewhere in the app.
Been very curious for a long time on how you did this. Thanks for sharing the code!
Wally, I ask you to check out code gen again. You don't have to be stuck with your issues #1 and #2 with code gen. You can always modify what you generate afterwards if you need fine tuning. And especially with something like CodeSmith, the performance of the code-gen'ed code is only as bad as the template you write. Certainly it'd be nice if you can code-gen everything in the build process with no touch-ups but chances are you have to, even if you do something like create a derived class to "fine-tune". Just my 2 cents
In my apps I never user stored procs. I even avoid using views. For these reasons: Stored proce make me dependent on the type of database (Oracle, MySQL, SQL Server) Part of the source code is stored in stored procs and another part in C# or VB. How do you make agreements across a development team which code to put where? Stored proces can only be organized on their filename. How do you control a few hundred store procedures? How does every developer know what each procedure does?
Thanks for another very interesting real world project description, Paul. Congrats on your successes!
Paul, I am impressed that your code works in Mono. Congrats! Wally
I agree on the "Code" folder in Whidbey. I also was very adamant about it being configurable, to no avail. I'm just not going to use those features.
I'm not suprised that WinFS was delayed. Of all the technologies at the PDC, WinFS was obviously the one that was still in the very early stages. Performance was also a huge issue, with WinFS rendering the PDC build of longhorn barely useable. Personally, I'm looking forward to Indigo. I've been playing with WSE 2.0 and the WS-* stuff, and I am a bit concerned about forward compatibility.
Hi! The I am currently using Oracle 9i, and I just switched from SQL Server... just two weeks ago. now the problem is in Oracle 9i or I duno if it is true for any Oracle World, that Stored Proc are pain in the @$$ they are totally disgusting way of getting value via Stored Proc. Like you have to write the Cursor for every return parameter? you can't get "single value" return via Stored Proc, it is allowed only via Function. I was very keen at first that it can be the same thingy, as I am from SQL Server, but this hit me too hard! Oracle Stored Proc are not so "developer friendly" Anything anyone can say about it? The alternate approach? I am using "Views" and then shorten my big giants SQL and then gettin the data via Views and then applying some logic in my .NET Code (in my Business Layer). Any very nice alternative of Oracle Stored Proc? Take Care, Mudassir
Yes, Oracle stored procs are "harder" no doubt. :) They're aren't any tricks that I know of to make it "easier".
Paul, you probably saw this post on Forums about asking feedback for those code folder names... http://www.asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=691250
my feelings exactly ... for many members of the camp ... "Copy and paste is NOT code reuse"
Paul, The file that caused the problem was WebUIValidation.js. I had the same issue. We updated 4 servers running Win2k3 and everything worked fine on 3 of them. Unfortuneatly, the one that failed was the live web server. In our case, using the new files worked, once they were copied to the correct location.
Yup - it's a silly bug with framework 1.1 SP1. The WebUIValidation.js files are mixed up. I think you can just use iisreg to fix it..
we had the same problem. to make matters worse, our 2003 servers have the permissions locked down such that we can't run the iisreg utils to update the client scripts. I am a domain admin too - figure that one out. so we had to do it by hand...well...write an batch file to copy the folder out to our 60 client sites. we can't figure out why the aspnet_regiis.exe -c option needs special permissions to run, but we don't have time to figure it out.
Paul, one of the problems with the "dynamic sql" debates might be it is always discussed in abstract, at least everything I've read. Maybe it would help if you (and/or Frans) could blog a series of posts that give concrete examples showing a stored proc and how dynamic sql would replace it including the dynamic sql that would be generated and the .NET code that would be used to call it. I'm suggesting a series of blog posts showing many different scenarios. Maybe that would help people better understand the benefits of using dynamic sql? (or give them more ammo to attack the downsides? :)
Paul, I too had my share of SP1 problems yesterday. After installing it on my development machine I kept getting and error say ing 1o_v3quy.dll could not be found. After re-booting and re-installing I still had the same problem. Eventually I decided to re-run aspnet_regiis.exe to re-register .net with IIS. Everything back to normal. Now of course I needed to run it on server too :(.... This on worked first time without any problems ..? I hope microsoft are not going back to old way of doing services packs. Service Pack 6 on NT 4 ring any bells :). Regards Jonathan
Mike, From what I understood, the concept of OR mapping is not to ACTUALLY replace stored procedures. It simply tells the developers out there that "hey, you can also use DYNAMIC SQL when developing your CRUD and its also fast, easy to maintain, etc!" They explained the benefits when using it and of course there also trade-offs. But some people tend to misunderstand the concept of "dynamic sql" because they think creating these queries is by string concatenation. And this post, I believe, is to clarify the misunderstood concept. Now the question of dynamic sql as replacement for stored proc? For me its not. We build app depending on the needs of our clients and their "situations". So its always a matter of choice.
Your blog was featured on TheServerSide.NET. If you have any more information, we'd appreciate any comments you care to post. Paul Ballard, Editor TheServerSide.NET
The concept of dynamic SQL existed way before the O/R mappers became popular. That's why most people relate to dynamic SQL as being queries created by string concatenation and hard coded in the application. And from that perspective it's quite understandable that people don't like dynamic SQL. Just because O/R mappers can do dynamic SQL (and in a very controlled way) doesn't mean that people will start think about dynamic SQL as SQL generated by O/R mappers. So you have: - Original dynamic SQL (that most people relate too) - Original stored procedures - Dynamic SQL generated by O/R mappers And depending where you are coming from you will relate to dynamic SQL differently and that's why the discussion of dynamic SQL vs stored procedures never ends since people are not discussing the same thing. The discussions are even more common now when O/R mappers are out there using "the dangerous" dynamic SQL. When it comes to dynamic SQL generated by O/R mappers it's quite different than the hard coding approach since the O/R mapper generates the dynamic SQL in a controlled manner. Based on certain rules it will generate the code in a certain way. So even if the end result is dynamic SQL I wouldn't say it's dynamic SQL as most people think of dynamic SQL. It's dynamic SQL generated by an O/R mapper. So you should call it something else than dynamic SQL when entering the classic stored procedure discussion. Call it O/R mapper generated SQL.
Paul, you rock. I bow down to you.
Nice idea!
I've used GotDotNet for open-source development, and I have to say that the performance and lack of "doh!" features are embarrassment to the ASP.NET community. SourceGear is a much better option for SCC (and they do offer hosting for some OSS projects), but it's a rich app, not a "online community."
Great going Paul (Boy, you know how to sell!) ;) Srdjan - Can I have 5 of these please? NOW?
someone at Microsoft needs to light a fire under the folks ruining GotDotNet WOrkspaces and ither fix it or close it and start over. every developer In have heard from has the same problems and it's been that way for ever. time to fold and admit they missed the target by a mile.
I'm not worthy. Wally
Paul, They rejected my first submission too. All I had to do was submit a support request and they told me exactly what they wanted. I got my project approved and set up within a couple of hours. http://sourceforge.net/projects/netdoa/
O/R Mapping 101 By Paul Wilson
I agree on the benefits you describe for O/R mappers. Yes, I totally recognise all the work needed to write it the traditional way using MSDAAB and stored procedures. We're doing this all the time ... If I understand correctly your Wilson ORMapper only works with ADO.NET 2.0 which is not released yet. Is there a good alternative for using an ORMapper with the current 1.1 version of the .NET framework?
Still playing catch up with software that has done it for years.
Paul, Very nicely done. The point I would like to bring out most of all is that some of us are small, product-based, companies and our products need to work against multiple database engines out-of-the-box. Installing and maintaining stored procedures for each of the databases at each of our customers is not feasible. This is another reason I believe in O/R Mappers. Thanks again Paul!
Stephanie is definitely a superstar! Next time you talk to her, tell her Michael Sanford says Hello! Stephanie worked with me several years back when I was trying to make a go of a small consulting business. We spent a lot of days and nights doing marathon development sessions for a really bad client called Newton Park (out of business now). I think she probably learned a lot from watching my mistakes! :) Maybe we should all get together sometime and reminice...
I don't get how putting you in to fix bugs is exceptional. What am I missing?
Hey Roy: It probably shouldn't be exceptional, but I had personally never seen it, nor have my other senior developer friends experienced it. Thanks, Paul
Hey Jochen: The WilsonORMapper works with .NET v1.1! Its not hard to get to work with v1.0 either, but there's a few small mods required (references to Oracle). As far as I know every other O/R mapper out right now is also targeted to v1.*, and not v2.0. That's not to say our mappers won't work with v2.0, but they are available today for v1.*. Thanks, Paul
Well said! I agree wholesale with your post. /Mats
If you go into a new project and start writing new code, the natural thing to do is write code your way. If you start by fixing bugs, you will naturaly look at diverse parts of the project and interact with the rest of the team to understand the bug. By the time you start to add new code, you should have a decent "feel" for the project. It is amazing how many people don't realize the importance of making the call. I have a MS Commerce Server project online and it has issues with anonymous users, it generates hundreds of thousands a month. I had spelled out the options so many times, but no-one was willing to make the call. Eventualy I said "someone must decide, because I can delete them every day and it won't change my life". I have a "PM" at the moment who said at the begiining that he is democratic. And it seems that he rarely makes the call on things. He's called me a few times to ask me things that I thought I was just waiting for him to make the call on. I once had a PM who would come almost every day and tell me where I was at. I don't know how he could tell, he wasn't asking millions of questions, but he was right. He had/has a talent.
Try one of these - http://sarovar.org/ http://savannah.gnu.org/ https://developer.berlios.de/
I can't agree more. The Dynamic SQL capabilities of O/R Mappers are a dream come true. O/R Mappers allow me to focus more on the business entities and rules as oppose to the plethora of ways my business framework may want to access and massage the data in the database. Not having stored procedures is just one less place where errors and problems can appear in one's applications. Whether an O/R Mapper or code generation solution would require a re-compile or not when introducing a change in entity relations or entity members, I would have a difficult time not re-compiling and testing the application (or at least some piece of it) anyway just to make sure the application does not break or act in an unexpected manner. This is good practice and therefore is a moot point in terms of maintenance for any solution. However, the less work I have to perform to introduce the entity or relationship change the better! CodeSmith is an awesome tool and one I use regularly for all kinds of template-based code/data generation. I realize some people enjoy CodeSmith for creating a DAL as they want the ultimate in control, but given the maturity of a lot of the .NET O/R Mappers now, I think many of the reasons for their use of CodeSmith as opposed to O/R Mappers may be outdated and invalid. Certainly nobody wants to walk away from an investment in CodeSmith, their templates, and the time and effort spent on learning the CodeSmith syntax, but one needs to constantly scan the market and stay up-to-date on the evolution of tools and solutions. I often talk to people who keep basing their decisions or arguing their point about something based on their experience with really early versions of software that have matured by leaps and bounds since they last used it. If this is the case, I recommend looking at some O/R Mappers again as well as any other tools you may have dismissed in the past. Good post, Paul.
Good article! :) Now for the 100,000$ question: when are O/R mappers not very efficient? time starts... now! *tick* *tick* *tick* ...
Time's up! Some O/R mappers solely work with objects, and do not have database-directly logic. So when you want to delete a 1000 entities, or you want to update a 1000 entities (all employees' salary +10%!) you have to fetch them first, then perform the action. This can be inefficient. I throw this example in, to show that O/R mapping is PART of the solution for the problem what's called 'Data Access'. O/R mapping is not THE solution entirely, it requires extra functionality to make it THE solution, and I think in future versions other O/R mappers than mine will have features like this. :) It's complex, solving the Data Access problem... and people get confused very quickly when terms like 'O/R mapping' are entering the discussion... sadly enough..
By the way, the WilsonORMapper has long had DAL-friendly methods for situations like this, and more besides. It also gives you an interface for "events" that you can "hook" that occur at retrieval and before/after each persistence. Now, one place where objects are not the answer is when you need to retrieve a huge number of records. O/R mappers can actually be faster for smaller numbers of records than the bloated dataset, but the reverse is true for larger number of records due to the large number of object instantiations. But the WilsonORMapper can handle this situation too, returning raw datasets, even typed ones, which can be necessary for reporting situations.
Paul.. I want to give you a big kiss here and now!
Hmmm, I think I'd prefer something else. :)
Great explaination! 100% agree with you.
Paul... Have you thought about incorporating this into the Data Access Block? The 3.* version on GotDotNet has a provider model which backends to Access, Sql Server, Oracle and more.. This would be a sweet addition to it..
Magnus, What is so "DANGEROUS" about generating SQL at runtime? Care to explain why?
The C# compiler in SP1 strengthened its ability to detect the use of unassigned variables. Our app generates C# code from resources that the compiler now rejects -- even though we never ran into compiler or runtime errors before. We'll fix our code generator and send out patches. I tried to argue on channel9.msdn.com that this ought to be considered a breaking change since our application used to work, but I didn't really get any agreement.
maybe someone could start a project in ASP.NET about it ? rewritting GotDotNet is a nice idea ;-)
Chris Ongsuco: Once again, you did the same thing (discussed in abstract!) I'm thinking we need SOURCE CODE EXAMPLES!! :)
Paul/Andrew: I'm not following this "make the call" concept. Well, I do in concept, but I need tangible examples, please? For example, what "call" should/could have been made regarding the anon users issue? (Sorry for being dense)
Hi Anil: I have no problem if someone else wants to add it to the MS DAAB, but I don't personally like the MS DAAB (too complicated) and I already have my own cross-database DAL that it works with as is (my WilsonORMapper). :) Thanks, Paul
I had this problem too. Once I copied the Post-SP 1.1 WebUIValidation.js file from \Microsoft.NET\Framework\v1.1.4322\ASP.NETClientFiles on the web server to the aspnet_client in my web app directory everything was ok again. I tried the aspnet_regiis.exe -i solution, which didn't work, I think that maybe this is because my app is in a virtual directory. Manually copying the file sorted it out though. Thanks for posting this solution btw, I would have been tearing my hair out for days trying to figure this one out....
Paul, I looked over the code and it is fantastic. I am a big fan of using XML behind the the classes and hate to use XPath and XSLT. Sometimes it is better solution though. Great job! By the way, I think Anil is talking about open-source data access layer project: http://www.gotdotnet.com/workspaces/workspace.aspx?id=c20d12b0-af52-402b-9b7c-aaeb21d1f431 Check it out, it is very cool and will be easy to migrate to v2. Maxim [www.ipattern.com do you?]
Great stuff!
So cool!
I like the fixing bug scenario. What better way to learn than the system? That would be my recommendation for joining an open source project for example. Fix bugs for a while. Get noticed. Then add the big feature.
Anything by Drucker is usually worth reading.
How do you handle sql injection in your dynamic sql? I know parameterized queries don't allow it, but what about dynamic Order By (which cannot be parameterized i believe)
First, all of my mapper's persistence is parameterized. Next, there are several ways that you can retrieve data -- and the option you choose can certainly impact whether there is any/much potential for sql injection. (1) The simplest method is to just create all your own where-clauses -- I try NOT to do this in any of my examples since it obviously leaves the developer entirely responsible for "cleaning" all entered data. (2) The next method, which is what I almost always use, is to build your where-clauses with my QueryHelper methods. This makes it easy to build "clean" equality expressions, as well as allowing you to not have to know the table and field names, or your databases delimiters. There is also a very good OPath syntax parser that can help you build other "clean" expressions in most cases. I find using the QueryHelper prevents nearly all sql injection, if not all, but I can't of course make any such 100% guarantee either, especially when multiple types of databases are involved. (3) The final technique is to build the entire sql select statement with paramaters, and then use the overrides with the SelectProcedure class instead. This allows you to do all retrieval with parameterized sql, but it does require more work, so I don't typically do this since I believe the other solution good enough. Note that you can still even in this case use the QueryHelper to get your table and field names, although the rest would be up to the developer. As for "Order By", the QueryHelper can again be used to validate field names, but certainly there is room for developers to not "clean" sort parameters entered by users. In the end, I think my mapper has all the capabilities of being safe against sql injection, but there are certainly also capabilities for developers to do things poorly. So developers should still make sure that anything entered by the user (including querystrings) is properly "cleaned", and its also true that your databases should still be properly secured. Yes, its true that you need to allow read and write roles in your database for your application, but you can (1) not use sa or give ddl permissions and (2) secure your application correctly from unauthorized attacks. An ORMapper is a very good tool, but that's all it is -- one tool of hopefully many others in your toolbelt -- it should not be an excuse to be ignorant and/or lazy.
Yes, I too have seen code disappear from my machine after a check-in and wasn't able to get it back until I went to the website. their stuff seems atrociously unstable and I refuse to use it.
Thanks for the information, we are using method #2 ourselves, but relying on cleaning data always makes me feel...dirty. I guess you can probably account for 99.999% of attacks that way and that small 0.001% chance isn't enough benefit for the cost it takes to secure it. Security and Flexibility always seem to be in direct contradiction of each other. Thanks for the information
I don't know why anyone bothers with GotDotNet, the UI (for normal users) is so so so bad. Hard to find stuff, then when you find it it is non-obvious how to actually download the right version. Sounds like the admin interface sucks too.
Tell me, do you also have XP Service Pack 2 installed?
Yes, but that by itself didn't break anything that I noticed.
Hi, Paul: At work, I'm running WinXP (no SP2) and .NET 1.1 (no SP1), and I must enable Integrated Windows authentication in order to debug. So I don't think it's an FX SP1 issue. In fact, this page from last March says that IWA is required for ASP.NET debugging: http://blogs.msdn.com/mkpark/articles/86872.aspx
Of course, .NET was supposed to put an end to "DLL Hell", so I guess we need a new name for this sort of problem. How about ".NET Nightmare"?
We need to cover this on TopXML for sure! http://www.topxml.com Let's talk! :) Cheers, Mark. (PS - Great surname!)
excellent idea actually - shouldn't be *that* complex.
S dot One heeft het over .NET » Dynamische SQL versus Stored procedures
Nah... :)
I was having trouble just looking at your workspace today. When there are not as many people on the server I will try to look at it again. Good luck with the workspace.
Paul, Who took care of your closing? I'm looking to sell my home next year, and I am wondering about all the formalities of closing. Did you still have to pay the Buying Broker 3%? Kevin
The buyer did have an agent -- and we did agree to that 3%, but that still saved us from having to pay 7% if we also had an agent (and 5% if we had an agent and the buyer did not). The buyer's agent had a closing lawyer which was fine with us, but I had called around and knew I could easily get one if a buyer came that did not have an agent to do such work. The closing lawyer mostly represents the lender anyhow, so I don't see it as an issue.
I installed SP for 1.1 .NET on two my home machines and everything works fine on one machine, another one started complaining that the Web App doesn't know some settings for mobile devices in Web.Config, and finally when I started the VS2003 to find out the reason on this machine I found that the web app runs under .NET 1.0 instead of 1.1. I reregistered 1.1 and it started working as correctly. What was a huge surprise for me - when I uploaded my Web App to our production server it refused to show one page with button, just returns a blank page and then dies with the message in the IE status line: "Done". Cool guys from M$! It was a problem to find out a real reason, I spent my last night fighting with IIS, thanks to one man from a newsgroup pointing me to this URL with explanaition what's really going on with this SP. Regards, D.
Cool stuff! Enjoy the new house!
Well, I had the same problem when installed NET v1.1 SP1. Submit button stopped to work on pages which has validation controls. I've debugged validation JS script and found that ValidatorCommonOnSubmit() function does not return boolean value in WebUIValidation.js file. Added return value to this functions and submit button started to work. Modified function code: function ValidatorCommonOnSubmit() { event.returnValue = !Page_BlockSubmit; Page_BlockSubmit = false; return event.returnValue; //MK: return value }
Mire az ember megszokja az IIS6-ot, m
thanks for these info; we too had same problem. We copied newer version of sp 1 WebUIValidation.js to old directory of web server aspnet_client, it worked! Once again thanks for this threads. keep it up. -Giby
Was that last sentence pun intended? :-p
Call me slow -- but I still don't even see a pun in the last sentence -- so I guess it was not intentional. Now I really feel stupid.
Okay, I looked too and couldn't find the pun either. Help us out! I'm feeling stupid, too.
I don't know why you'd use a tool to do that. You could achieve the same thing by putting the SQL statements in resource files.
Ok, I got it immediatly... but it might be an age thing. I think the pun is "tool". You asked "so what do you think about this tool?" and that could, by some, be translated to "so what do you think of this moron?". As far as to the technical merits of this tool...er... application, I could see this being a robust way to have an instant cross db engine approach in an instant.
I don't know if it's what Chris Stewart was referring to, but here in New Zealand "tool" is slang for a person who's a few beers short of a six pack (i.e. not so bright).T.
Sql in xml is "robust" ? And how is writing sql in xml "instant" ? Regular O/R mappers writes the sql for you -- now that is "instant". But I guess to each his own.
1 point to update your query's instead of all inline... That must be the reason...
Oh, for the record it's not something I would do or recommend.
I did this very same thing years ago in VB6. The idea was to declaratively generate the DAL. One of the cool things was it was very easy to run thru the DB and generate the XML from the stored procs. That being said, I never brought the idea forward to .Net, since code generation is pretty easy, and I never did need the flexibility that I thought I would need with the XML method. Somtimes you got to do things the wrong way in order to learn how to do them the right way.
sql in xml is robust imo because it's better than say, a sql query map ala the old site server in plain text files. Is it better than an ormapper? I don't have an opinion there yet. I'm just trying to see things from all angles. It's instant because if you have the persistance engine and only need the queries supplied then you could pick up the sql from the xml and not have to worry about supporting 32 different db engines. This could be combined with other approaches (pluggable db-engine communication layers, etc.) to provide a nice system.
Guys, can all of you say if you're using smartNavigation (false of true) on your pages? Just check if this "magic" word is included into aspx pages? Try to delete this word and see how it works after that. I finally found that I used this option and got a lot of problems after this change. Not at once, only after upgrade with this 1.1 .NET service pack. I found that both versions of my application compiled by fixed and non-fixed VS incompatible. After deletion of this option everything started working fine. Surprise! And finally OPera ignores this problem and works good regardless of the fixed/non-fixed version.
I do NOT use smart navigation. The "errors" that I received were due to minor changes in the client validation files -- and due to them not being synced up on all websites. In other words, SP1 requires the new files, and if by chance your website doesn't get them in the SP1 install then your pages with validation will no longer submit in IE.
Ah yes, Jason, I see it distinctly now... And now that I do, it was really funny! To Don's point, I think we all have a tendency to attempt building things to the Nth degree of flexibility, and often find that we'll never need it all. I usually find myself in this mode during the early stages of a project (for work or for pleasure). This type of design can really bog things down a lot, and now I try to go with an iterative process that emphasizes refactoring. Hope I haven't morphed the subject too much.
Using Xml for Sql was suggested to me by the lead architect on the previous project I worked on. I dragged my feet a bit so there was "no time" to implement. Fact is, I was not in favor of it mainly because I think adding flexibility merely to avoid recompiles is overrated. The compiler is a pretty efficient program in my experience. I have created many configuration-driven apps and found them to be a pain when I had to go back in and remember all the rules.
You mean you haven't changed your default browser to Firefox yet?!?!?! Have you got the developer extension for it? It's Fantastic! (Plus the ctrl-T and Ctrl-F buttons).T.
I once had to switch from IE to Firefox to sign up for a section of Microsoft.com. It was a passport-enabled site (I think the ISV or partners area, if I remember correctly). Very strange.
Today
I recently switched to Firefox on my Mac, but unfortunately there is a bit of a nasty keyboard bug which locks the keyboard within the browser - so my daughter is still on Safari atm. I am full time on Firefox for Windows though (except via SharpReader :( ).
Also another good reason NOT to use SP's is that most people put _so_ much functionality in SP's that they most of the time would not do in dynamiq-inline-sql statements (parameterised of course). I just came on a project where sp's are calling sp's and have lots of if's and way more. Some freezing is done with a datetime as parameter. SQL functionality is used to get the last day of the previous month and that date is used as parameter for other SP's. But what if something goes wrong and you have to get the last day-of-the-month for 3 months ago? Then you have to rewrite the SP's or do everything manually. Just a simple example of things that can go very wrong with SP's because you're possible to do. I can only fear of what to expect once we can use .NET code in SQL2005!
Get the IEView plugin as well. It will add an "Open this page with IE" menu item to the right-click context menu.
The only place I find it useful to have SQL out in XML is to make the SQL more server agnostic (SQL Server/Oracle/DB2).. But, then, I am not sure if the OR mapper in question can deal with that correctly or not.
Don't hold your breath hoping that FireFox will fix your problems on kids sites -- these are usually related to the Flash player itself. Better luck if you re-install the player.
Maybe because, 1. They dont want to put SQL in SPs? 2. They want to manually change everything everytime there is a DB change (Yup this is Total Control)? Hmmm....Im out of ideas here...:)
That is great news... I've been thinking of doing the same thing myself (on the house). Where did you get a website for a flat $8? Enjoy the new house!
I meant the domain was $8 (GoDaddy). I already had the hosting account with WebHost4Life, so the rest of the setup was just an evening of making a nice looking page and hooking up the domain. We made a nice one-page flier with the hilites and one nice external photo, and then mentioned the website on both the sign and the flier. Then those that wanted more details or photos could easily go check out the website for the rest. One thing worth noting is that we received very few calls with this approach -- which I think is what you want. In other words, I didn't waste time fielding lots of calls with silly questions, since they were already answered elsewhere. Instead, nearly every caller we had was pretty seriously interested. My wife was very troubled by this lack of calls after a while, since her friends saling their houses were getting so many more calls. But I don't want a lot of calls -- I just want a few calls and one buyer -- but its something you have to be prepared for since it can make you wonder. Finally, although most everyone had a buyer's agent, I do not think there was ever a prospect brought to us by an agent! In other words, in every case (or almost every case anyhow), the potential buyer found our house on their own, and then either they or their agent contacted us. So selling it on your own will also eliminate a lot of traffic that you might want to have, but in the end, if you're patient, you'll get someone that really "wants" your house, and that's good.
This worked for us: modify the WebUIValidation.js to include the line "return true;" in the ValidatorCommonOnSubmit() funtion
Maybe I don't get your point, Andrew...are you just crowing about the inferiority of an MS blog for the heck of it? Just doesn't seem like a great contribution to the comments...
I also had the same problem, but I wasn't using the Validation control. I was using the submit button and populating a datagrid on return. Everything was working ok until I wanted to change the styles of the grid. I changed the CssClass and suddenly the app stopped working. I tried the solutions above, but nothing seemed to work. That's when I noticed that after changing the DataGrid CssClass, the InitializeComponent() was missing the delegate call and was completely empty. I simply put in the this.ButtonSubmit.Click += new EventHandler(ButtonSubmit_Click); back in the code, and it worked. I still don't know how it got erased in the first place.
As far as I understand the philosophy of iBATIS, it's a very simple and straightforward tool, which also makes it very flexible. It seems to be as light as you can get and still call yourself an O/R mapper. It seems to lack a lot of the features of more advanced mappers, but it also avoids their complexity. I'm not a specialist on this subject like you are, but I believe that one of the most complex parts of an O/R mapper is the one that generates efficient sql to query the database. iBATIS avoids the problem completely. It makes it a little clumsier to write your queries because you have to do some escaping, but that's not a very big problem. And you can still use stored procedures if you want.
Complexity has a tendency of creeping into business requirements anyway so why add any unnecessary complexity into the code? Just look at the typical rules businesses have in their processes! Speaking of complexity in APIs (and without starting a flamewar!), I had this problem many times as a Java developer where many of the APIs (no matter how powerful and elegant) are just so much more complex than they need to be!
Paul, while I agree with your premise that simple is good; I think that calling yourself "not that smart" is perhaps duplicitous. How many "not that smart" people quote Ockham's Razor? It is actually your intelligence that allows you too see the forest, instead of just each individual tree. The ability to abstract is a hallmark of a good architect, and I beleive that your Maths background serves you well here, instead of the CS graduates firmly grounded in the intricacies of implementing yet another Stack, or Queue. Simplicity of Design. Simplicity of Implementation. Simplicity of Use. All of these are goals to strive for. That's why I'm interested in when Aspect Oriented Programming becomes mainstream. When you can declaratively state how your program will behave, without vomiting "plumbing" code throughout your application, then we've reached yet another plateau in our search for programming simplicity.
I prefer complexity, myself.
I have just read it blog and remembered my first steps when i tried too understand the community starter kit from asp.net. I agree with author of KISS, but i would like to add one rule that also help sometime for begginers and stupid programmers like I. It is small errors that must be in any read-to-use application. Why? Because it is one element of studing: "to find error you must learn more about structure and foundations of topic".
This article really describes the most basic values software managers should have. Everybody probably knows them already. Most choose to ignore them for somewhat reason.
I've seen some amazing arguments on the asp.net forums by the authors of a few different O/R mapping tools. They get very nasty. But not as nasty as some of the opinionated people in comp.object Still, its the internet. People say cruel and things all the time. The trick is to not let it get to you, even if it is a personal attack on you or your products. Negative feedback is still positive. It just depends how you spin it. You're right about complexity though. "Simple things should be simple. Complex things should be possible"
I agree with the last comment. Dont let them bother you that much. Listen to what they have to say and then tell your side of the story and leave it there. If they want to be rude and post bad things about you where you cannot "defend" yourself, its up to them. If I dont agree with you I believe the best way to tell you that is to either email you or post a comment in the blog. But most of the times you have good things to say and I apreciate your work. :)
There aren't actually simple things in the world, that's a strong trend of thinking amongst philosophers nowadays :) But seriously, if you refer to ASP.NET forums, in my opinion there aren't many brilliant software developers doing active posting there. And not so brilliant ones like to write. Alot. Without constructive approach. Which is sad, because nonpragmatic and nonconstructive persons shouldn't be in the software business. But somehow there is huge amount of those people writing software.
Paul, if you're referring to the asp.net forum thread about O/R mappers: don't let it get to you, it's not worth it. Not a lot of people read these forums and even less would believe some random guy over an MVP like you. I've learned some time ago, that argueing on asp.net forums isn't worth the effort. Sometimes I take the time but afterwards I always think: why did I spend that time? Like that guy who slaughtered your mapper compared to NHibernate. Don't bother with that. If you do, you give him the credit that he knows what he's talking about. Well, he's not, trust me on that. Everyone who's looked at the code of NHibernate knows that. When you let them and their critizism get to you personally, you make them people who know more about the topic than you do. That's not true, they spin rethoric, marketing poop. Say what you have to say and that's it. Believe me, someone who reads your words and then theirs is not all of a sudden starting to believe them instead of you. You also have to realize, that the moment you decide to participate in a discussion, is also the moment you give up your defenses and you open up yourself. The more you post, the more flack you can expect, the more outspoken you are, the more people will say you're arrogant. The fun part is: your texts are also there, with arguments, with reasoning. People open for anything will read your texts and will find them trustworthy. If they read the rethoric of the trolls afterwards, it will probably more convince them you are right than that the trolls are right.
Hi Paul I have been doing research into the <non silver bullet> architecture (and architectures in general) of late, and stumbled across your comments and found them pretty interesting. I do agree with you that the "out of the box" features are somewhat bloaty, but I suspect that some of the users of the forum in question may not be used to constructive criticism. Never mind them. Anyway, you mentioned that there are several other architectures that are more "ready". Would you mind dropping some names? I'm interested in checking out your recommendations. Thanks.
I'm always interrested in what people have to say in the KISS department. I will probably do a little series of my own on the subject, when I find the time and lust for writing such a thing :) Furthermore, keep in mind that people tend to be a lot faster in giving negative feedback, then positive feedback. So by all means go for it :)
Um, actually Paul, if you'd read the little snippet that Rocky quoted you'd find two words in quotes: "loves" and "experts". Now I don't know how you intended for those words to be read, but I'll tell you that when I see them quoted within the context of your sentences I immediately think sarcasm with a wink or roll of your eyes. Perhaps you didn't mean it that way, but frankly I think you did and I think Rocky has a right to be miffed with you. I just re-read what Rocky wrote in response (over a week ago mind you) and to be honest he didn't exactly tear you a new 'hole. About your comment he wrote: "It is not the most professionally phrased comment..." and frankly I agree, you definitely could have been more tactful. Furthermore, the people on the CSLA board (linked from Rocky's site) didn't exactly "go after you" either although they were supportive of CSLA as a framework. Perhaps there is some other location where you are being "burned in effigy", but absent that I don't understand the problem. For the record I own both Rocky's book AND your OR/Mapper (paid my $50 on Friday). I find value both in Rocky's book and his other writings and I've enjoyed your writings and think your product may be valuable to me in the future (albeit for now I'm not interested in tweaking it to meet my personal idiosyncracies). I also think you should continue your series. I won't say that the first KISS article did much for me, but I took it for being an introduction and was interested in seeing more meat in future articles.
Keep up the good work, Paul. Honesty may not win you the praise of everyone, but it will probably win you the praise of those from whom you most desire it.
Keep ya head up, brotha!
Ah, I now found the article which is the issue at hand here: http://www.lhotka.net/WeBlog/PermaLink.aspx?guid=7d167f5a-487b-4105-967f-ba420a5d9f31 Mr. Lhotka writes: "I think it is important to note up front that Mr. Wilson sells an O/R Mapper tool, and so has some bias. It is also important to note that I have written numerous books on distributed object-oriented architecture, and so I have some bias." When people start with that, I stop reading/listening. Mr. Lhotka might have written some books and has something to say because he wrote some framework (which isn't that great if I have to rely on the people I spoke who have used it, but that aside) but that's totally irrelevant as well as that Paul sells some product. That sentence of him exactly says: "Paul is biased, and he wrote this to sell a product, you may believe what he says, but keep in mind that it is highly likely it's marketing rethoric". He wrote a lengthy article after that, and I'm not sure if I'll even read it.
"Why can't we all just get along". Good question. I've asked a few questions in the ASP.NET forums before and I always encounter someone trying to sell their product or I get flamed. Without using names, he makes another popular O/R mapper. I'm sure you've all crossed him at one point or another. I always found in the forums, the policy is "ask a simple question, get a kick in the face". Due to these incidents, I stopped going to the asp.net forums and turned to Paul. He gives great advice as well as asking for your thoughts on some of his own code. I saw flames being thrown at him over the "dynamic SQL vs. Stored Procedures" article a few weeks ago. Instead of flaming, why not go and do your own tests to see for yourself! The fact is that he was right. If you think he's also trying to push sales for his ORmapper. I severely doubt that. At $50 a pop, Paul isn't getting rich quick. He is simply selling good quality code minus the ego and big $$$ figures!! "KISS" is the way that software developers should be designing their APIs. Abstraction is key to any good design. You want to see stupid and complex designs that aren't very expandable, take a look at Microsofts Petshop 3. This is the worst piece of junk in the asp.net community. The ASP.NET Forums are awesome in my opinion with the one exception, the data provider implementation. If Rob was to build the forums out of Paul's ORMapper, they wouldn't need the specialty data library. I almost feel like I need to write a disclaimer at the bottom of my comments now.
I worked in a company inwhich Rocky was the technologist, and the company implemented his architecture all over the place. Frankly, by not being simple, that architecture tought me the value of KISS and common sense. I enjoy your work because of this. Keep it simple.
>> Would you mind dropping some names? If you like Frameworks, then there are several very good commercial ones that advertise in all the magazines. I haven't used most of them, although I've spent time reviewing some of them, and many of them appear to be very complete and usable. MereMortals is one that comes to mind, but there are others also. I hate to be negative (again), but you usually get what you pay for -- although certainly there are exceptions on both sides. If you like RAD, then DeKlarit is excellent, and I think there are some others that advertise heavily that might also be good. If you like CodeGen, then there are a lot of templates that have been contributed to the CodeSmith community -- but you'll have to find which ones are your style as there are many. I think there are is also a similar community of templates growing around MyGeneration, although I haven't spent any time with it myself. And of course if you just want to avoid CRUD, then many O/R Mappers are great tools, although you may still need to use them with any of the above if you want more. All I really want to say is don't just assume that because something has reached a critical mass of attention that it is the best -- the opposite is often quite true. >> I immediately think sarcasm with a wink or roll of your eyes Sorry you believe that to be the case -- it was not at all intended to read that way -- but I can see how you can think so. I used quotes because I was not talking about Rocky or anyone in particular at all -- I was simply saying that you shouldn't blindly think that anything is perfect and ready to be used -- regardless of who is behind it (myself included). Maybe I read it differently, but my subject was really not CSLA at all -- it was about thinking code gen could be a silver bullet -- and CSLA was simply an example I pulled since it is well known. Yes, I did not say its great and should be the basis of your solutions, but neither did I say it was terrible and should not be the basis of your solution. I owned Rocky's VB6 CSLA book, and now his .NET CSLA book, and I've learned a lot from them. I also enjoyed his conference sessions more than most, and I thought he made excellent and unbiased contributions to the discussions on my project where I used CSLA the day he came. My beef is that CSLA has gotten a life of its own and that many people using it do act like its perfect and ready for every scenario. I would never make such claims about anything, not my product nor any category of products -- but there are some in the CSLA community that do just that. I'm not saying everyone does this, but there are enough that do this and make it difficult for any other views, as evidenced by this thread. Finally, I've been amazed at how many people contact me by private email to say thanks for saying CSLA isn't perfect -- and to share their own less-than-perfect stories. And yet they insist on anonymity.
Paul - I hope you don't stay silent, regardless of whether or not anyone/everyone/someone agrees with you or someone else, the discussion is good regardless. Personally, I enjoy hearing alternative viewpoints because it helps me think more thoroughly through my *own*, providing me the opportunity to learn. Now, not everyone takes that opportunity, and some don't see it as such until much later, but it does happen for some of us nonetheless. If you decide to stay silent on some issue that you normally would have commented on, I feel you are cheating yourself and the community (not that you are obligated to us in the least!) from healthy (albeit contentious at times) debates. Growth does *not* happen without opposition. That is a true principle regardless of the domain.
Changing the this function in webUIValidation.js worked for me. Before Change: function ValidatorCommonOnSubmit() { var result = !Page_BlockSubmit; Page_BlockSubmit = false; event.returnValue = result; return result; } After Change: function ValidatorCommonOnSubmit() { event.returnValue = !Page_BlockSubmit; Page_BlockSubmit = false; return event.returnValue; }
Steven, in Alpharetta: http://steven.vorefamily.net/
I'm curious to know what didn't work for you (in the project you cited in your personal note) with the CSLA framework that would make you not want to use it again. I own Rocky's C# Business Objects book (and have followed his (and Billy Hollis) column on MSDN and have enjoyed the read but have had some "philosophical" differences in the CSLA architecture. Is it that you disagree with the concepts or the implementation? And why?
I whole-heartedly agree with your statement that Rocky's books are excellent. Expert C# Business Objects is a fantastic book for understanding business objects and the challenges with managing them throughout their lifecycle. I don't know for a fact, but I am sure the VB.NET version is just as good with only differences in code snippets. The book isn't a marketing ploy to get you to use CSLA.NET, but a good book on the practical use of several key .NET technologies (remoting, reflection, attributes, etc.) as well as just a good book to walk you through the creation of a framework to manage the lifecycle of business objects. Even if you don't agree with the framework, the book is great. I started a chapter-by-chapter summary of it that can't do it justice, but it is a really good book: http://davidhayden.com/blog/dave/archive/2004/10/04/512.aspx As a side note, I think your opinion is very valuable Paul as you are truly a skilled developer and an MVP. However, even more than others, it is important that you be specific when making good and bad comments so they are taken in the correct context. It is truly frustrating for people making decisions about products to get opinions from people who have an outdated and/or limited view of a product and didn't qualify that their comments pertained to version 0.8 and they haven't re-looked at it in over a year :) I am sure you run into the same thing with your O/R Mapper. Stuff happens... at least you qualified your statements :)
Hi there, just yesterday i started my master thesis about o/r mappers. Can anyone of u give me a hint for good theories about that stuff? I really need 2 learn that stuff from the beginning, any good books would be great. My main thesis will be about the pros and cons of O/R Mapping, perfomance and testing/describing some tools... For any information, links and book tips i will be most grateful. Best regards Christian Excuse my bad english, i am german and not that used to it, sorry.
Martin Fowler's "Patterns of Enterprise Application Architecture" is good background. Christian Bauer and Gavin King's "Hibernate in Action" is the best practical example book. Scott Ambler at "http://ambysoft.com/mappingObjects.html" has a fair amount of information online. Other online resources are "http://www.objectarchitects.de/ObjectArchitects/orpatterns/index.htm" and "http://www.joeyoder.com/Research/objectmappings/"
Lamont: I don't think I would say it didn't work -- although it was a heck of a lot of work in my opinion (still ongoing when I left). Part of that work was in removing a lot of the features that we simply did not need and which were causing excessive memory use. Granted our system was not typical (lots of large recordsets and on Citrix), and I blame management for not listening better there. But the real "work" to me was in creating my business objects, and making sure that all the dependencies were correct also. Some of that can certainly be alleviated in many projects with code gen, but I simply believe there are simpler ways to do things. I've also led enough teams to know that there is a huge difference in what some consultants teach and what actually happens. So I want something simple for my teams to use and learn and maintain, while still being flexible and easy to extend. I'm simply at the place in my career where I'm tired of the same old things -- and I strongly believe I've found better ways. I didn't invent these things -- I actually learned from several others in the forums -- and from reading what the Java folks do.
I have been having debugger issues as well with sp1. I have a thread going in microsoft.public.dotnet.framework.setup called ".net 1.1 sp1 install may have broken vsnet debugging" I have gotten some feedback from MS. The part about the uninstall for sp1 being hidden as a hotfix is really annoying.
Wow that was pretty fast, thx a lot Paul!
Boo! Hiss! Down with Atlanta Bloggers! :) Cincinnati Bloggers RULE! (After starting a ruckus, I now toss the ball to James Avery - http://dotavery.com/blog/) Run James Run!
Thanks Paul.
I am maintaining the OPML for the Atlanta bloggers at: http://www.xmlinsiders.net/examples/atlantabloggers.xml
Your reply above says "I want something simple...I've found better ways...I didn't invent these things..." We're wrestling with simple/flexible .NET architecture issues like so many others, and your words caught our attention. Are the "better ways" and "things" in your reply referring to: a) commercial tools -- such as your O/R mapper, UI mapper, or other products targeting architecture/framework issues?, or b) concepts/ideas/practices that promote simple and flexible architecture, or c) some combination of a) plus b), or d) other!?! Simplicity/flexibilty are worthwhile targets indeed, but we're finding that the practical nut&bolts mechanisms to get there are not easy to pin down. How ironic that the path to simplicity seems... complicated!! So we're curious to have you unpack more detail about what you've found (tools? practices? specifics?...) that promotes simplicity in .NET architecture without sacrificing power, flexibility, extensibility, etc. Please elaborate. Thanks.
I agree with Curious Coder. Come Paul, spit it out :)
Our company is a long-time user of CSLA. Most everyone hates it but its too late to easily change now. We went with CSLA since we thought it would make maintenance easier. But we have to write so much code to get it to work that its just ridiculous. A framework should make things easier and not force you to jump through hoops whenever something needs done. I don't think it offers us anything at all that we need that isn't easy for us to have done other ways easier. We would recommend anyone just now starting to look around to look elsewhere. Go with one of the 3rd party frameworks that are much better. Or from what I can tell from just playing an object mapper would be another good alternative. But stay away from CSLA since its just to difficult and offers nothing much in return for all the trouble. BTW, we were also burned by the datareader bug in CSLA and as far as I'm concerned it is in CSLA since there is little difference in the book between example of how to use it and the framework itself.
I cannot believe that serious developers would take examples from a programming book and use them to implement real business solutions. I've just started reading VB.Net Bussiness Objects, and I'm glad that I have. However I would never consider blindly implementing the framework presented there. I will use the book to better understand the .Net framework.
Count me another disgruntled CSLA user. We did not follow it blindly. We just found it too hard for little gain. I find Wilson's mapper easiest and LLBLGen nice also.
The correct answer is (c) ! O/R mappers go a long long way in helping to achieve simplicity, flexibility, and maintainability, as well as being able to produce results quickly. My first venture into O/R mappers was with Thona-Consulting's EntityBroker, and while its still one of the best I decided I didn't need the features that made it more complex than I could imagine. Lately I think NHibernate looks very promising, and its actually very similar to my WilsonORMapper from an external usage point of view, but its internal complexity makes it difficult to extend and its Hibernate heritage means its developers will probably not add new capabilities you want. I also think LLBLGen Pro is great if you like code gen, but that's still too complex for most teams I've been involved with. So while I think you'll be well off with any of those mappers, and maybe others, I do of course think my mapper hits the sweet spot of simplicity, both in usage and in its internal design for extensability. Of course O/R mappers don't cover everything, so you still have to create other parts of your architecture and applications. For UIs, I am personally using my UI Mapper, which I need to find a little more time to finish before I'll release it. But I also think you can do some absolutely great things with Code Gen in the UI -- I'm familiar with CodeSmith myself, but MyGeneration also looks promising. Log4Net is of course the answer to all your logging needs, NUnit is great for unit testing business logic, and there are many other similar tools you can piece together for pieces of your architecture. The beauty of most of these tools is that you can pick and chose the ones that fit your style and needs -- and most of them play well together -- resulting in a simple architecture that fits your team instead of a ready-made framework. And of course, keeping current of best practices and current concepts/ideas goes a long way into the choices you make, as well as the pieces you have to build yourself. In the end, there are a couple of things to keep in mind. First, every team and situation is different! I would never push the same methodologies or toolsets on every team or project -- although you certainly have to make some decisions quickly if its a new team that you don't know enough about, but even then you need to learn your team as much as your project. Next, know what's already available! I've seen far too many projects reinvent things that already exist -- whether it be things available in 3rd party or open-source tools, or things in the .NET framework itself -- so know the framework and stay abreast of what's going on. Finally, simplicity is a mindset that can be complicated! In other words, you have to actively strive for simplicity in many cases, and that's where refactoring is an essential tool that many project managers just don't get -- its a tradeoff between quick and easy now vs. flexible and maintainable in the future. I also find that many technical people are just too smart for their own good -- design patterns are just a tool, but many seem to think that they are an end to themselves. I'll try to blog this and more soon.
Paul - Response much appreciated. Thanks for jotting some more specific and helpful thoughts. Looking forward to more related blogging. Sam - you say "...Go with one of the 3rd party frameworks that are much better." Do you mean an O/R mapper or some other kind of product? Which did you have in mind? We're in an "evaluating/choosing" phase and thus very curious about such things.
We abandoned csla. It was nightmare.
Congratulations.
>>narrowly devoted to software development LOL! What would they think to people that blog exclusively on GC for the .Net Compact Framework?
Despite the tech heavy influence in this article, I kinda have to agree with them, it is becoming more and more mainstream. My brother is a lawyer, and I can't think of a group less likely to change and use new ideas and technologies. But even some of the lawyers out where he lives and works (Chicago) have Blogs. An interesting side note on the effectiveness and power of blogging - the way blogging increases visibility of the people who do blog is amazing. It's like viral marketing for some products, and in this case, we bloggers ARE the product. And on the other side, you mean to tell me that there are people who have nothing better to do than to write stuff about programming online? And other people read it? Geeks!
People seem to forget that college kids have been blogging for years. They might be talking about being in love or getting drunk, but it's hardly a new phenomenon.
Burlington's weekly (kind of like a Village Voice of Vermont) just had blogs as their cover story. All policital ones though.
The Cherokee Tribune! Now, that's a metropolitan daily, if I've ever seen one...!
Could someone post a sample code, please? I open a xml file but no content will be displayed. I just recieve FieldCount, RecordsAffected, IsClosed, Depth and HasRows.
Kathleen's article refers to "dual classes" when discussing partial classes. I know that partial classes are classes split over multiple files, but am not sure what dual classes are. Is she referring to base and inherited classes? Thanks, Jason
Yes, I hadn't heard the term much either, but it does refer to inheritance.
Congrats. I've gotten quite a few hits directly from the article, and my total number of hits has gone up about 10-20% a day. I guess more people read the Cherokee Tribune and own a computer than I might have thought.
Dear Paul, I assume when you say "so far the person that has been posting about this tool" that you are referring to the person who kept commenting on your very excellent article at TheServerSide.net. I must say that the gentlement in question was neither elequent nor very polite in stating the case for iBATIS. I'm not sure if I could do better, since I'm not a member of the iBATIS team, but simply a very happy user of that library. In any case, I'll try to explain why iBATIS is "different"... For me, the two features I look for in an ORM tool, with all other features being equal, are the following: 1. It should not dictate the layout of the inheritance tree for my domain model, i.e. it shouldn't force me to inherit from certain base classes. 2. It shouldn't dictate or restrict how the database is designed. Feature #2 is important because oftentime the database is inherited from a legacy product or is handed down my the DBAs. I must confess that my experience with O/R mappers is restricted to two products, one opensource, and the other commercial. And both of them either dictated the class hierarchy or the database design. iBATIS doesn't impose either limitation since it maps objects to SQL statements. So it's very tolerating of bad database designs, and of bad domain model designs for that matter. By the way, iBATIS does allow the use of stored procesures. If I had full control of the databsae design on a given project, I would consider another, more feature-rich code generator or O/R mapper over iBATIS. But if that is not the case, then iBATIS could be the best, if not the only choice. Hope this helps. -- Mohammad
While I know many O/R mappers do impose base classes and/or database designs, I do not think that all of them do. For instance, my mapper does not require a base class, and all interfaces are optional. Also, very little is assumed about your database design, although certainly not every feature is available in all cases (for instance if you use composite keys). I'm pretty sure similar things can be said about a few others, like NHibernate, so I'm not just trying to sale my mapper here. Now I can agree that its a nice extra feature to be able to totally specify your own sql in the rare cases where you need to do so, but I believe that there ARE ways to do this already, and the fact is that I want the majority of my cases to have their sql generated for me. So I still fail to see why I would want a tool that does little if anything for me other than take my own sql, especially if I have to define it in an xml file of all things. What are these other ways? Either use a stored proc for those cases, or step out of the automatic "mapper" features and use the DAL features that some of these mappers also include (mine and others). Anyhow, thanks for your answer -- it was at least making sense and I don't mean to belittle it if it seems that way. I just think its based on misconceptions of a few mappers, and its also attacking the wrong problems.
Any of you folks know a good technical recruiter in the ATL area?
Good recruiter? Sounds like an oxymoron. :) Seriously, there are tons of recruiters, but I don't know any that are better than others, or that would actually represent you instead of just trying to fill quotas.
>would actually represent you instead of just trying to fill quotas yea, that's what I'm looking for (though right now I'd even take one that was just filling quotas, if they had contacts into decent job offers ;-)
Count another disappointment and abandonment of CSLA here.
Does any one actually believe there is a mainstream anymore? When news about the news in a local newspaper from Cherokee County is being read by someone up at 2:45 AM here in Tokyo, it's pretty evident that the idea of mainstream is dead. It was an artifact of media control concentrated in the hands of a few. Blogs have been in the news for years. If they haven't been covered in the news you've been hearing, reading, or watching perhaps it's time to change sources. "the premise was that blogs are getting mainstream"
I find it completely understandable but not a little sad that people have had bad experiences with CSLA. I've seen this kind of thing a million times in a million companies (mmm, exaggeration there!) with every 'new' idea/methodology/example-of-how-to-use-a-technology. Think about all the 'best practice' articles and building-blocks, examples, code snippets, whole bleedin systems, etc., etc. printed on MSDN over the years. Then think about how many times you have had to deal with code where the author didn't dig deeper, didn't use his/her own knowledge, experience, expertise, training, whatever but just blindly followed along ONE article or ONE book to guide an entire system or, worse, an entire company's software development strategy. At the end of the day we are commercial software developers. Books do not give us the ANSWERS or FREE systems or frameworks or any such holy grail that means we never have to think again about our jobs. All these things: books, articles, examples are for our consumption to help equip us with a greater arsenal of knowledge to solve the next problem. I love Rocky's framework. I have learned and taken a whole bunch from it, as I have from MSDN and all the other sources I can get my hands on – not least my own experiences! I use a framework of my own now that is based on, but is very different from, the EXAMPLE framework in Rockys’ book. Why is it so different? Because I develop COMMERCIAL software where every new system has its own peculiarities and my skills as a programmer is to adapt and solve in an efficient manner, bring what I can, create what I can't. And always consider the lifetime of a system and the way in which it will evolve. By the way, Paul, I do feel that you came in for some harsh criticism from the CSLA forum. Well, you probably brought it down on yourself but you were gracious in the end. I feel strongly about how a single throwaway comment can lead to completely unreasonable negativity about a system/idea/book/…I have seen it cost good people jobs in the past. Thing about blogging is that while it may be aimed at specific professionals it is also accessible to people who are not in that audience! How many times have I had to reassure bosses of this or that after they come in all panicked after reading some comment in an article that they really were not equipped to read. How many times have we all had to sit our bosses down and explain the XML is not the end to all their problems – or web services or, now, SOA….??? Ok, my rant is over. All I will say to all involved it is don’t expect anyone or anything else to solve your problems – use whatever help you can get but put it with your own knowledge and experience because that is what you are getting paid for (not for buying a book or paying $50 dollars to a tool!). AND, share your experiences whenever you can.
Excellent post "jh72i". I guess part of my problem was that my boss at my last job was "sold" by some consultants that CSLA was the answer that we had to use. My opinions were belittled, my previous project was ridiculed (which was a quickie ASP.NET project that didn't justify an elaborate architecture of any type), and my boss was showed the book which proved it must be true. They told him that no using this tried and true framework would cost them months, both short-term and long-term, and yet later most of the other consultants were able to confide in me the opposite -- it was just the "sale" in other words. And that is my main gripe -- there are many people that should know better but talk it up in such a way that they convince others with less experience that it is a silver bullet. And that's also the exact same response that I got in those forums (from a small minority probably, but a very vocal one).
Hey, and I understand your pain (and Rocky does too) about those 'salesmen'. That's what prompted me to post to your site, Paul. There are some absolutely excellent people contributing to the CSLA forum (and some even more excellent NOT contributing!) but I truly get the impression that many expect too much for too little of their own input, if you know what I mean. Any developer that accepts things at face value without question worries the hell out of me! And, those that then go on to convince others....well...very scary results. I first heard of CSLA when I started work in a company that had decided to use it..because they read the book..to develop a multi million Euro project in the financial services sector. The system actually manages billions and billions of Euros. To my astonishment there were no tests, trials, anything done on it - they just trusted it would be great!!! Boy-oh-boy-oh-boy!! It is a great system now but only because a colleague and I made it so. See, lots of what Rocky's does I love and undertsand completely but I don't always agree that everything fits well in the types of companies I work for - that is something that is little talked (blogged :) about: the influence of the people that manage systems over their lifetime after the initial development phase. Like, the OO systems can die a death in a very short time if the company doesn't carefully manage the code.
You may want to update the link to the Tribune article. They moved it on us. I've updated my link at http://rainbowfish.typepad.com/ronandroger/2004/10/interview_with_.html.
need info about Master & Base Form in ASP.NET
AppSettings can Reference an External Config File
The GDN link to the WilsonXmlDbClient does not work. Was it moved?
Using Forms Authentication with Windows Authentication (
Works fine now -- GDN sucks though, so no telling what was happening earlier.
Hi Paul I think the value in CSLA or any other framework for that matter is that they promote consistency. Having been in the field for almost 20 years that counts for a great deal. Also, in my humble opinion a track record with a particular approach/framework is paramont to understanding it strengths and weaknesses in solving a particular problem. Looking forward to giving your ORMapper a try. Regards Kevin Weir
Congrats on the new house (and being done with the move of course).
Congrats on getting settled in. Due to the company I worked at being acquired, I ended up moving 4 times in 4 years, and now I just shudder at the thought of moving again. I'm not part of that company anymore, and I don't plan on moving again until we move to somewhere warm - a long time from now unfortunately! I can only imagine what it was like doing it with kids to boot!
Yeah, moving is a pain. Fortunately (or unfortunately) I was in Iraq when my wife moved us from our apartment to our new house, so I didn't feel that pain, but I, too, hate moving.
Congrats on the new house, Paul! Great to hear from you.
Too bad for you the thread is not on the FP anymore ;) (but people still read it apparently, according to our referrers). PR is much more valuable than payed advertising. Not only does it come free (mostly), it also looks like normal talk/information, not ads no-one will look at. :)
Paul, Thanks for the review! I think you make an interesting point that there are some missing things in the book. As you mentioned I intentionally left out some things. Most notably O/R mappers and XML tools. I intended these topics to be for another book. We will have to see if that ever appears?! There are so many open source projects showing up that it is a challenge just keeping up!
Code Generation
Paul, congrats on getting the move done. I sympathize with you. We built a new house a new house and moved in about a year and a half ago. I said at the time that it was my last move. Well... my wife is ready to upsize again. I keep telling her that she's going to have to pay for professional movers this time!
LOL :) I'm curious who asked you that... would you mind dropping the name here? :D (or in an email) But those review questions indeed are annoying sometimes... "Could you provide an in-dept list of your mapper compared to product A and B?"... as if I've nothing better to do. :)
hehe, i would've given the same review
God bless man, hope she is doing better real soon. My Mother in law is a survivor, I know it can be tough...Good luck.
Livestrong!
Best Wishes to your wife Paul.
I am praying for you and your wife. Please keep us posted. God bless.
You'd think that this is such a common requirement that there would simply be a checkbox on one of the IIS config pages!
Our thoughts and prayers are with you. -Jerry
Best wishes to the both of you during the next couple of months. We'll be thinking of you and keeping you in our thoughts.
Of course I have no words, but to say good luck to you and your wife.
I'm not a native English speaker so I used the dictionary to translate: "Veel sterkte" (what we say to people in situations you're in now) and it said: "All the best", so I hope that's a correct translation. I hope your wife recovers soon and she overcomes this horrible decease. Chemo is horrible, but at least it gives some hope on recovery.
The best of luck to the both of you.
Paul and the rest of Nata1 says, long live Wilson Mapper! We need this in a big way, anything I can do to keep this mapper strong. Nata1 loves wilson and the mapper :)
Paul, I have an unfortunately large amount of experience with the sort of thing your wife is going through, being a 6 year liver cancer survivor, in addition to a number of other problems. Please know that lots of folks out in the blogsphere and elsewhere pulling not only for your wife, but also for you and the rest of the family. No disease effects just the person with the disease. The best advice we ever got was this: This is not a sprint, it is a marathon. You need to have your head in the game for the long term, and take care of your loved one, and take care of yourself as well. Be well, and let your wife know we are thinking of her...
Paul, Stay positive and beat that nasty disease! Good luck and we'll be praying for you. Regards, Alex
Best Wishes to your wife. Thank your ORMapper.
My heart goes out to you and your family, Paul! I can't even begin to imagine. Keep your head up, stay strong, and you guys will lick it. Regards, -Jason
Best wishes to you & your wife.
Paul, Best of luck with this. You and your wife will be in my prayers. -Christopher
Paul and Jenny, I wish you all the best. May you beat it together. Stay strong - Kia kaha.
I'm sure you have read the theory and you know that probabilities are on your wifes side. Still you would be her most valuable doctor for the next years. My best wishes.
a wonderful 2005 to you too, Paul! and I hope your wife will recover from the cancer... take care..
Happy New Year Paul. One of my personal highlights was meeting you at this year's MVP conference in May. All the best for the New Year for you and your family.
Good luck on the goals. I make such a list too but don't let anyone know in case of failure. You will see me at the PDC though. Regarding User Groups: you will be welcomed at the C# group. Recently several more A-list developers have expressed an interest in joining the group. If the attendance holds steady then we will see a 'level 400' discussion every month. This Monday is more of a social, but in February we have a discussion on NUnit + TDD, March should be an in-depth coverage of GC and .Net Profiling tools. Happy New Year Paul.
Rock climbing's a wonderful sport. A lot of NZ programmers are into it - probably because of the problem solving similarities. It also offers instant feedback on your improvement. I.e. yesterday I couldn't climb this grade 18 climb, but today I've made it up. Wahoo! I try and go rock climbing at the local gym twice a week.
Let me know when you are going to a user group - I might tag along. Happy 2005!
>> Let me know when you are going to a user group - I might tag along. See I told you :) If Paul Wilson attends a UG the attendance shoots up. Seriously seeing more MVPs would be good for the community, but I realize the long drive in traffic most MVPs have when attending any of the groups
Its ok Paul. I'll always thing of you as nerdy, if you'll do the same for me. :-) Wally
I think you cheated. I got an 80 and there's no way I'm 235% nerdier than you.
A statistical anomaly, I assure you!
Nice! Congrats on the new release.
Do ORMappers have a place in a closed shop's ASP.NET application running strictly MS SQL server?
Do you want to cut your development and maintenance time by a significant amount? Do your users expect a lot of flexibility? See my posts at: http://weblogs.asp.net/pwilson/archive/2004/09/05/225827.aspx http://weblogs.asp.net/pwilson/archive/2004/09/18/231188.aspx http://weblogs.asp.net/pwilson/archive/2004/09/29/235834.aspx
Ah, you made my day by fixing the exception handling! That was a big pain when debuging. :)
I'm new to your mapper... "Better Exception Handling, No longer Catching and Eating Exceptions" The fact that you were ever eating exceptions makes me a little scared to use this in my applications... and to fix it in v3.1 makes me even more worried. I would put that into "bug fixes" rather than "improvements".
Travis: of course! Unless you want to write all that code yourself ;) " By the way, this is also the one of the few things that I think still makes my mapper stand out as unique against the likes of NHibernate, LLBLGen Pro, and EntityBroker. The others may have more features, and NHibernate is open source, but just try to use any of these others for the first time in 30 minutes, or just try to extend any of those to have a new feature you desire. " If you think your mapper is easier to use than mine you're clearly mistaken. For example, LLBLGen Pro doesn't require you to write mapping files, the generated code is ready to use and sports all the functionality you want, so you don't need to jump through hoops. Furthermore, I add new features every 2 months, you do too? LLBLGen Pro has a template system in place with multiple template languages and a task-based code generator which is more flexible than anyone of the competition. You can extend the code generator to extend the code you're going to work with with easy classes or templates. You want a unique filter element to work with the predicates used to filter on objects? Inherit from a base class and add 20 lines of code and you can use your own filter element in your code. For example full text search on MySql. "Of course the other main thing mine has to offer is provider support -- I don't think any other can claim to support so many databases. And that's not just a claim -- its also a reality that many have proven -- a reality that is possible primarily due to simplicity and not targetting every possible feature." How many databases do you really support, Paul? I mean SQL-92 inserts with no real functionality besides simple inserts... that's not that hard. Do you support sequences on oracle, sequences + identity on DB2, sequences on firebird? Do you support delete from from / update table from table on oracle/db2/mysql/firebird/access ? Can you do multiple joins of the same table with aliasses and filters targeting those alaisses (SQL 101) on oracle 8i AND for example sqlserver/db2 ? (so you have to implement ansi and non-ansi joins? ) Do you support aggregates, group by, having clauses on 'all these databases' ? You support just the very very simple stuff, of course you can then support a lot of databases. The non-ansi joins on oracle 8i alone break any generic db driver code. Support a lot of databases with REAL functionality requires some more code than a set of simple rules in a provider definition, Paul and you know that. The fact alone that you don't support 1:1 relations proves the fact that the code base is very simple. You don't deny that, but at the same time you praise yourself with phrases like that you support the largest amount of databases. I think it then depends on what your definition of 'support' really is. Btw, we too use a provider model, both for the schema driver and for the DQE engine, and so does NHibernate.
AJ: Its hard to disagree with that in general, but there was one exceptional case. Basically, people often have object A related 1-n to object B and object B related n-1 to object A. For the default lazy-loading scenario this works fine, but when someone turns off lazy-loading then this was a scenario where an infinite set of relations could become a huge problem! Since my mapper does not require a base class, its not easy to deal with some situations like that, so I found a way to cause an exception -- and I ate it on purpose since that was my intent. Unfortunately there was opportunity for other exceptions to get ate in the process. Anyhow, this is now fixed (not an easy thing to do), but while it was less than idea before, it was there for a reason and didn't exactly make the mapper unstable as you are maybe suspecting -- it was very stable.
Frans: please see my response here: http://weblogs.asp.net/pwilson/archive/2005/01/08/349145.aspx
What are your thoughts on Gentle.NET?
Hi Paul, Last time I used an OR mapper for a .NET project was in early 2002 when I ported the IBuySpy Portal to ObjectSpaces using the early beta framework. You should be able to find that still on GotDotNet (under my name David Taylor or DavTaylor). Personally, I am happy to wait for the final release of ObjectSpaces / WinFS. .....you have probably already guessed that I am a very patient man (currently I am assuming a 2007-2008 deliverable).
AJ: Gentle.NET seems good enough, but its too little too late compared with NHibernate. NHibernate, being a port of Java's Hibernate, has more than enough features and documentation, and it also already has a large user base and good stability (maybe great). I probably wouldn't even try to make my own mapper today if I was just starting out, but I started 18 months ago before NHibernate was around. Of course, since mine does exist I am glad -- since I do believe there is a market for simplicity.
David: Not only will you have a long wait, but I think the other mappers on the market have proved that MS OS will never be the best!
Wooh, was he really that upset? I use LLBLGEN, and I have to say I'm definitely a happy customer. It probably took me more than 30 minutes to figure it out initially, though, because I ultimately chose the self-servicing templates with base entities, which isn't the default. As for NHibernate ... I just find it more natural to start with the DB, to go R->O in other words rather than O->R. O->R mappers like nhibernate and wilsonormapper also require you to define your database twice (once in the db and once in the config), thereby breaking the DRY principle. With LLBLGEN's cmdline generator, I might even be able to just vaguely point at the database and say "uh, do that database over there and stick the code here" ... and get a full model with just those two config variables! That, combined with a magic assembly re-compiler, would be even better than Ruby on Rails, whose ActiveRecord is really, really simple, but still requires you to declare the tables and relationships. David: I've only been using .NET for 6 months, and maybe I got spoiled by the scripting world, but I've ended up junking layer after layer of MS-written frameworks. Now asp.net is gone for me, and I reimplemented it in 5 days and 500 LOC without all the negative baggage. Do you really think given their history that objectspaces is going to get even close to the hype?
Steve (and Paul), I was partly being sarcastic with my prior response, I mean....realistically who can now wait until 2007 or 2008 for any project you are planning right now? When I first worked with ObjectSpaces in 2002 (using a beta they released in late 2001) I had assumed it would come with .NET 1.1 in early 2003 (but of course it did not). I think you are being a little hard on Microsoft. I would much rather have nothing now from Microsoft, and use one of the great products available (from Paul, NHibernate, etc) and let Microsoft plan a coherent strategy. The worst case scenario would be for Microsoft to have 2-3 O-R mapping frameworks, and given WinFS is being worked on, it was the right decision to delay ObjectSpaces and try to merge or align the technologies. Can I also give you some advice regarding .NET? This is particularly important if you have come from another background (ie PHP, Java, etc). Programming has been one of the biggest parts of my life since around 1981 and.....over the last 20+ years..... the ASP.NET framework (particularly what is coming with Whidbey) is one of the best frameworks I have ever worked with. Whidbey just fills in lots of areas that were missing from the V1 release. It is just that any framework will seem "wrong" to you if you have never used a framework with similar concepts before.... You need to reset your way of thinking before things start to make sense.
Maybe he's going to be an NFL place kicker? :-) Terri
That is correct. You cannot manually create an assembly in SQL Server 2005 when logged in with a SQL-only account. This is because these objects need to be secured, and SQL 2005 also allows you to lock down who (or what roles) can create or modify these objects. I wrote an article for VSM that you might be interested in: http://www.ftponline.com/vsm/2004_12/magazine/columns/databasedesign/
I think it's a great concept. I've tried for it off and on the last year, with varying degrees of success. I was wondering ... have you looked at Ruby on Rails? It takes a R->O (db schema generating class hierarchy) approach, which I guess isn't as OO-pure, but it's really fast and automatic. ActiveRecord generates the data layer at runtime, and the "scaffolding" portion of ActionPack uses the data layer to automatically generate a CRUD interface for the tables. It seems to be really successful ... enough that I'm looking to emulate it in dotnet. I was wondering what your thoughts were on it, though, since as I mentioned a few days ago, WilsonORMapper seems to take a somewhat different approach of having config files listing tables and fields.
I am very, very curious on how you've solved the flexibility issue as I see many solutions all claiming the flex. But eventually you have a bunch of code you cannot really get through. Looking forward to your public beta :-)
Steve: I haven't seen Ruby on Rails -- I only heard of it for the first time the other day actually. Michael: I think my final version will be decently flexible, allowing people to build on my basic platform to better fit their needs. But its also true that it won't be as flexible as doing everything yourself -- but the point is that a UI Mapper should enable you to avoid the same old boring UI code, while enforcing more consistency than any other approach, which should suffice for at least most "admin" type screens, if not more -- you can always do the other screens one-off if necessary.
Lucky him
Hi, just wanted to point out that my project is not a object->ui mapper , its an object->object mapper which Mats Helander misunderstood in his blogpost. Also, the link on my name points to some company ive never heard of... unless there is another Roger Johansson there also doing a mapping project :P
As long as we're on the subject of bugs, I've dealt with one since Transactions were added. "Message: This SqlTransaction has completed; it is no longer usable. Source: System.Data Stack Trace: at System.Data.SqlClient.SqlTransaction.Rollback() at Wilson.ORMapper.Transaction.Rollback() at Wilson.ORMapper.ObjectSpace.PersistChanges(ICollection entityObjects, PersistDepth persistDepth) at Wilson.ORMapper.ObjectSpace.PersistChanges(Object entityObject)" It actually seems to be out of scope, and since I'm try/catching the service using it, and reinstantiating it every 60 seconds it's never been a showstopper for me, but it is annoying to get 10 emails in the morning from my exception logger. :) I tried to look at the code a bit when I first started getting this (after upgrading to v3 I think), but didn't understand the intent of the deconstructor for Transaction, so I gave up after a couple minutes. Anyways, still a great mapper, it's certainly made my job easier, really looking forward to V4! :)
Hey Sam: I still have not been able to reproduce this, and I didn't realize it was something you saw that frequently either. I'd love to get some code that I could reproduce it -- one other person mentioned getting this also, but that's all. Thanks, Paul Wilson
I'm sorry, but I can't find this info you're talking about on the mysql site. They acquired the library from ByteFX a number of months ago, and I can't see how things have changed since, according to http://solutions.mysql.com/software/?item=181. I've been using the old library and would like to see the new one, so any more information on this would be helpful. Thanks! Eric
Hi Eric: You can find it here: http://dev.mysql.com/downloads/connector/net/1.0.html It seems to be dated 12/12/2004, although I'm not sure how long its actually been available. You'll find the note on the syntax change in the docs of the MySqlCommand class. My understanding is that this new version will solve some pooling issues, but I can't claim to know anything experientially there.
I'll shoot you an email tomarrow if you'd like. Like I said, it's in a Windows Service that cycles every 60 seconds though, and I might get from 2 to 10 emails a day (though always atleast 2). So say 5 out of 1440 cycles throw this exception. And like I said, I haven't noticed it actually affecting the work (though I wouldn't notice if the work was still done on the next cycle). I haven't reported it before I don't think, so no one should take this as major. You can't fix what you're not aware of after all. :) Again, great product, the $50 has paid for itself many times over in what you've taught me. :)
Sorry Roger. The link and the content have been updated.
Ah. Thanks. That is very helpful.
The change happened in September to the best of my knowledge. If you watch the MySql forum on .NET connectors (http://forums.mysql.com/list.php?38), you can get feed back from Reggie Burnett, the creator of the ByteFX driver (to the best of my knowledge). Warning - make sure you download version 1.0.3 as version 1.0.2 had pooling issues resulting in your website to crash typically once a day.
Paul, I am not sure what you mean by a UI mapper, but if that is simply a tool for mapping entities to screens. Then I wonder if you will just end up creating screens that are functional but unuseable. To be useful I believe that you need to create a process model. So you can map from the data model to the process model and from the process model to the ui. About a year ago I got seduced by the false promise of mapping the data model directly to the ui. After a while I realised the screens generated where basically un-usable. Unless you were a geek. What do you think?
Just a FYI: The MySql .NET provider is GPL-ed. This means that if you compile YOUR code against that .NET provider, your code has to be GPL-ed as well. I'm not sure you do that Paul, but if you do, please be aware that their lawyers are very keen on this and it was the reason I opted for a commercial .NET provider for MySql (corelab)
Thanks for your thoughts Alex. I certainly don't think a tool like this will replace every screen, but I do believe that the vast majority of screens in most apps are very basic "admin" type screens -- perfect for a tool (whether it be code gen or a runtime meta-data "UI Mapper") to cut development and maintenance time, while also better enforcing consistency and adding far more flexibility than those basic screens typically have.
Frans: Thanks for that info -- another reason why I do NOT compile my O/R mapper against ANY 3rd party providers! I simply allow my users to specify their own drivers, which nicely avoids those issues, while also letting users choose what works best for them.
Paul, I really enjoy using your tools. For price and simplicity I am surely content with your mapping toolset. ...Work, busy work and material goals are temporary while faith, hope and love are eternal. As much as ORMapper vX.X etc has codies drooling clear your mind and help your wife through this difficult period with your focused time.
MySql example: http://forums.mysql.com/read.php?38,11958,11958#msg-11958
Paul, Yeah, I think you are right about Admin etc. I tend to think that if you need 50 screens, 40 or so will probably be admin, so your tool will help a lot with 80% of the screens. Don't you think however that the other 20% are the screens people use most? What I think is useful about your stuff is that it allows developers to focus on the VISIBLE code, which they can quite easily explain the costs of, as opposed to the less obvious ADMIN screens which are definitely required but are less likely to be understood by the client. I wonder if the answer to that 20% of screens which are process oriented and more visible at the requirements gathering and budgeting phase (which are used 80% of the time) is to create a distinct new model to define the data requirements of processes. Because the most used screens are task/process oriented not data oriented, So once you have a processes model you can then do UI mapping to it. Of course Admin screens are a good place to start, and can allow developers to forget about 80% of the screens that take 80% of the time. And focus on the 20% which are critical to the sucess of the project, so that has to be a good thing! Good luck, look forward to seeing your UI mapper when you've finished! Alex
That's bitten me before, too. Whenever I add column to a table that a view should now include, I just edit the view then save it, forcing it to recompile what columns are included in the "*". But the question remains, what's up with that behavior? It's reasonable to say that for performance reasons it needs to compile the query (leaving it static). It's also reasonable to say that for a small percentage of the cases that it is too computationally expensive to cascade a change in a table all the way down to all compiled views. Just my guesses.
Isn't this just an issue with enterprise manager? Does the samething happen in Query Analyzer when altering a view?
Creating my view in Query Analyzer as "SELECT *" will still take a static snapshot of the fields, instead of using "SELECT *" as I intended. And the system tables will still reflect that I created my view as "SELECT *" -- which isn't really what I have once I add a new field. But if you mean that Enterprise Manager can lull you into thinking you've updated it when you press the OK button then you are correct.
I've seen the same issue in SQL Server and Sybase. It affects stored procs as well - try adding a test column to a table, create a proc that references that column and then go back and delete it - the delete of the column doesn't complain that there are other "objects" referencing the column, but it will fail when you call it of course. I don't know for sure, but it looks like it doesn't do any type of checks for referring objects... as for your issue I would think the view got compiled and it replaced your * with a real column list which I think would be more efficient and since it doesn't do any type of reference checks it didn't recompile the view. Only options are to not use select *'s or to always remember to look at the dependencies on a table and "recompile" as necessary... neither of which are as intuitive or as easy as a select *... As a side note there is a similar issue if you refresh a table from say a production instance to a development instance (at least on Sybase) where it will appear to work and the table will be there with data, but none of the referring procs/views will be updated with the "new" table object so they'll all fail until you recompile them with no changes...
It is so good to know I am not crazy (still sorry for your pain). This happened to me a couple of years back and I've never used a View since.
Cached execution plan? "sp_recompile targetObject" will invalidate all execution plans referencing the target, and cause them to be rebuilt. So "sp_recompile myModifiedTable" would rebuild (on the next execution) the plan for the View, any referencing Stored Procedures, and cached Queries. I'm not positive it's a problem with the execution plan, but trying sp_recompile would verify that one way or the other.
I prefer the new way. You get precompiled pages, and you get rid of the double declarations for controls, which can be a mess when a page has a couple hundred controls on it. I definitely think the change in Code-Beside showing the inheritance chain in the code is good though. It was a little confusing to me that the code classes didn't inherit from anything. A little bit too much magic. :)
Not quite sure i'm understanding your rant? This is good for those who don't want others who have access to the servers to mess with their html source code, so i don't see what all the fuss is about.. it's not like it's mandatory :/ And this isn't anything new, they've been touting this pre-compilation feature since the announcement of 2.0. Also, shouldn't this make deployments for large webs considerably faster and easier since everything is already precompiled and pages don't need to be compiled when they're first accessed? Then again.. i might be misunderstanding your post :|
Stebet: Yes, you've misunderstood my rant. My rant is NOT about pre-compilation, which is a good thing in many cases. My rant is about the latest version of code-bewhat -- which appears to be getting just downright screwy. My side rant was that they took away one type of compilation, that of code-behind, in the new model -- and while I agree many will benefit from pre-compilation, many also benefit from the existing compilation of only code-behind. I'm saying that should have left code-behind alone and simply added pre-compilation as another option. Those that don't want the OO nature of code-behind would be served well by the new features in VS (intellisense and code view) for the single page model.
Sam's post reminded me - if you don't need it to cache the execution plan, you can include "WITH RECOMPILE" in your proc and it will recompile it each time... should make it handle the table changing...
When you save a view, I believe it adds entries to syscolumns for the fields at the time of view compilation. Like a stored procedure, it also stores the text version of the script that actually created the view in the syscomments table. sp_recompile will cause all cached execution plans to be dumped, and stored procedures will get recompiled on next use, but I am not sure if views get cached in this manner also.. as they really do not contain a set execution plan (different SARGs and joins on a view will produce differring plans). I have also seen cases of sp_recompile not being able to really locate all dependencies. There are some situations where it just cannot do so. I am pretty sure its just the metadata for the view being saved at compile time that causes this behavior. It would be horribly inefficient if the server had to recompile the metadata every time a view is referenced just to see if any fields were added (the idea behind a view is that it is static enough of a query component that you can store it server-side and use a synonym for the underlying complexity - it's not supposed to change). P.S. It's just not good habit to use "select *" in any permanent SQL. I weaned myself off of that years ago, and rarely even use it when doing ad-hoc queries in QA.
Uhmm... that's exactly what they did according to the article you linked isn't it? Use src= instead of CodeFile= and you get CodeBehind?
Hi Paul, Dont stress, they have not taken anything away. You now have the option of: a) Fully pre-compiling the site. b) Dynamically compiling everything at runtime. c) The old code-behind model (Fritz is incorrect this is not supported), just improved a little. Here is the post I just made on Fritz blog: >There is one claim I have seen made that this model also enables the pre-compilation of the code behind classes....(cut). But it does allow this Fritz. This is because your code-behind and original .ASPX file (both partial classes) will be compiled together into a single pre-compiled class. This class then becomes your page's bass class and at runtime your ASPX page will inherit from this base class. Then at runtime you can edit your ASPX file, (like you can in 1.x) and it will simply cause a recompile (again inheriting from your original base class). You are probably just confused because you figure "but what if I add a few extra controls to my ASPX file after the base class has been pre-compiled? They will not be added to the base class!". That is perfectly correct, but not a problem, because your base class never reference those new controls anyway. In fact this is exactly the same situation as we have today in V1.x with codebehind if you add a new control to your ASPX file using nodepad after the code behind was pre-compiled by Visual Studio. This is actually quite simple, and I think people are just confused because the ASP.NET team changed the way this is done mid-way through the beta process. But the end result will be quite elegant. There is current a lot of misunderstanding about the most recent changed because they are only available in the November CTP. Bring on Beta 2..... David Taylor
I am not up on all the changes to the code-behind, but I can see the partial page classes being really useful for having code-generated and customized portions of the pages in separate source files. I think we will see some cool code generation tools coming down the pipe that will exploit this feature, allowing us to be more productive and causing less of a chance to step on generated code.
I should clarify one last possible point of confusion: Fritz was probably thinking that it would be impossible to pre-compile your base page partial class, because it needs to be merged with a partial class with control definitions generated from your ASPX file; And this is completely correct...you DO need that ASPX file to be defined first in order to pre-compile your base class. But the point here is that whilst you do need an ASPX file containing the control definitions in order to pre-compile your base page class; at any time after this, you can edit the ASPX file like you can today in V1.x and it will be recompiled on the fly inheriting from your pre-compiled base class. The main question is "Is it better the controls are defined in the .cs file imperatively , or the ASPX file declaratively". Hopefully everyone agrees the latter is better. And guess what? If you disagree, and just want to define the entire base-class in code without needing an ASPX file to compile against (partially) - you can just do that by writing the class in exactly the same way as you would in V1.x. Just forget all this partial stuff and write an entire base class that inherits from Page. I hope we can get some agreement that this is "all good" and that Paul can edit his blog entry and remove the word "crap" ;-) Regards, David Taylor
Almost, but not quite, src is the same thing as it is in v1.1 -- which is code-behind that isn't compiled. That's certainly not what I want, nor is it really supported by VS today or in 2005.
I agree that partial classes are going to be very useful in code-gen scenarios, so I'm not trying to moan about partial classes. I'm just very dissatisfied with the use of partial classes in ASP.NET for code-whatever-we're-calling-it. Code-behind in v1.* works! And its very easy for anyone coming from an OO background to understand. It doesn't hide any magic from you -- it just works. Granted, it may have some issues for those tasked with building the VS designer, but designers are always difficult. As far as I'm concerned, all the changes from code-behind are being made either to (1) make the designer easier to build or to (2) make things simpler for non-OO web developers by hiding things from them. The original code-beside model in the previews didn't hide too much, since it was a pure partial class implementation, although it also was not going to be easy for anyone working without a cool tool like VS, unlike the standard code-behind of today. But this new model is just introducing too much trickery that requires a tool or a compiler to make sense of it all -- not at all simple unless you only work in VS. True, I can do pure page inheritance and avoid this, but now you're telling me that I can't use the tool to help me -- and yet I can today -- so this is a huge step back for OO web developers. Let's stop and think about what we're saying. We're saying that protected declarations in an abstract base class are too confusing! And I agree they are to far too many web developers -- but those are the developers that should be using a single page model anyhow! Corporate developers, as opposed to hobbiests, are the ones who should be using code-behind -- and they had better learn OO in .NET and not have us start hiding things from them and having everything magically work at either compilation time or runtime! So what I want to know is if you don't like code-behind in v1.* today, then why don't you just use the single page model? You can precompile that too, so I really don't see why precompilation keeps being the rationale for a lot of this crap. And I do not intend to remove my description of this as crap -- it was crap when it was first shown to me, it was crap when I first showed it to my team of OO developers (and I was trying to defend it then since I decided to go along with the crap), and its crap now.
I agree with you Paul, src= is not an option for me. I do not deploy or distribute the .cs files with my web applications. So looking at the only remaining option which is CodeFile=, what exactly does that mean for me, when up till now I deployed my .aspx files and my precompiled dll's in the /bin folder. I still don't think I have gotten my head completely around it.
Yeah, I've found that the SQL behind a view needs to be recompiled. You can do this in Query Analyzer by choosing to alter the view in the object browser and execute it. This is much better than dropping and re-creating a view as you don't lose the permissions associated with it.
I have a better one: try doing this: Add a field IN FRONT of existing fields, and pick a totally different data type. Any of the views that use SELECT * FROM [Table] exhibit the odd behavior of returning the original column's data transposed into the new column's data.
Views are created, well, when they are created. Specifying all fields (*) results all fields at creation time.
You might try compiling the View with SCHEMABINDING. This will at least remind you what views need to be recompiled when you change the schema of the underlying tables.
I have to agree with your estimate of the difficulty of figuring out LLBLGen Pro the first time. I've installed the demo twice. Most recently, I generated some code from some simple tables and then used NDoc to create documentation for my code, which I then started reading and trying to figure out how to perform data access. After more than 30 minutes, I still had not had data access. Is this my fault for not looking for examples or LLBLGen documentation? Or should I have been able to figure it out on my own? I don't really think there'e a right answer to these questions. I've written my own data access generation templates with CodeSmith. The entire development team where I work uses my templates because it saves them a ton of time and they are very easy to understand and extend. We aren't elite coders for the most part. Only 20% of us even have CS degrees. But we're good at what we do (making web sites) and these simple templates are good enough most of the time. So I agree with what you said, that sometimes a simple O/R mapper is better than a monstrously complicated one.
Paul, I just think you are being way harsh. I mean you seem to be suggesting the new model will only be easy when using a tool like VS. This thinking is just backwards. I think the opposite is true and people could only use the V1.x codebehind model when they use a tool like VS than manages both the ASPX and control declarations at the same time and keep them in sync. The whole point of this change is so people can use simple tools like vi/notepad and use the code separation model. You seem to be defending the V1.x codebehind model which was always ugly and broken. It was just problematic to define your controls both in the ASPX file and also in your page....Then if you renamed your control in you .cs file but forgot too in your ASPX file, guess what? a) Your code would compile perfectly. b) Your code would run perfectly, but you would end up having a second control with the original name that was not "correctly hooked up" to your code. This is all wacky and wrong...and quite rightly identified by the ASP.NET team at 'brittle'. David Taylor
Hi Paul, Actually, I forgot to mention that it is way more than that...... Both models in V1.x (single-page or code-behind) you never really knew if your application would compile until runtime. In fact you would have to 'hit' every page in your application at runtime to find out if you had any errors in your ASPX page because the ASPX page was only compiled at runtime when the page is first hit. So not only have they simplified the model with V2.0, but they now fully support compiling your .cs page (partial class) against your .ASPX (partial class) and thus immediately find errors in control declarations, etc. But more importantly, they compile your 'entire site' when you hit the 'build' button. Thus Visual Studio 2005 will, for the first time, compile everything you have and tell you at 'build time' instead of 'runtime' if there are any errors in your code. This makes me want to jump with joy! Because we are getting all the benefits of strong static typing, with an environment that feels like everything is dynamic. :-) Dont worry....Be Happy... (I will sing for you Paul). David Taylor
When I change the underlying tables I use the "sp_refreshview" system sproc.
I do agree that adding the pre-compile/build option was a good thing, but I think that could have been done with the old model too. And while I do agree code-behind in v1.* is "brittle", it certainly is not "ugly and broken". Its pure OO -- that may be "ugly" to many -- but to many of us its not at all ugly. And "broken" -- I'm not at all aware of any thing in code-behind that is broken. So yes, they are right to make some tweaks, and a pre-compile/build option is very much appreciated -- but that doesn't justify all the hurdles and magic of the new system -- nor the loss of the current deployment model.
What's up with developers using SELECT *? Do you guys have lazy habits in the language that you code in? Why do it in T-SQL? SELECT * is a performance hit. Regardless of how minimal it is, it still is a hit.
Good question Matthew -- I don't usually do this, and certainly my mapper never does this, but it seemed like a simple and quick thing to do at the time, and I knew the underlying table would very likely change so it seemed "safer" to use SELECT * since I thought that would automatically work in the future too. Oh well, you're right, there's apparently no excuse for laziness! :)
Tod: I just started looking at o/r mappers. It sounded cool, but it was/is very new to me. I searched a bit and found Wilson's, LLBLGen Pro and EntityBroker. I installed Wilson's: looked v. simple and reading a bit I found that I was looking for more functionality. Installed LLBLGen and generated some code in like 10 min. I didn't really understand the code just by looking at it so I installed EntityBroker. It installed but didn't work (crashed on db connection - some bug). In addition Thomas acts like he knows everything the rest should live to admire him - not to nice working with people like that on the long run. I droped EntityBroker but I didn't want to give up on o/r mappers yet so I went back to LLBLGen and opened the help - yeh, I know :). After max an hour I understood the generated code and realized that LLBLGen pro is great ...
Paul, >> nor the loss of the current deployment model. See my other comments above; you can still use the current deployment model. Maybe what you are missing is that there is a new command line compiler supplied specifically for ASP.NET (in that it understands how to generate a partial class from your ASPX page and precompile it against your partial .cs class). This new command line compiler is not a "special thing in Visual Studio". It will be a standard part of the SDK. It is with this compiler you can do the precompilation and end up with the current model of deploying a DLL, but still leaving the ASPX page in the server for editing like some people wanted. Does that help? David
You may be right that the existing model is there, but Fritz also didn't seem to agree with you there -- but maybe. But I still believe there is simply no need for all this crap when what we have was working perfectly OO, and since we have improved single page support now too. It just feels like you are defending the ASP.NET team's decision instead of looking at the bigger picture and calling it what it is -- and I did that for a while myself so I can relate. Its so easy to get caught up in defending our baby when we're MS ASP.NET devs, but we also have a responsibility to be honest. That was exactly the issue when they first showed this to me and the other dozen people at the first private preview -- we all thought it a bad idea and they "convinced" us that it was a good thing since it was a "brittle" model and too "hard" for newbies. But there's something seriously wrong when the ASP.NET team has to "convince" the very experts they invited !
"SElect *" is jsut shorthand. A lookup is necessary to execute that statement to determine what columns are to be included. That's why it is a fraction slower to do an ad hoc query like that. Like others have alluded to a view is compiled the first time and since nothing changed it didn't recompile.
AJ/PW: Gentle was actually quite useful even before NHibernate matured to a useable state. NHibernate has a nice query facility (an area where Gentle is somewhat lacking), but has improved on many other accounts. I'm probably biased :), but think it's one of the easiest frameworks to understand and get started with. And with the MyGeneration template on top it really takes no time to create a simple but functional DAL - enough for a lot of people.
Look at my blog describing a little piece of art, it helped me out within 5 minutes with all my SSL issues: http://www.netindustry.nl/blog/2005/01/setting-up-ssl-in-windows-2003-xp.html http://www.codeproject.com/aspnet/WebPageSecurity_v2.asp completely bypasses IIS problems, just disable it there.
Well I never said that setting up SSL for auto-redirects was "hard" or that it would take more than 10 minutes -- just that there are some gotchas to watch out for. I still prefer doing it in IIS personally, instead of having to learn and include a 3rd party module, but its nice to see alternatives anyhow.
Paul, I did convince Fritz. Anyway, load the November CTP onto a machine (do not try this with the December CTP which has an older framework). From a .NET command line prompt (or in the .NET 2 directory) type: aspnet_compiler.exe /? To completely precompile your app, removing all source (even ASPX source) do this: aspnet_compiler.exe -v /MyApp -p c:\MyApp c:\Output To do what I have been "trying" to explain use the -u option (for Updatable), as in: aspnet_compiler.exe -u -v /MyApp -p c:\MyApp c:\Output This will basically precompile your partial class against your ASPX file, leaving you with a precompiled DLL as per what you have with .NET 1.1, and leaving your ASPX page alone so it can be edited after deployment (as per the 1.x deployment model). Obviously.....You need to use a new compiler, because the csc.exe compiler (and vb compiler) will not understand how to compile the ASPX into a partial class.... I hope that helps clear things up. Note the compiler is a core part of .NET 2, not a special thing shipping with Visual Studio David Taylor
Actually, after reading further, it will be possible for hosters to enable this, although its a different issue about whether or not they should or will. The solution is that you can assign a Windows credentials to a Sql login -- so a hoster would need to create a Windows user account with permissions limited correctly to that user's directories and then assign those credentials to the matching Sql login. That's certainly doable, but I still have to believe that most shared hosters will not offer this functionality -- but we'll see. And I'm also still not convinced there's enough reason to allow it when you consider that opening up this door could potentially open up some security holes or hurt performance (maybe not though).
Again, great product, the $50 has paid for itself many times over in what you've taught me. Amen to that!
My only complaint is that it does not map Views. I'm not sure what it is going to take to add that ability, but I'm working on it.
Found this on Paul Wilson's BLOG this week - http://weblogs.asp.net/pwilson/archive/2005/01/17/354781.aspx...
Looks like its MySql compatible as well; great update!
[UPDATE] He made an update so views can be mapped and generated.
I've heard you mention the Beta... is this available for download anywhere? Would love to get my hands on it and provide feedback. -Michael
I did have a private beta that started back in July, and I've been taking the feedback I got from that, when I had time which has been a huge factor of course, but I'm now almost ready for the final release so there isn't anything I can give you until that time. But please take a look at today's blog entry and give me your thoughts -- that way I can make it what people want and finish it this month hopefully. Thanks, Paul Wilson
Paul, I started to leave a comment here, but it turned into a dissertation, so instead I put it on my blog: http://danhounshell.com/blog/archive/2005/02/03/314.aspx Thanks, Dan
Whoa. I definitely want to participate and give you some input, but it's going to take some time to process everything you've presented. You've thrown out a lot of questions and ideas here. Exciting stuff... let me chew on it a while and I'll get back to you.
Did you obtain any professional help as far as graphics for your demo? I'd hate to try to get my boss to buy something when a demo only has "programmer" graphics.
You'll be able to swap out graphics, as well as any text. Also, my web controls expose css styles while windows controls expose things like fonts and colors. Of course at some point you may want to modify the source for these controls to get your own look, but you'll still have the benefits that the general framework brings.
Paul, I am looking forward to seeing what you have put together. I think the concept is great and that once we start palying with it more we will be able to run with it and perfect it. Another person talking about UI Mappers is Johan Normen. http://www.nsquared2.net/johan/viewpost.aspx?PostID=117
Long ago I paid the $50 for a subscription to your suite of code. Your contribution to the community (open source) and your offerings are more than worth the $50. Initially I am not even sure you should release any of code for free. Demos of compiled source are good for people to get a feel for the tools, but those who will extend and build on top of them are most likely the paying folks anyhow. You have my vote for a subset being open (as a learning tool), but the bulk of the source being for those who appreciate your efforts enough to send the $50.
I can't think of any examples that were open source for the framework and pay for an enhancement that ended up being big open source hits. Imagine if nunit(junit) offered the framework for free but the console/gui tools and some of the assertions cost $$$. Imagine log4net or .Text asking that some features cost extra. People who really needed it would pay for it gladly, just as I did with the Wilson O/R Mapper. However hobbyists and students, enthusiast level developers and folks who didn't _really_ need it would probably pass it by and its overall level of adoption and saturation would suffer. It's a gamble for sure. I think you may be on top of something big here. Making it open source and putting it in sourceforge and getting other developers behind you could make Paul Wilson and UI Mapper very important but theres no guarantee that you would make a dime off of it. But asking a small fee for the extra goodies would be a sure way to get some level of reimbursment for your efforts. You have my $50 or whatever it ends up being regardless of how you decide to distribute. I'm sure you wouldn't see nearly the response, but a full open source release and a Donate link might be just the right compromise. Cheers, Street
I suppose there should be a demo that's free to download and try out. I think someone needs to be able to plug it in to see how it works, but they don't need source. I've built UI mapping tools in the past and have been thinking about doing something for .Net. Your UI Mapper might be a nice solution, so I look fwd to seeing a release.
I think you've hit on one of the most difficult things to decide for a freelance developer, to Open Source or not. My opinion is that you should go all one way or the other. Release it all under open source or pay a subscription for all the code. I feel that just releasing the framework with out controls wouldn't allow one to completely understand things. Conversely, a model that seems to work for DotNetNuke is to release the framework with a complete set of basic controls and then sell more advanced controls. That same model could work for you. Release the framework and a basic version of all the controls and sell more advanced ones. Also, in my opinion, just releasing as open source doesn't mean it will become a standard or even be noticed. Your writing and publishing articles does way more to attract attention and get people thinking about a new concept then just releasing some code. Maybe you could just "publish" the framework. Do a series of article that explain UI Mapping and the interfaces and how they interact, complete with code examples. Keeping in mind that you’re not marketing but teaching. Then charge the $50 for the subscription for the full source code. Those are my ideas, hope it helps Paul Welter
I would say that based on my use of DNN that: 1) there is a small learning curve to get past. 2) while I am not aware of any "Huge" sites I see stuff that indicates a *LOT* of use of it. 3) I see the "Key" to DNN as learning how to work the "Skins" that is where you use the CSS skills and the "Master Page" skills to bring up a site ... 4) there are some folks who can make some darn good skins for you, look at the DNN home site and follow the links. how a DNN web looks is a function of the "skin" think of the "SKin" as DNN's "Master Pages" and you can bend it to any layout. One last thing: when you have the skins and first set of pages then *EDITING* the content is something you can turn over to any decent writer.... thats a nice thing ... I have shown folks that they can edit the content and don't need me unless they run into a problem or want a chnage in the layout and Gfx. also look at the work on DNN 3.0 it's looking sweet!
I don't know what you're looking for as you seem to express some negative perceptions to DNN already. As for Master Pages, and the like, I don't know many clients that are going to want to develop a solution based on a beta product. DNN has positives and negatives, and I would guess that many perceived negatives are due to lack of knowledge of the application. I run a rather large community site (WWWCoder.com) all based on DNN, I get over 5000 users per day, and it runs fine for me. I had to do very little modification of the application. Most of my mods were for performance, but the issues were not something unique to DNN (viewstate moving, compression, HTML formatting). As for load balancing, in my day job I run a large corporate site load balanced across three servers running DNN. We have no issues. The reason you don't hear about larger corporate installs of DNN, is simply because most companies do not make the information readily available. As part of any infrastructure security plan you want to provide the least amount of information possible about what you're running. It isn't that DNN isn't being used in these situations, it simply is you don't know about it. I know many DNN implementations that you would have to be rather intimate with the application to release that the site was running DNN, due to some reworking. As for modules, granted most cannot be used straight out of the box, but the great thing is that they usually come with source code. And there are some that are usually close to some functionality I want to do, now I can save many hours by just modifying the modules instead of writing from scratch. In addition, there is a huge offering of modules, over 300 both free and commercial, I don't think you'll find that writing some custom ASP.NET app. On top of that, me as a corporate project manager, if I teach my developers how to write custom modules, I know they are using the same standard across the board. And any developer can easily pick up after another developer since they all use the same principles. With security, roles, administration, logging, batch job processing, SQL tools, skinning, and all the many tools that DNN provides I don't have to worry about it. Then there is support, granted you can write a custom app, but what about when you're not there to support, or you want to advance on to higher prospects. If this is an app you wrote, then you're pretty much stuck supporting it. If this is DNN, then you have about 100,000 or more folks out there who are familiar with it. In addition, there now are people offering training programs, two books, forums, and many sites focused on DNN, providing you with more support resources. Imagine posting a Monster job, and saying one of the skills is supporting your custom app, then posting another for DNN module developers, at least the second description they'll know what you're talking about.
Wow Paul, is your enter key broken ? Every time I look at DNN I get totally turned off by the OBSCENE amount of viewstate it creates. There is next to nothing posting back on the front page of a DNN, so why the 80k of viewstate. I realize that broadband numbers are growing, but that doesn't mean the experience should suck for dial up users.
We've been using DNN v2.12/2.04 for about the last 8 months at my workplace, mainly because it allows us to get a basic site up and running very quickly. Out of the box, the user/role management and ability to add modules relatively simply is quite nice, however I do have a few problems with it: - The default modules are very inadequate. Very few of our clients have been satisfied with any of them, so we've ended up re-writing or purchasing new modules on an as-needed basis. - While it's a nice modular framework on which to build, there's absolutely no working Edit/Publish framework at all. This is a large hole, IMHO, and while you can implement this by creating or buying different modules, its still feels far from being integrated. - Integrating with Active Directory is possible, but is a pain in the ass in v2. I believe v3 may have fixed this. - Its an absolute nightmare trying to develop accessible, CSS/xhtml sites using DNN. There's code scattered throughout the codebase that will insert tables for no discernable reason, which can easily mess up your designer's pixel perfect layout. Over time, we've been able remove most of the offending markup, but in general the markup generated by DNN spawns from somewhere deep within the last century. My feeling, and your situation may be different, is that DNN has helped us greatly only because it allows us to get a working framework for users/roles/modules up within days. This gives the client something to look at right away, which is essential for us. But if I had the time to create my own, simpler, custom framework I would do so. You won't regret it. As for performance, it's definitely not fast, but we've setup installs for companies with over 1000 employees. I'm not sure on the actual stats regarding concurrent users are, but the sites seem to be running alright. Hope that helps.
Maybe I didn't make it clear enough, but my client is NOT wanting your typical DNN community site with announcements, events, document links, and similar "CMS/Portal" type features -- which seems to me to be the reason to use DNN. What I want to know is what does DNN give me if I am going to have to write all custom content anyhow, and by content I mean business logic and screens, not just static content. I do NOT mean to imply that DNN is not a solid product at all -- I just doubt that its of much value to serve as the basis of a custom business application, and I'm of course wondering about its scalability and performance since my client expects a very large multi-server site.
Personally, I feel that when you're going to have lots of custom content, DNN won't be of much help. The only area's where it could be benificial are exactly the area's that are already covered by your existing toolset (Masterpages, navigation, security). Maybe you could leverage some of the built-in caching capabilities of DNN but I don't know how easy it will be to integrate that with highly customized modules.
I'm mostly a DNN consultant / developer so its hard to not use DNN for everything, that would be like biting the hand feeding me so to speak. I think you'll get a lot of similar loyalty from most other DNN developers, the good ones should know better but many don't know anything else. What I'm trying to say is that DNN does not really give you anything special if you're not building a community or corporate portal. It will actually make things more difficult for an enterprise custom application since you'll end up modifying the few modules you can use while being more constrained in your entire architecture. There may be many DNN developers that you could advertise for when you're staffing, but you'll find that most are still not up to your standards just like you will find if you advertise for basic ASP.NET. Lastly, performance and scalability on large sites with DNN requires lots of tweaking so while it shouldn't scare you away its also not giving you anything better than your own custom code.
Ditto Joe. Its great for what it is, but its not sliced bread. And the tweaking needed for large sites is not worth it; its both hard and time-consuming as well as limiting your upgrade path.
I have just completed a short 2 month project using DNN. We had an average of 3 developers working on the project at any one time, primarily developing custom modules. We did not use any standard modules, although we purchased some 3rd party ones. The benefits for us were: * no integration problems - developers could work on their modules with no special knowledge of how it would fit in the site, or integrate with other modules. * portal-type functionality - the site is a community portal, aimed at multiple markets, each using their own skin variant * user-editing - the CTO of the client can add pages to the site with relative ease. * the minimize-maximize feature of individual containers was a plus for the client. Downsides were: * learning curve, about 3 weeks to get asp.net developers up to speed * page sizes are a little larger than I would like You can see the site at http://www.zcampus.com/campus/indiana/
I have found that the concept of DNN modules is great, but for my commercial work, I like to unbundle them from the wrapper. For instance, I have a nice server control which wraps the FreeTextBox and makes a little database field include for my pages. I find that I can build a completely custom site for a customer, and just drop this module in where I need some user editable content... My clients cant handle re skinning their sites, so features like allowing them to upload new skins and completely change layouts would be total overkill, not to mention confusing them with too many options... Dan
I 'have' to agree with paul. I haven't yet build a site that can be fully rely on the modules of DNN. Therefor I am much faster done building my own, then having to integrate them with DNN. Even if it all would work. The client will hold me responsible for any faults in DNN. This while most of it would be written by myself. It would take up quite some time to get a full understanding of the complete framework. In building it 'all' myseld I can identify the probelems without having to see the actual code in front of me. Still I haven't seen any site that can be build solemly by DNN modules, even with 'small' modifications. So this is how I feel and this is why I agree with the statemnet Paul is making
Just remember Paul.... It's not illegal to earn a few bucks for all your work. 50$ is not the world and everyone (serious) should be able to spend this. I really like open source, since I can see how people smarter (and sometimes dumber ;o) than me, have solved different problems. On the other hand you shouldn't just give away (alot of) hours of work. I've never regretted paying the 50$ and when you look at other .net products (mostly without source code), it's almost theft at broad daylight ;o) Looking forward to the product. Thanks for everything... Rasmus Lindgren
Just to update the dabases that your Wilson mapper supports.... I use your Wilson OR Mapper with your ado xml provider (ok, slightly modified... and... It's not really a database ;o) Best regards Rasmus Lindgren
I think you are on the right track here- its a razors and blades issues really. An Open source engine will help to add community value and provide a solid base which others can build on- and your paid for controls are there to make peoples lives easier- or they can build their own/grab others open source ones. Either way I am looking forward to seeing your efforts. Ben
I just started using DNN for a corporate "extranet" portal. It's essentially a place for the BOD of the company I work at to collaborate via discussions, manage contact lists, and documents, etc, etc. In this case, DNN was perfect because it allowed me to put something together mostly with cheap 3rd party controls. I've built 3 custom controls myself counting for no more than 8 hours of development time. If I was in your situation, where I would probably be rewriting everything that is an asset to using DNN anyway, I would go my own way.
I can not imagine DNN providing even the slightest benefit to my development. I can imagine it is wonderful for extranet b/c most company extranets are exactly the same...provide a login screen, provide access to some database info, display content and there are a few admins that control security and role based access. No software like DNN is going to help me unless I'm running something like a shopping cart site or a company extranet. If I was developing one of those I would certainly use DNN. The applications that I currently build are so niche market that the things I need it to do would require too much meddling in DDN that it isn't worth me time.
I looked at DNN, and found it to be targeted to personalized community websites with many users having accounts. What I needed was a web application framework. Using some great ideas that DNN made popular, I started creating my own web application framework. Each page is configurable for the title, template, theme, and plugin (or module in DNN-speak). The plugins can be any user control. This way, I have the shell of the site abstracted away with the default plugin being a plain content editor that saves away the html to a database. The basic for a CMS. Now, I create my custom screens all within a single user control that can be plugged into any page. I use a single user control as the entry point for the custom app, and it deterministically loads other user controls as it needs them (each user control is a screen or part of a screen). It works very well, and my site can host one or many web applications. In the future I may extend it with a portal plugin that could target a community site. Probably with the advent of .Net 2.0 we'll see several commercial application frameworks emerge.
Hey Paul, I'd have to agree with what Paul Welter has suggested. If you want it to become widely adopted, release the source for the framework and basic controls. Sell more advanced controls - unless you're not really interested in control building. Could you think of a sensible way to release a cut down/limited version of the listview? I think releasing it for free, and writing articles will get the widest adoption. If I got 1/10th as much use out of it as I do out of your O/R Mapper I'd happily donate another $50. However, wanting to move from a basic version to a more advanced version would probably make me realise that I've not got enough use out of it to hand you $50. :-) Good luck either way.
First, I'd like to state nice update... There are a couple of tweaks id like to see... First it would be very helpful, if the tables in the mapping.config were made in alphabetical order... if you have lots of tables it is hard to find the one your looking for... Second, on the entity update, I was already doing something similar... I created a base class (ORMappedObject is what I called it) which I inherited which had most of this functionality... As almost all of these new methods are not typed, or can be typed generically that is; and this mod seems to generate alot of redundant code... Any chance we could see something like this worked into the template? Dan
I recommend that you make any comments in the thread at CodeSmith since I'm not really working on the these templates myself -- although I think they are great. I also think the point of the CodeSmith templates is of course a sample set of templates, since unlike my ORHelper you can alter the templates yourself. Thanks, Paul Wilson
From a user perspective, I enjoy open source applications released under non-restrictive licenses, such as the BSD or L-GPL licenses. But that's the selfish side of me speaking. From a software author perspective, it's all about what will drive adoption of your solution. I can really see the open framework approach, but I don't think that selling advanced controls will drive sales (unless your framework becomes the new "Infragistics.") Perhaps open source the whole thing, but require a paid license for commercial use. This means that it will be easy for people to experiment with your framework, but if they wish to use it in a "Production" application, they are required to pay. At this price range, you have 1. People who would like to compensate you for your work. 2. People who will never pay a dime to you. What you should provide is an easy way for "Corporate" customers to expense or be invoiced. This is also why "donation" buttons are of questionable value here - I (and many others) need to be able to take a price sheet to my boss and say "I need this. It costs $x". Make it easy for people in Group 1. Group 2 may help drive adoption, but don't waste too many resources worrying about them.
Is this really on a Saturday?
Yes, that's one of the goals of the new code camps -- to be developers for developers and not interfere with work.
I feel about the same as Jeremy on the 2.0 thing. One look at Carlos' Intranet sample using web parts @ http://www.carlosag.net/Articles/WebParts/intranetSample.aspx indicates (to me at least) the whole portal concept being changed/modified/upgraded.
Hi Paul, I think that if the price model you have used with the ORMapper has worked for you so far, you should do the same again. The product sounds useful and the $50 price is quite reasonable. I'm not sure if 'open sourcing' the main tool will be of benefit or not. There are many open source tools out there and they can be instructive and useful. However, I believe in making money for my effort and I think you should too. As long as the price is reasonable, I do not think most developers will mind pitching in. I do not necessarily think an open source portion will drive sales of the rest. I also think you will lose some control if you open source it. One of the things I like about the model you use for ORMapper is that I know who controls the direction of future development efforts and who to speak with regarding questions and suggestions. I like having the source because if for some reason you fall off the edge of the planet, I am not left high and dry. Most of my clients want the source for the work I do for them. I think a solid, functional demo is important for a reaonable 'test drive'. If I could not have had a decent test of your ORMapper stuff, I probably would not have adopted it. However, the source code *is* important to me for adoption. The price you are contemplating makes it a no-brainer for me. Anyway, bottom line, I like the way you have done things so far. I am looking forward to the product rollout. Thanks, -Dean
I'd love to see you present something. I think my personal preference is to the O/R mapper over the UI mapper, but that's just me.
Its not possible as they are using different versions of the framework and even you will succeed in some way installing it you wont be able to develop sql server store procedures using the december ctp.
Everything that I have heard or read states that you must run the build of VS from spring 2004 with SQL 2005. There is supposedly another beta coming through the pipe soon (March maybe?) that works either with the Dec VS 2005 CTP, or possibly a pair of new matched CTPs for both VS and SQL.
This is why Dec CTP doesn't support single-server install of Team Foundation Server.
Not possible. We tried it here in our office and we 3 had separate frameworks on 1 PC. 1 for VS 2003, 1 for VS 2005 and 1 for Yukon.
Out of curiosity, why don't you use VirtualPC or VMWare?
I may yet use VPC for some aspects, but I view it more as occasional testing instead of serious work due to performance.
This has been a real pane for presentations... I have not seen any good work arounds other than VPC or multiple machines
Oh wow! I use location.href all over the place in my apps! Thanks for the tip.
kind of a strange scenario, isn't it?
Hi Paul, Congratulations on getting it out the door. I can't wait to give it a spin. Tim.
I think you forgot to pack the documentation with the download, or is that downloadable from another URL? Did you receive my reply on your email btw?
I tried what you wrote, and it's working just fine (Both on IE and Mozila).. Why don't you change your proffesion instead of saying Mozila is not working well ???? Hate Microsoft... Hate people who say Mozila is lower then IE...
Looking at the UIMapper right now and ... Wow.. This is some really powerfull stuff you've written.. I must say I am searching my way through code and functions, a small user document might be handy. But the first experience counts and that is ..GREAT STUFF..
Hmmmm, I never said it was "lower" or not working -- I said there was an oddity. I use and recommend FireFox -- but I'm not a MS hater -- nor a MS drone.
Documentation TBA. :)
Great job, Paul. Congratulationson the v1 release!
Paul, congratulations for v1! I'm looking forword to check this out.
One of the things I love about your attitude is that you don't hesitate to pay compliments to competitors products. It makes me feel like you offer a balance opinion. Thanks for this post on Mats work.
Perhaps renaming the WilsonORMapper could do wonders for its success. No offense, but I'm very hesitant to use anything that reminds me of Dennis the Menace. ;)
Why not try the CTP Feb versions of both products? It runs like a charm on 1 VPC.
Good call. Come on, guys, grow up and move on. People like old country dirt roads until a big rain comes and washes the road away. Pave your applications with .NET asphalt.
I've seen some appalling MVPs too (especially MVPs in Server software where the advice was just plain wrong). The fact that some MVPs are signing the petition shouldn't give it any more credibility. Unfortunately, it might convey some credibility to the untrained eye. Perhaps that's an argument for MS to re-axe the MVP program.
> although I prefer C# now. Which is kind of the point. One of the major side effects of this change is that VB is no longer the largest development community in the world, because so many devs switched to C#. And that's a big change from the Way Things Used To Be. It's why there is (currently) no version of Resharper for VB.NET. If you want to be a part of the largest, most popular development community in the world, you don't pick VB. Not any more.
It's amusing that the very people defending VB.NET are, ironically, illustrating precisely why VB.NET is in such trouble: I just want to make it clear that I am one MVP that does NOT intend to sign this petition about...
The point your blog misses is that Microsoft has not only dropped VB6, but also hasn't provided a usable upgrade path. To ask for one is not either pro- or anti-NET. It has nothing to do with .NET at all. To accept that Microsoft can get away without providing an upgrade path should be a worry to you. The key people in the developer tools division at Microsoft seem to have lost sight of the concept that a language and a platform are two separate things. Platforms come and go. What will you do with the code you have written and need to maintain when the .NET platform goes and Microsoft abandons the languages that formerly targeted it? Of course, it will still be available for a while even after Microsoft stops selling it, so people will tell you "C# hasn't gone away, carry on coding in C#". But the time will come when modern platforms no longer support the latest version of the framework you can still compile to. At or before that point, you will be faced with abandoning all your code and starting again in a new language. If anything, as a programmer in a new and untried language without any track record in long-term stability, it would be in your interest for the petition to succeed, simply to concentrate the minds of the people at Microsoft on the need to allow developers and application owners to preserve and manage their code assets, lest Microsoft pull the same trick on you in some years time. So how about a signature from you?
I disagree that there is no usable upgrade path. I can only assume that you think a usable upgrade path means that you will not have to make any modifications to your code, but that's just not realistic. So get over it -- no signature from me.
I agree with Paul's statement above on this. I had no problems converting my apps from VB6/ASP to VB.NET/ASP.NET and now that I have learned .NET there is no way you could get me to go back to using VB6. If it's that important to you guys that you don't have to write any code to upgrade your apps, then quit bitching about it and write a migration tool.
I'm not suggesting that there should be no rewriting at all. But the claim that the migration wizard can do 95% of the work is a sick joke. If it could do 95% of the work, then adoption would have been higher. There's not reason in principle why it couldn't. As for building a migration tool myself, I have a business to run and code to write. Building a migration tool is probably more of a cost than doing it all by hand. If you think it is so easy, write it yourself and give it away to enoucrage people to migrate!
Why would I build something I don't need? I'm not the one complaining about having to migrate my code. And it wouldn't make good business sense for me to encourage people to migrate, the less people that do, the more work there is for people like me that already did.
Are these VB6 guys still writing NEW applications in VB6? If so, why? If they are just talking about migrating old code to VB.Net, then why? Doesn't the old VB6 version still work? Do they still have clients on Windows 3.1?Applications have a limited life. They need to be replaced from time to time - or at least substantially updated. This is the time to make the switch. The whole argument just doesn't make any sense to me.If they want to stay in the 80's with bad hair and shoulder pads then let them. I see no reason to sign.I'd like to start an MVP petition for MS to NOT continue working on VB6. It's wasted money that could be better used on more modern and useful technology.
Sometimes I just wish a platform will die a dignified death. Windows 3.11 was such a beast, and later, I looked forward to not having to support Windows 98 versions of software. I feel the same way about Visual Basic 6.0. I suppose that around 2010 I'll be greatful to drop support for Windows 2003. Of course, there'll still be the "Windows 2010 VB/COM+ Virtual Machine" to deal with.
I don´t sign, because i don´t think that it would make any sense to do it ;-) <the VB6 aera ended, and i have to move on - if i enjoyed the aera or not, and no petition in the world can bring me that aera back. Same is happening right now with VBA aera ...> @Jonathan: If upgrading from a car, which has a motor driven with firewood to a one driven with gasolin, there are some changes for which you could´t and wouldn´t want any migration tools. What i mean is: there are some things which just couldn´t be ported correctly and which are not useful to port due to total different architecture. I think that´s a general problem with evolution: You´ve to move and learn and have to change your thinking to follow it. BTW If you think that you can do a better converter, then try to find a sponsor and just do it. I as chief of a company wouldn´t want to sponsor you, instead i´d use the same amount of money for retraining my stuff, that pays much better in the long run...
Here's my two cents. Those who are signing the petition don't want to do a little work to migrate their code, and don't want to invest in their knowledge portfolio. Too bad! This is the field that your are in; it's always changing. At one point, I belive that was what attracted you to this field. If it doesn't anymore, find a new field of work.
Wonder if they are as funny as the radio "Regular Guys?" ;-)
Yeah...Just because of the name I seriously hesitate...
But Mozilla IS lower than IE....
"I'm not suggesting that there should be no rewriting at all. But the claim that the migration wizard can do 95% of the work is a sick joke. If it could do 95% of the work, then adoption would have been higher." See? Now THAT sounds like the start of a REASONABLE petition for Microsoft: More upgrade support. That'd would perhaps get Microsoft working on something realistic instead of VB.COM4Life.
Quote: "To accept that Microsoft can get away without providing an upgrade path should be a worry to you." Hmmm, once upon a time there was no Microsoft and all accross the land used to have to write their own drivers, their own languages, their own updates in machine code... If you are really "that" bothered, "you" pay the money out to upgrade it! Build yourself a compiler to compile your code. It is really quite simple. This is a product we are talking about - how would you cope if Microsoft had of gone belly up?! Languages come and go what really sets a programmer apart from the rest are those that learn the new languages. If you need to upgrade your product to a new version then you are most likely lazy. Want the cheapest way to get at the better technologies. What you fail to realise is that to get the better technologies you need better languages to cope. Even more ammusing is that you could actually upgrade in stages as VB is COM and COM is support by .NET (with a small time hit)
'Tim', I pity you.
Awesome!
I can't believe no one jumped on the statements made above about "If anything, as a programmer in a new and untried language without any track record in long-term stability, it would be in your interest for the petition to succeed..." is a complete joke! At my company, we have seen huge improvements in reliability and robustness of the applications that we are creating in VB.NET and ASP.NET over ASP, VB6, and COM/COM+. Just handling maintenance on some of the old applications is more costly than a refactor of the COM+ objects to .NET assemblies. Untried? Long-term stability? <*cough*> I have been using .NET since July 2000 when they handed out the BETA at the PDC in Florida. The stuff in BETA then was good enough for deployment (albeit with some parts I wished had more work). After more than *FOUR* years, how long do we need to wait to accept it as tried and true? If anything, Microsoft has devoted too many resources and time worrying about the last service pack to Visual Studio 6.0. Not many other companies would have spent the time to build that last service pack after release of a new version. How many of you still actively maintain the code base for your released product two major revisions behind the current one? Newbie developers that I know also seem to find development with .NET more consistent and straightforward, but here my opinion may be slightly biased since most of our applications are web based and not windows applications. If anything, the death of COM itself is long overdue... that statement should light a flame of messages. Are you guys going to go off and build COM4EVER.com? Yes, someday web services will be passe. Bottom line... each generation of software brings with it capabilities and efficiencies that allow us to build more complex systems with more functionality than the previous because of the greater reliability and richness of the base software. We no longer spend large amounts of time languishing over sorting algorithms and putting bytes into and out of packets. Instead we worry about implementing business logic specific to our vertical (business). Why hold a gun to their head and require them to spend millions of dollars to support or construct something that will satisfy the needs of dozens of people, and at the same time propagate forward a code base that needs refactoring anyway?
Is this the Jason Hamby that used to work with me ? If so, drop me a line.
Paul, any plans to have ObjectMapper target your O/R mapper?
That's kind of up to Mats -- he said he was interested, but I'm sure he's also very busy so I can't speak for him. I'm more than willing to help when the time does come though.
Sweet!
Cool, is it backward compatible? Any update on the possibility of a shared documentation wiki or somesuch?
Definitely backwards compatible -- just minor bug fixes and improvements. I've downloaded FlexWiki, but as usual my time is extremely tight so I haven't installed it anywhere yet.
Great job! It's very encouraging to see your commitment to continued development.
yep as you stated its kind of common knowledge...
Hey, good tip!
I must not be so common I guess =/ Thanks!
Thats the reason Micrsoft Rocks. I just like the tools even if they have bugs.
Nope... didn't know that! Of course, I just figured out Windows Key-E last year. :)
No I didn't know that, thanks Paul!
Thanks for the tip, that's the most useful thing I've read all day.
Yeah not so common....Thanks Windows + E ...hehe
Not directly related to this release... http://forums.mysql.com/read.php?38,17809,20753#msg-20753 If you are using Wilson O/R Mapper this connection string will fix the MySql DateTime issue: <add key="ConnectionString" value="Server=localhost;Port=3306;Database=DBNAME;Uid=[UID];Pwd=[PWD];Allow Zero DateTime=False" /> The key here is: Allow Zero DateTime=False [MySqlConversionException: Unable to convert MySQL date/time value to System.DateTime] -- Sincerely, David Dimmer Director of Development Fyin, Inc. Local: (414) 431-8674 Toll free: (800) 680-2326 Fax: (414) 431-8704 W: http://www.fyin.com Complete Website Design and Interactive Programming
They want to check the possibility of someone stayed hidden (or lost) inside the building. By the way I hope your wife is going much better.
But they didn't have anyone at the gate when I entered earlier, so they wouldn't know I was trying to stay hidden even if I were. :)
as always ... another great release! :)
Yup, always good to see you, Paul. That was fun - When are you going to talk at one of these?
Let's see if I crash and burn at code camp first.
Hey Paul, This petition is a joke...correct? -Mathew Nolton
Hey Matthew: You know as much about as do I if you have read it. I don't have any insider information about it beyond that. It doesn't look like a joke in any way, although I think most signers are making a statement more than expecting change.
Off the top of my head, you might need to get into the source and put a call to Context.User.Identity.IsAuthenticated before committing any changes. Probably not what you wanted, but it would be cool to have a feature. You could make it a config setting and everyone would be happy.
I don't know much about it, but SushiWiki (written in C#) can use authentication, from what I can tell. A co-worker I had on my last contract was using it and it looked really nice. Some links: Home: http://luminal.gotdns.com/sushiwiki/ Source: http://sourceforge.net/projects/sushiwiki
I am sure Code Camp will be great. Then we just need to get Jerry to present also.
I had a hard time getting anyone else to talk in our lunch-n-learns -- but everyone now and then I succeeded -- and Jerry is very good. :)
That actually goes against the concept of a Wiki, and more into a CMS type solution. Of course, I'm not saying that you can't do it, it's just... odd.
dang, that's close enough that I could've walked from my house! how'd I miss the announcement, I wonder.
Well you know me -- I'm an odd one. :)
Ah, but unfortunately someone scheduled Code Camp on the same day I 'walk' for my graduation. All of the Atlanta Developers should have consulted me before scheduling this! Now I don't get to see Paul talk the talk...
I think that the forums are fine for collaboration. A Wiki is fine for some things; but, I do not really see the necessity for it on www.WilsonDotNet.com right now. That is just my opinion. That said, all that I can do is underscore what others have said-- that is, in my experience, some Wiki implementations support authentication and some do not however using authentication does go against the the "ideals" of the Wiki itself, or so would claim the purist. HTH.
I'm 100% general. Huh. Must be my broadcast background. I mean, look at Peter Jennings, he doesn't even sound Canadian most of the time!
Authentication is becoming a matter of life for web based applications, especially Wiki's, now. The first problem is spam bots. Anonymous posting allows the spam bots in, and any defense mechanism will eventually be defeated. The second problem is that in the abscence of spam bots, you have to resort to some variety of human intervention to clean up all the stuff that l33t h4x0r types do to pages, or totally off topic, etc. comments. With registered accounts, you at least have a shallow layer of defense. You know who posted it, etc. This has been one thing hurting the legitimacy of sites like wikipedia, in fact. Allowing anyone to update and correct is fine, but it becomes difficult to verify what information is accurate and what information is not in a given entry.
I've used "location" tags in the web.config file to allow access to the viewer page and not to the edit page the details are in the FlexWiki FAQ, can't find them now, but I hope that helps.
Great tip, definitively not common knowledge!
Eh, I don't see anything anti-wiki about authenticating your users. So long as registration is free and really easy. Plus, if the other users can't see their IP, you are still pretty anonymous. When you have authenticated users updating the site, you can track a specific individual's modifications, and even ban an IP if that person is abusive of the wiki. I'm sorry I don't have anyting useful to say! :/ I myself am very interested in .Net wikis, so thanks for posting about this shortcoming of FlexWiki.
Have a look at Mambo. It is a full CMS system, and maybe more than you want, but it is trivial to install and administer. Unfortunately, for you, it is a LAMP solution which you may not be looking for judging from your blog.
I wish i was a pure breed like you guys. but as a mongrow i have to admit i am proud for not sounding too Israely there. Yeehaw!!!
Ok, I'm 60% General American English, 20% Dixie, 20% Yankee, not too bad for someone from China.
My prayers go out to all of your family. I can't imagine what it's like to deal with something like that and still try to continue meeting the rest of life's obligations.
Best wishes to all your family. I hope things keep progressing well for you all.
Best wishes to Jenny, your kids, and yourself Paul. I'm glad to hear you are all managing okay considering what you're dealing with. I hope things get easier for Jenny and yourself in the near future.
I hope that everything gets better. As always, if there's anything you need...
Best wishes, Paul. This is the first I knew of this, and I feel like a bit of a jerk for bugging you about ORMapper stuff a couple of months ago. If I can help with anything, let me know.
All the best to your family and you're in my prayers.
Well, since the idea of nullable value types was just plain left out of a modern platform (.NET) in the beginning was incredibly bizarre to me, especially in this age of database interactivity. Getting nullables to be more integrated is a definitely great start to get the platform (.NET) into CURRENT standards, instead of OO-based C++ standards of 10 years ago (where Objects would serialize/deserialize locally...) Agreed these "irritations" with the DataReaders is annoying, and IMO the IDataReader interfaces should obviously be extended (via IDataReader2 or IDataReaderEx or something) to provide nullable types through the interface, and hence "encourages" implementing it all the way through to the SqlDataReader's implementation of "int? IDataReader2.GetInt32(int ordinal)"
Just say no to NULLS! Join PAN. Programmers Against Nulls!
It's not just IDataReader that's not supported. NONE of the System.Data classes support nullable types. Just try to use something like command.Parameters.AddWithValue("@SomeParam", (int?)null) This will throw an exception once you try to execute the command. Yet the following works: command.Parameters.AddWithValue("@SomeParam", SqlInt32.Null) There aren't even any implicit/explicit conversions between SqlTypes and Nullable types. I was baffled when I noticed that. It's things like this that make nullable types *really* annoying to work with when you're doing database work. Erm, refresh my memory, why were they added again?
I'm a mess of all of them.
Checkbox feature. Let's hope something better shows up in before final release.
Well, one of the major problems is the idea of NULL in the database in the first place. One of my major complaints about the SQL Server 2000 table design tools is that columns allow NULL by default. This is a pretty significant design decision, and I believe that NULLs should be allowed in the database only in extra-ordinary circumstances. However, many 'DBAs' allow null by default, and it really creates havoc. NULLable types are a hack to make programming against screwy database designs easier for client-side programmers.
You know, while you ARE right.... ...personally I do not care about the database integration at all. I use an O/R mapper fo rall my database work, including parameters, and I thus can add all the integration and conversion code within MY O/R mapper - so parameters etc. will work. What really makes me upset is the other part. our points (2) and (3) are in levels that the USER of the O/R mapper has to work with. And there it will come back and hit them. There is no way I can hide (yet again) databinding efficiencies. There is no way I can handle the convert issue. And this really shows how much an afterthought this is. MS drops the ball again (on databinding). Are they the only company which will take a dozen or so attempts o get this right?
Last year at Teched Europe, someone asked Dan Fernandez about nullable types and datareader... they (he and another MS guy) got that look on their face: "oh erm... whoa, we didn't think of that! we'll pass it on!". Nothing happened apparently. Oh, btw, DON'T use datareader.IsDBNull(..). It's very slow. Test the value for System.DBNull.Value, much faster. (magnitudes faster) I also find the lack of integration of nullable types a severe stupidity. I mean, int's and all ARE already structs. All it takes is another field. ONE FIELD. ok, you can use Nullable<T> but that's almost 50% slower. Why, I don't know, as it's just 1 flag, 1 BIT.
Check out NullableTypes on SourceForge. Works with .NET 1.1 and VB providing useful conversion functions etc. http://nullabletypes.sourceforge.net
Paul, Wow, thanks for the headsup. Wally
WTF? I thought that interaction with nullable fields in the DB (such as situation #1) was the main line for nullable types in the framework. Mostly to eliminate all kinds of null checking. If they don't do that then why even spend the time to implement it? ?UsefullType
I think the issue at the core here is that nullable types are never actually nulls. int? i = null; Assert(i == null); Assert((object)i == null); // WILL FAIL nullable types are simple objects with a flag. I think because all those methods take and return base Object type, when type casted to a nullable type with a "null" value, you wouldn't get a null in result. I think the problem is not integration, but how the nullable types are implemented in the first place. That's at least how I understand it. http://blog.dreamprojections.com/archive/2005/04/10/787.aspx
I don't think anyone expects them to be null -- just to be integrated with their expected uses.
Amen. See also my suggestion on ladybug at http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=400bc96d-0faa-4737-ad30-ec088663fddb
Good luck.
I've been reading up on the subject...........And the impedance mismatch continues.
It will be a great presentation and I would love to be there. Learning about O/R Mapping from The Master, for sure. Hope your allergies settle down for the show.
You made a great presentation, Paul! You had the best one of all of them, and Todd Fine's Avalon/XAML was the next best. Your presentation skills were great, and your content was first-rate. I'm not ready to run into ORM head-first, but you made some compelling arguments and I certainly will be looking into ORM more.
So how'd ya get on Paul?
You're going to give me a big head Eric -- I'm glad you thought it was great, but I'd also appreciate any critical comments also. I know I wanted to cover more material of course, but I did at least hopefully succeed in my main goal of convincing people to consider O/R Mapping, while giving at least a little of a head start in that direction too.
I'm sorry that I had to miss it! The word on the street was that it was a good presentation.
Paul, you were awesome!
I don't think it sounded bad and I hope no one holds that against you. Great job guys!
Far to modest, methinks. However, I sense a pattern from listening to this podcast. You seem like challenges - when someone tells you "Something can't be done" you go out and do it. So, next time I can't figure something out, I'll just tell you that it's not possible.
This was enjoyable, nice job!
Users of the Wilson O/R Mapper sometimes ask for some documentation about OPath in their user forum, since the mapper supports a query language similar (or identical?) to OPath. Here you are---ObjectSpaces articles that might be useful when working with Wilson O/R Mapper (a design goal of which seems to be to mimic the ObjectSpaces API design), an incomplete list in no particular order.
Thank you, Paul!
Paul Wilson is a guru if there ever was one.
And Wally is in my book. :)
w00t! So I assume Jeff is going to continue improving the OPath support then? That would rock.
I hope so. :)
Wow seems this podcasting is really taking off, its going to be a big bandwidth eater for shared hosters hehe.
Paul, Thanks for this. I am also in the process of learning NHibernate and am doing so very much in a trial and error fashion due to the lack of real world examples. This will help me quite a bit. I have also find Cuyahoga (http://www.martijnboland.com/cuyahoga/) to be quite a good learning aid. Jerrie
Hi Paul, Thanks for the example, i will check it out. btw. what a links, trying to get google to like you? :-)
Thank you very much. I just tried both the NHibernate and WilsonORMapper versions; they worked both out of the box against the same database. I am playing a bit with NHibernate the last weeks and enjoy your comments about documentation. Your app shows quit interesting details I did not catch before. But wouldn’t it be so much more work to clean up the code and refactor it into different layers? Or is this the real challenge of ORMappers? I will examine it on my own.
Have you come across Cuyahoga? (http://www.martijnboland.com/cuyahoga/) It is a content management system using NHibernate. The author's website also includes some useful tutorials on NHibernate in a real-world application such as this.
Martijn's Cuyahoga is probably the only other real example I've seen, but to me it was too much of a real app and not enough of an example -- not any fault of his, afterall that's the point since it is a real app that he's making with it. As for refactoring into different layers -- I don't think its a challenge at all actually. Its mostly the same principles you would apply in any other layerd app, although easier in my opinion, but of course I left that undone in my example.
Hi Paul Well done! We can never have enough sample applications to show the merits of O/R mapping. This one is especially nice because it covers many of NHibernate's mapping options but it's also pretty small and easy to understand. One remark about the application: you used the IQuery interface but the hql consist of concatenated strings where everybody should really use the parameter options with the IQuery interface (for obvious security reasons).
I was able to make NHibernate work against access using the oledb option.
Hi Paul, Thanks for the example app - I've been looking for something like this for a couple of weeks now. This one looks like it demonstrates a lot of the main features I would like to take advantage of. However, I'm having trouble getting the example app to run. In the LoadContacts() method, when I hit this line: this.ContactGrid.DataSource = session.CreateQuery(query).List(); I get this error: An unhandled exception of type 'NHibernate.ADOException' occurred in nhibernate.dll Additional information: Could not execute query. Any suggestions on what I might be doing wrong? Thanks!
Hey Dale: Hopefully someone more experienced with NHibernate can shed some light on it. The only thought I have is probably not the issue, but I suppose I should ask anyhow -- have you created the database with the sql script? Yea, probably not the issue. :) Good luck, Paul
Yeah, I ran the script to create the db instead of doing it by hand. I haven't been able to get ISession.CreateQuery() to work in either your example or my practice app. Still can't figure it out. If I come up with the solution, I'll post it here.
Hi Paul, I figured it out. Dumb move on my part: for some reason the ORMExample login didn't work for me. I just changed it to a login that does work and voila, I'm in business! Now if I can figure why I'm messing around with computers at midnight on a Saturday night instead of messing around with my wife, I'll be making some real progress. thanks, Dale
Dale, There is probably something wrong with your connection string. Take a look in the log.txt file for more details about the exception.
Just wondering about some of the other mechanics, Paul -- are you storing the "pages" in a database, and then rendering them into your master pages? What do the "edit" URLs look like? What about creating new pages? TTFN - Kent
Rather than religiously following an idea (that I still think only wikipedia got right, but that it...
Hey Kent: I'm using the file system for my topics, and their history, although it wouldn't be much harder to use a database. As for the details, you can view all the code in my free section of code on the site itself: SideBar: http://www.wilsondotnet.com/Code/?path=Wiki&file=ControlMain.ascx http://www.wilsondotnet.com/Code/?path=Wiki&file=CWiki.ascx.cs Content: http://www.wilsondotnet.com/Code/?path=Wiki&file=Default.aspx http://www.wilsondotnet.com/Code/?path=Wiki&file=DWiki.aspx.cs Basically, a logged in user see's a link to edit the current content (the querystring is ?edit=name instead of ?topic=name) and there is also a textbox and linkbutton to create a new topic (placed in a separate form by using my WilsonWebForm). Thanks, Paul
Link Listing - May 30, 2005
I'm not a big EntLib fan. It's usually tries to be too much to too many. I'll stick with either a simple 'roll-my-own' DAL, or a decent O/R Mapper.
Hehe, now you're just plain getting catty about other ORMs ;) (with good cause, mind you)
"Of couse, if you follow all of Microsoft's 'guidance,' and are already using the Enterprise Library, then this is probably exactly what you have been dreaming about." That cracks me UP!
Heh, I like the quote that they 'propagate stored procedures for best practises'... haha, noooo not for best practises, but for the fact that otherwise they've to write a real O/R mapper core, SQL engine, meta-data management etc...
Paul, I'd be interested to hear more of you opinion on Microsoft's 'guidance'. I recently created a 'roll-my-own' DAL. When I explain it to other people the biggest (perceived) problem seems to be "but that's not what Microsoft says we should do!"
I had a look at the DAAB a while back. While I can't verbalise what I didn't like about it, I developed a severe disliking for it, and it's turned me off looking at the Entlib stuff. I wish I could verbalise it, because it's something I'd like to be able to explain to others. If you have the interest, I'm keen to see you write more about this Paul - I'd also be keen to know what you thought about the other parts of EntLib. Cheers.
Here's a few links to some critiques of various types (a few have comments from yours truly): Yang Cao: http://spaces.msn.com/members/yangcao88 Chris Breisch: http://geekswithblogs.net/cbreisch/archive/2005/06/01/41360.aspx James Snape: http://www.jamessnape.me.uk/MicrosoftPatternsAndPractisesEnterpriseLibrary.aspx Steve Morgan: http://www.hastobe.net/PermaLink,guid,0479b173-13f9-4f88-9a17-9ac594aa9012.aspx Sadly you won't find too many negative reviews since I suspect most of us don't need the bad press of going against the popular P&P.
This is one of the few examples available about NHibernate, that actually represent something out of the real world. But there's one mayor thing I don't like about the code. It is impossible to reuse the business model in some other form of presentation layer. That is one of THE things you need when building extendable and maintainable applications.
Its definitely not intended to be a model for best practices. I actually thought about making it a little better in that regard, but I think it would make it harder to grasp the NHibernate usage for some that aren't as experienced.
I've come up with another critique of the DAAB. It goes like this: 1. Lay out, on a table, 8 pages of code from a sample application using the DAAB. (The DAL code itself, the stored procs, and the hand-written business entity classes) 2. Explain that this is the CRUD code for just one database table. 3. Now place on the table the same functionality, implemented in my 'roll-my-own' DAL. It's less than one page long. 4. Explain the extra features that my DAL gives, which are not in the DAAB example. (Optimistic concurrency control for starters.) But, since the original 8 pages come from Microsoft, I suspect some people will remain unconvinced!
I created my own wiki for a proof of concept on a project @ work not too long ago in 2.0 so I couldn't use FTB and instead tested with telerik's RAD editor. Either way, I was able to create the entire thing extremely fast including revision management and internal link transformation. Unforturnately, I couldn't convince certain people that this was a better way to manage the particular project than storing every single detail individualy in a database. Sigh.
The enterprise block just seems to be far to fat.. Written by academics. I read someweher most of these blocks started outside microsoft. The company i work at wont be using it . 1. Loging is slow and adding your own listeners requires 3 complicated classes. Yet the default .NET loging with Levels and Providers is not even that bad and is much faster. 2. The Caching one intrigued me for non web server hosted middle Tiers, again it is far over engineered. The Web.Cache cache for example is just as efficient (more ?) , used by 1000's of companies and has only a fraction of the code ( I decompiled it once) 3. The Configuration block is again far too complicated. Config files and Application.Configuration is not that bad ! 4. If you want to use 1 part you have to use the rest ! Ben
I have been looking into the source of some of these blocks and learn quite a bit from the EL folks. To be fair to Microsoft P&P team, here are my 2 cents thought on what I know and whether we should use any of these blocks in our apps. 1. All blocks depends on the Configuration block for dynamic loading of types and constructing them at run-time for the first time using Reflection, and then it not be reloaded again the next time you access it again. As of my current understanding, the Configuration block is the core of EL. This configurable architecture offers great flexibility and of course at much complexity. The question we should ask ourself is this; do we need this flexible configurable design in our apps? If yes, then you should look further into EL, otherwise, It's not likely to help you that much. I wish they could at least make it easier and simpler for customer to use. 2. There is this Common block required for all blocks. This block provides helper functions to support the infrastructure of all blocks. 3. There is also a Test Directory in almost every block for unit testing. You can remove them if you need to rebuild the block and make the DLL smaller. 4. Yes, the EL folks use DataSet and DataReader extensively for the DAAB which many of us is not a fan of because of the heavy duty stuffs that they carry. But hey, these folks work for Microsoft and it's natural that they promote Microsoft technology. So if DataSet is not suitable for your apps, the DAAB is not for you. Otherwise, do dive into the DAAB because it's quite a powerful and interesting block to apply to your apps. 5. Building a powerful, flexible, extensible and user-friendly framework is a challenging and tough cookie to swallow. So to be fair to Microsoft and the EL folks, their architecture is specifically aimed for the mass in a generic fashion. So when people compare a specific logging framework and say it is much faster, of course it is. Because you can twist and tweak to your liking becasue it's strictly designed to do just that. Remember, it's only about logging, you can not insert DAAB and make it works with the logging framework. My point here is not to dispute whether we should use or not to use any blocks from EL. Even the Microsoft P&P team openly say that EL blocks are not suitable for some situations.
I've had some issues as well with FlexWiki... First I think their code doesn't really follow their own guidelines: http://www.flexwiki.com/default.aspx/FlexWiki/DeveloperGuidelines.html Also, they don't accept any code before you submit a non-assignment agreement, sent to the redmond headquarters itself 8-/ http://www.netindustry.nl/blog/2005/04/flexwiki-make-double-click-editing.html
I'm hoping to enlist your help in creating a VERY user friendly, an almost braille version, of a WIKI for teachers to use. Its purpose is to promote educational staff development and ultimately better educated children. You stated it took you roughly 30 minutes to create. I assume you have a fairly strong technical background and this is something I lack. I don't know what I don't know about website construction and the use of the internet as a means of educating employees. I do however see the power in a tool like this and am asking for your help or anyone else who reads this who would be able to point me in the right direction for that which I describe.
Very nice to see some more examples of nhibernate applications. We are looking at nhibernate / borland's enterprise core objects (ECO II) and a number of other solutions and haven't really found anything that supports a really good distributed model that can be used say for a smart client application. By this I mean it'd be nice to have a ORM that allowed me to host the domain model on an application server and access it via web services. On the client I'd like to have real objects (proxy) that allows me to make modifications and then commit my modifications using a web service. Rich Strahl describes this requirement better: http://west-wind.com/weblog/posts/368.aspx Also I don't really want to transfer the entire object back over, just the difference. I need to be able to request my own transactions and just have the persistence engine behind the web service coordiate that for me... I don't know sounds like panacea right?
Hi Corbin: Most O/R Mappers (EntityBroker being the exception) assume that you will provide the plumbing for distributed apps, whether it be web services or remoting, just like you would in any other case -- and its not that much different, so I don't really see the problem.
hiya, If so, were you able to use the appConfig connection section "as is"? I am experiencing connection probs :-( If somemone can confirm that the conenction should work as is, then that'd be a help. cheers
It should just be a simple matter of getting the connection string correct -- especially if you have a named instance for Sql 2005.
Thanks, at least I know where I am going wrong.I have tried integrated security etc in the connString.Still no joy. Could someone who is using the sample app with sql2005 email / post their nHibernate dbConn section?I apologise for this slightly off-topic :-( cheers, berriolas@yahoo.com
Thanks for the 'real' example Paul. Was beginning to doubt whether I'd find anything resembling a real-world scenario for nHibernate on the web.
Can we blame Skype and my recording rig and call it even ;)
So Paul, when is the CD release party? :-)
I listened to the podcast last night and thoroughly enjoyed it. Except for Skype cutting out a few times, I thought the quality was adequate. Great interview, and nice to put a voice with the face ;)
Thanks for the nice example. But can you tell me, from where can i get the documentation on NHibernate.
Uh, my guess would be the NHibernate site.
Paul, The quality of the content was great! Don't worry about the quality of the voice. The best part of the interview, IMHO, is that you are willing to say that your tools may not be the best choice for all programmers on all projects. I rarely hear that from tool vendors, which is why I look to others, like yourself, for tools. Thanks!
Hi,Paul Thanks for you work. To Wilson you can get the documentation at http://wiki.nhibernate.org/display/NH/Home
I agree with Paul Schaeflein. The killer argument for me to use WORM is still that ObjectSpaces might have some common syntax and features. Paul are you willing to go into details and tell us what NHibernate has that WORM doesnt? I know there is a lot, but are there some core things. But please dont ask me to compare our product with competitors products ;-)
I tried to note the main differences in this previous post: http://weblogs.asp.net/pwilson/archive/2005/05/26/409042.aspx
Ok, since this is about me, I'll chime in and just ask if I am really suppossed to believe that ORM is appropiate for everything. ORM is a level of abstraction. Abstraction is good assuming it does not cause additional problems. ORM is not fruit. I would view ORM as more of a fruit bar. Is buying a fruit bar better for you than growing your own fruit? In a busy lifestyle, the answer is that it depends. Sometimes it makes sense to buy the fruitbar, sometimes it makes sense to buy the fruit. In my case, i took over an application that has a home built orm component. the hborm is VERY slow. Are all orm products as bad as the hborm that I am stuck with? No. Should I use orm everywhere? No. BTW, I have to live with the hborm just about every day. Due to the fact that I am currently onsite, my emails only go out about twice a day. As I said (will say) to Craig Shoemaker on the subject, I have added ORM to my list of things to look at, the problem is that there is not much time for the list. Wally PS. I hope that Paul doesn't take anything I saw out of context. Paul is a guru, more than I ever will be. He is someone that I have always respected and I will always respect. I have always considered him a friends since the day I meet him about 3 years ago. I will continue to do so. :-) He knows more about ORM (and many other technologies than I ever will). And I just love the google ads ont he right hand side of the post.
Don't assume this was solely about you Wally. Sure you were part of my inspiration, but its been something I've been thinking about for a while due to similar discussions with others. BTW, I totally agree that O/R Mappers, nor even just business objects for that matter, are NOT the answer for everything. I continue to use DataSets and Stored Procs where appropriate, although my O/R Mapper even makes that easy. To continue the analogy, fruit IS good for you, but it is also just one part of a well-balanced diet. And of course you can get even the fruit that you need from many different sources, whether it be a different kind of fruit, or maybe even fruit juice or a fruit-bar. And Wally, please quit putting butter on my fruit. :)
I'd maybe suggest he tries vegetables, and argue that they are different to fruit, but they are still tasty and healthy, and he hasn't had a bad experience with them. Once he starts eating vegetables, I'd sneak in some tomatoes and cucumbers as they are actually fruit, but treated as vegetables.
The suggestion that ORM's are like fruit implies that we need them to be healthy. If that were the case, wouldn't we all be dead at this point in our careers from not using them? It's an interesting technology and technique, yes, but I've not encountered an instance where I need it. Some people will, some poeple won't. It's all good.
You are right Jeff. The analogy does not imply that one must eat fruit -- its simply trying to say that it is typically part of a balanced diet and just because you feel fine and don't like one fruit shouldn't keep you from trying to get even healthier since you might like other fruits.
I don't understand why some people even bothered to switch to .NET in the first place. They probably were quite able to get everything done in regular ASP and VB6 to begin with. So why bother to switch to something just because it can make you more productive and yield code that's far more maintable?
So, does this make dblib like Doritoes?
When I saw fruit for the first time I knew instinctively that it was very healthy. However, my first bite was absolutely disgusting, and made me sick also. These were early days though, and I hadn't read much about fruit, and certainly didn't know there was such a variety. Anyhow - even though my first experience was bad, and I choose a different variety - a species I saw in your orchid, and my second experience was wonderful. I use fruit in almost every meal I prepare now, and it makes the meal more delicious and nourishing for everyone.
Woo Hoo! Someone read my blog! 'Tis such a special day. :)
Now if only your blog didn't require an account to leave a comment. :)
Ok, from the "my LOC is smaller than your LOC" boasting department, with my O/R tool all I have to write is this in one file: table demo:category { fields { int id int notnull readonly [the ID]; string name nvarchar(30) notnull readwrite [the name]; }; pkey sequenced id; # your example had a get of all categories so I need to provide such a get: get multi {called all}; }; I know it's not XML, I wrote this before it was obvious that XML would be THE way to do these kind of things. To this day I haven't been able to find an XML syntax that can express all the same things that isn't painfully verbose in places. Anyway, equivalents to your C# code: // #1 CategoryGrid.DataSource = Category.GetByAll(); // #2 Category cat = new Category(); cat.Name = "Insert"; cat.Update(); // #3 Category cat = Category.GetById(id); cat.Name = "Update"; cat.Update(); (notice just as with your version, once you've done the create or get, the code is identical regardless of whether it's an insert or an update. This is nice in ASP.NET because you can do the get-or-create conditionally in your Page_Load and then just call .Update() in your _Click) // #4 Category cat = Category.GetById(id); cat.Delete(); // #5 (this one's less efficient, but easier to understand when reading it; also it's a corner case, at least in the kind of stuff I do) foreach (Category cat in Category.GetByAll) { cat.Delete(); } By the way, I'm guessing from the fact that your XML doesn't contain enough information to create the table itself that you have to do that by hand? You should also include a CREATE TABLE statement in your "necessary lines of code". Mine creates the table (and indexes it based on what gets you specify, and puts in foreign keys etc) for me. And updates it when the definition file changes. http://savannah.nongnu.org/projects/nrdo :) Ok, the downside (and it's a fairly big one) is that the total set of users of nrdo is pretty much me and my company. The documentation is limited and naturally it only gets testing in a limited number of configurations. It also has some quirks and its error messages aren't exactly clear most of the time. I just wish I could figure out how to convince people that it's actually kind of cool and it would be nice if they'd use it and contribute fixes to some of those problems...
Really? I had no idea... are there any better free hosts out there?
nrdo seems nice, but you loose a lot of apeal at the door steps by choosing GPL license...
Note that the GPL only applies to the tools (in other words, if you fix or enhance the tools, I'd like the fixes back). The runtime libraries are licensed under the LGPL which allows them to be linked into any application, under any license, without any obligation except to make the source to the library available - which I'm already doing for you. My own company uses nrdo in a proprietary application - there's no obligation to make the source of your app available.
I'm currently working on an open source project (with legacy code) that uses the provider model to abstract away data access. There's one table in particular that uses around 10 stored procs to grab records from it and display it in a variety of ways. I recently added a couple columns to that table, modified 10 stored procs and all the methods that call those stored procs. Luckily we only have one concrete provider, otherwise I'd have to make the corresponding changes in every single one. This has pretty much convinced me of the efficacy of tools such as yours. Now its a matter of finding one that works well with an open source project.
well, that is nice to know - thanks for the explanation... p.s. Paul, sorry for digresing
That's fantastic news, Paul! It's good to hear your wife's going to be Ok.
Congratulations to all!
That's great news! Best wishes.
Paul! That is amazingly fantastic news! I'm so happy for you and your family. Wahoo!
Best news I've heard in a while. Congratulations to you and your family Paul!
Congratulations, paul, good luck
Your blog post put a smile on my face, Paul. I'm thrilled you and your family have some wonderful things going on. Cheers!
Great News Paul!
Great news, man! :D
Fanstastic news!
Great to hear about your wife! I know that a lot of people aren't entirely comfortable sharing stuff about their personal lives online, but doing so really makes people in our community seem more human and, well, interesting. Not that O/R mapping isn't interesting. ;) Again... great news!
Great news! God Bless you and your family.
That is fantastic news! I'm glad to hear you are all doing well. God bless, David
That's great! All the best.
Great news! Congrats!
Great news Paul!....
I actually burst into tears when I read this post. I'm truly thrilled for your family.
This is really exciting news... I'm really glad you shared it with all of us, as myself (and I suspect many others) had been wondering in silence as to her health.
Karl's article is really good, I've heard that some people didn't like it because it didn't put custom entities against typed-datasets, only untyped..but people didn't understand it wasn't about pitting anything against anything, it was just an introduciton. Dino's does a great job of comparing :)
Hmmm, I guess that is why there is not Firefox 1.0.5 for those us running 1.0.4.
I have no probs with 1.0.5. Perhaps some extension is messing up?
I didn't have any problems either for a while, nor did many of the other people that have reported similar issues -- so good luck. :) Seriously, I don't know if its guaranteed to eventually strike everyone or not, but it is certainly occurring at some point later than installation for some of us.
Hi Paul I had similar problems with an earlier Firefox update (1.0.3 I think) and the User Agent Switcher extension. Things worked OK immediately after the update and then it died a few days later. The solution was to start Firefox in Safe Mode (see the Mozilla Firefox start menu folder for this shortcut) and then disable all extensions. It's a bit painful, but I enabled each extension individually, closed safe mode Firefox and re-opened normal Firefox until I found the offending extension. Once I found it, uninstalling and then installing it again fixed it.
Paul - It's always good to hear news like this. It's also great that you've been spending time with your family, there's really nothing more important than that.
Frans is right, I would bet it is an extension too, do Start/Run with firefox -p, that will allow you to setup and change to a new profile which will have no extensions, see if you get the same problem.
please check your extentions they hang fire fox sometime,do a clean install
The same thing happens in 1.0.4 for me. It seems to be related to plugins. Generally, closing the browser then re-opening it once or twice will fix the issue for a while. Hopefully the fix will be released soon as it really is the only issue I've ever had with it.
Well I'm not going to go back and try the previous version right now to see if it could in fact just be extensions -- so you may be right. But take a look in the Mozilla forums, and elsewhere, and you'll see that there are many (far more knowledgeable than I) that feel this is a bigger issue with v1.0.5. And the fact is that the Mozilla team has told those working on localization to wait for v1.0.6 since v1.0.5 is so bad -- although they aren't very open on just what is so bad, nor do they seem to respond to those making claims like mine. And its this type of "support", which I've heard others mention on more than one occasion about other issues, that is going to make it hard for FireFox to be useable by the common non-techie. And don't get me wrong -- I'm not a MS drone -- I've been using FireFox, got my family using it, and recommend it to my friends -- but this type of things makes me wonder if that was the right decision.
http://news.com.com/Coding+misstep+forces+new+Firefox+release/2100-1002_3-5792635.html?tag=nefd.top
The general outrage mentioned in that News.com article kind of gets to what I perceive as a weakness to open source stuff. You didn't pay for it, so what right do you have to complain? I mean, I complain about Microsoft from time to time and they don't necessarily respond, but at least I have someone to bitch about. :)
This may be relevant: http://news.com.com/Coding+misstep+forces+new+Firefox+release/2100-1002_3-5792635.html?tag=nefd.top
I've had Firefox quit working on me in the past (the empty content pane problem), and what worked for me was to uninstall and remove the \Documents and Settings\...\Application Data\Mozilla\Firefox folder and reinstall. If you haven't tried that, it may be worth a try.
Yea -- that did the trick. Of course I didn't do anything except rename the extensions folder, and I also backed up my bookmarks even then. But it does work now -- you're my hero Daniel!
Great! I'm happy to see that you saved your bookmarks. Unfortunately, I left that part out of my solution (just a minor detail (ya right ;) ). I'm glad I could be of help.
Life is simple. People insist on making it complicated. -- Confucious. Use IE
Not that I was asking, but I would assume that people are asking for XMLSpy-like functionality built into VS.NET.
You're probably right, but what I thought was even funnier than the request was that the MS guy wasn't sure himself. It reminds me of the jobs I see advertised wanting 5 years of Xml experience. :)
Yup, thanks for your comments. The same just happened to me in v1.0.6. Bringing it up with a "no extensions" profile fixed it.
Actually I've thought about doing that before, but thought that it's kinda cruel to dangle that tiny little carrot for brain trust <g>... That said though content coming in through BLOG comments tends to be just as valuable as the actual content in many entries and this is one way to bring more traffic and input. It's a clever idea.
Hey Paul, I was wondering what some of these things mean. I see you've answered clarified some points in your forum - a link for those who'd like a more details:- http://www.wilsondotnet.com/Tips/ViewPosts.aspx?Thread=1372
What a cool publicity stunt! Generates traffic, hopefully some cool ideas... It's a "can't loose" situation, I think. J#
I totally agree. I absolutely hate quoting him, but a lot of this is the "law of leaky abstraction".
I am an ASP.NET enterprise developer, have been for the last 4 years or so, and I have no problem with the lack of project files. In fact, I like it. Websites are a different beast and by trying to mold them into the standard project idea alot of mistakes were made. Sure you could "exclude" files from a project, but chances are half the time they still got deployed. Not only is that not the expected behavior, but it could be a security risk. What can't you do with the new model? (truthfully they should have done both, but still curious what you specifically don't like about the new model) Agree 100% on the CSS and postback issue.
I don't see what the problem is. You are always free to write your own custom control library with your custom post-back handling scheme. You can always use AJAX.Net if you want to bypass post-back alltogether. If you don't like the way MS handles CssClass, simply inherit the control and override the way it renders. What's the big fuss? You have to write a little bit of extra code? Well, do it and put it into an open source project so everyone can reuse it. I just don't get it. If it sucks, don't use it (controls).
Thanks for this post. All of these things really really bug me about ASP.NET, particularly the stuff about style properties in code. I wish the framework forced new developers to use best practices instead of encouraging sloppiness like compiling colour properties. I'm really disappointed they didn't get the Web Part stuff right - I've dealt with the Sharepoint web parts and the tag soup they produce and was really hoping they would spend the time to get it right in 2.0. I was at an MS Developers conference in Las Vegas last year and at the keynote, they mentioned xhtml support in 2.0. They asked the audience who was excited about this, and I was one of maybe 5 people in 200 who put up their hand.
IMO, regarding web projects, they should keep the traditional approach for Visual Studio, and apply the new model only to the Express versions. The Express versions of VS are really for different users, and so I can understand they work differently in the name of simplicity.
I'm with Paul in many respects. It feels as though much of the ASP.NET Framework has been built to make life easier, but generally, it's only easier for the people out there who are not real developers. The hype about 70% less oce, great, but in practice, as soon as you need to do anything off the beaten path you have to break out the books and write the code.
Just to be clear, the current version of the moderation tool does not suffer from this issue despite using the postback model. The control that renders the moderation menu was rewritten for the latest version on forums.asp.net and does not have an issue with control placement (even though it continues to use the postback model).
James has asked for a list of things "wrong" with the project-less system. I've seen quite a few blog posts that you can search for, but I decided to compile a quick list from the MSDN Feedback Center itself. Most all of these are serious issues for many of us, and they were standard approaches supported by the original project file -- now they are all broken and MS simply gets to say its by design and/or postponed: http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=d3e01fc5-f341-443e-8bb7-9acfa0ebb78c http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=4052b0c1-e0e3-4c3e-b911-48d393c8becc http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=c93a36b3-58b3-49ef-b470-a677b60cbde7 http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=4f6fd532-a225-478e-af14-f6f67c622137 http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=1ed12cfd-b84c-474c-b244-d23249e115d1 http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=223db315-1c45-4593-88f2-9abb2121988e http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=fc2e388b-0f1b-4b01-a95a-c2c2fea7cbea http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=84ab7f2f-bdcd-4e66-acaa-8c57dc016254 http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=179444c5-3a4a-4547-99b7-7792cec85a5e http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=bb113975-9dd1-45ab-ae4c-d3426614fe46 http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=02d31a3d-7f88-4ec4-b7bf-0487f11721ae http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=26af74fa-e0ee-4159-a034-4c4a812160ea There's also more I didn't find real quickly, like pre and post build events and build configurations. True enough you won't encounter these things in simple projects, but they are truly quite common in larger complex projects.
Yeah, once again another agreement here. The projects can be got round by creating class library projects and setting various properties and tweaking the VS install, documented elsewhere. I'm not sure how the commenter who claims to be an Enterprise dev said it's not a problem for him, perhaps he doesn't have source control or staging servers. As for the ASP web controls, I gave up with them long ago and use the Generic Html controls and in doing so got rid of the postback data too. My main reason at the time was not just the poor styling without CSS but also the lack of XHTML compliance and dubious downgrading to other browsers. By switching to the System.Web.UI.HtmlControls stuff I can do pretty much what I like. Sure you loose the database stuff but I'm normally dealing with objects anyway and you can re-populate fields and current settings in Page Prerender along with the localisation code. [)amien
One of the solutions to this issue floating around the blogosphere is to use class library projects. If you use class library projects, can you get design support for the ASP.NET 2.0 MasterPages?
Alex is correct -- I was mistaken in fact, but not principle. :) Some of the links now include the keys, and some do not so I poorly assumed the problem continued. Anyhow, I just checked, and Alex is correct -- because the data is now in ViewState ! And that's why I say I'm not wrong in principle, since I didn't expect to see the data in viewstate. I guess the fact that its the moderation page makes it less of a problem, but its still a work-around to some less-than-optimal default solution.
Like I said before, I think they should have done both methods, but truthfully most of the "bugs" people talk about are not major things and are more a shift in mentality than anything. The guy with the file reference doesnt understand how references currently work in VS. No enterprise developer I know would add a reference to a file in some arbitrary place on his system, it should be copied local or to a general share used by everyone. Its a shift in method, but I dont see it as a huge deal. Not being able to create a reference to a web project doesnt seem like a huge deal to me either, if you have functionality in there that you want other assemblies to use chances are that functionality should be in a class library and not your web project. (You could still pre-compile the project for code-gen type of stuff if you wanted) The loss of pre and post build events is a bummer, I was hoping they would create a workaround for that perhaps through the solution file. There will be issues with any change like this, but I think there are benefits as well. A web site is now treated like a web site as opposed to having a project that may or may not be a fair representation of what you want to deploy. -James
A month or so ago, Betrand Leroy blogged about the AJAX.Net vs Client Callback differences, and said something that really stood out "I think the main reason for this difference in the expectations and what we delivered is that we tend to think as control developers, whereas most of our users think as application or page developers." I've often wondered how broad the implications of that statement were (and wtf they were doing to correct it).
Do not forget to vote and comment on the bug forms in the MSDN Feedback Center to let Microsoft know what you think about the new problems. If you don't, there is no chance they get fixed.
Lack of project files is a drag - I feel like functionality has been taken away from me to accomodate junior developers. Frankly, I consider most Click-n-Drool stuff in Visual Studio to be detrimental. It's really great for WebForms and WinForms GUI development, but I worry when I see a project where a developer has dragged a PerformanceCounter object, or a 'SQLConnection1' object onto a WinForm, I know that we are in for trouble. It looks great in a demo, but generates code like: this.sqlConnection1.ConnectionString = "workstation id=\"DENNANY-J1-2K3\";packet size=4096;integrated security=SSPI;data so" + "urce=\"(local)\";persist security info=False;initial catalog=Northwind"; What a mess.
Paul also agree with you. As a real developer I struggle with the Beta 2 to implement an existing solution with multiple projects. The problem for me reside in the fact that VS2005 Beta 2 is more a Beta 1. I have as a proof the latest post by Scott Guthrie about a new version of the migration tool. So it means they are still working on adding and debugging new stuff which shouldn't be the case in a real Beta 2 (if you remember that the official launch is in 3 months!). I really find incredible the fact that they remove the Exclude from project feature without checking with the real world what could this damage. And I also add that the setup is too slow and too complex, you even get a different experience from different PCs. I found myself struggling 4 or 5 times on some machines to get the tools installed, on some other no problem at all.
I would like also to add that very few professional writers or speakers are really talking about the conversion. Most of the resources you find on the web are about new cool stuff in ASP.Net 2.0 but not really about how to make my .Net 1.1 moving to the next level. I don't even know one article talking about .Net 2.0 and SQL 2000! All are written using SQL 2005 and in many cases by Windows developers. And in real world development my bets are that 90% of enterprises will keep their current SQL software untouched for the next 6 months! And as you say Paul ASP.Net 2.0 is too complex as it is. The learning curve is very steep and I don't really know how many months it will take to be at ease with the new framework.
Talking about complexity, I am really concern also by the return of the spaghetti code. We are all preaching since ASP died to separate HTML from code and now Microsoft is doing a huge step backward (For exanple the declaration of connection string in the front-end ?!?). Of course I heard the argument that this will help the beginners but how if they don't know the good practices from the beginning?.
And for the record, I agree completely with you in principle. =)
James> I was hoping they would create a workaround... We don't need no stinkin' workarounds. This is how it looks today: a lot of features have been removed, and MS is trying to put them back under pressure as workarounds. I think there was no need to change the model in the first place and lose so many features. A web project may be a specific kind of project, but a project nonetheless. Which means web projects should offer the same support other projects do.
I'll agree on your second point. On the third, I think you're placing the responsibility in the wrong place. If you want to pass in the right data for the postback, do so with the CommandArgument and CommandName. That's not Microsoft's fault. And on your first point, well, I'd like to think I'm an "enterprise developer," and I've not run into any issues yet from having a folder-based project.
I agree with Pauls original statements. I think there's a ton more in ASP.NET 2.0 and Visual Studio that follows this same model - provide some high visibility feature, make it easy to work for demos, then leave out some key features that people really need once they build real applications. Lots of stuff in 2.0 like this. Localization and Resources is another that absolutely blows me away. The Pre-Compiler which has made deployment an absolute mess. Script Callbacks with its minimalist approach. The list goes on and on. Sure there's lots of good stuff too, but so many of the features just fall short of being truly usable in day to day development that you won't be able to actually utilize them in your apps and create your own. Oh and Charles - yeah, you can write your own, but the folks at Microsoft should be good enough to know their customers to know what's needed. The ASP.NET team's been pretty arrogant about how they position ASP.NET 2.0 as faster, better, cleaner, easier etc. when in fact this may turn out to be a big myth... Workarounds are OK for a product that has matured. Workarounds for a product that haven't even shipped is pathetic especially if you go to Feedback center and review many suggestions and Microsoft themselves posts solutions as 'workarounds'. That's a pretty sad state of affairs...
Hey Jeff: You are correct that its not required for you to fall into bad practices, but my point is that the big timesavers and default options tend to lead those that use them to poor practices when used on anything but the simplist of web apps. Is that MS's fault? Not completely, and I agree that there is a huge market that actively needs this type of simplicity -- so I'm glad I'm not in MS's shoes when its time to decide such things. But its also very telling that even some of the better MS developers, on one of the most visible web apps, fell into these very problems, and that it took quite a long time to get them fixed (and even now some things aren't great). Now Jeff and James: As for "enterprise developers" that haven't encountered these issues, (1) the argument that I haven't had a problem doesn't really add any value since there are obviously many that are having such problems, and (2) you almost seem like you want to get into a "my app is bigger than yours" argument so that you can then be called the real "enterprise developer" here, and finally (3) you really are beginning to sound like "MS drones" saying that "MS can do no wrong". I realize these may not be your intent, so please don't take offense, but take a step back and look at what you're saying.
Paul, I agree with you on most of this. In your first point, however, I disagree that the project-less nature of ASP.NET is not a problem for 99% of developers. In my opinion, it is a problem for many devs. One thing I loved about getting into .NET from the ASP.old world is the fact that it made web app development much closer to smart client development. Now it seems that isn't as much the case.
Folks, you got to remember that the target audience for ASP.Net was for vb6 developers who dreamed of writing webapps but didn't want to know anything about markup or asp developers who were pasta magicians. ASP.Net developers were never supposed to access the document dom themselves or peek at the markup, their vb6 developers for crying out loud or vbscript developers who couldn't write anything but spaghetti code - right?thats what Microsoft kept hearing when they asked for feedback. Thats why we have what we have. Things that were hard for newbies are easy, things that were easy for experts now become more difficult. I have to believe the standard page and controls simply aren't meant for everybody. Nothing prevents you from throwing all that away and doing your own architecture.
Get more pretty pictures == get less flexibility and good coding styles. ASP.NET's been controlled mainly by marketeers as it seems. I mean... who cooked up that design time databinding system? And that new project system? Ever payed a visit to a 100-person enterprise dev team? ... I agree with you Paul, something is seriously wrong. There are nice new features, but these new features mainly shine in demos and in books, not in enterprise apps.
Someone needs to start a petition for a beta 3 or .Net 2.0. Maybe a suggestion should be submitted to the product feedback center.
Paul: You're making a lot of ridiculous assertions about me based on two sentences. I'd rather you didn't do that.
Agree I am on a petition for a Beta 3. It make sense when you see all the latest changes in community preview releases.
Paul, I have been harping on some of the same things. I've been blogging about these topics for a while. VS 2005 isn't ready. My shop at Pluck has fully deprecated v1.1. www.pluck.com and www.shadows.com are running on ASP.NET 2.0 Beta 2, so I'm in the trenches with this new product. The new web "sites" REALLY suck, and I hate them. The good news is that I've been able to "pursuade" VS 2005 into letting me use a class library project for web apps without any sacrifice of the IDE's features. I believe I'm going to start advocating a Beta 3. James, I know you, but you _have_ to be smoking crack if you like the new web projects. Here's a challenge for you: Make a web site, reference the Log4Net library. Create an NAnt build/deploy script for this. Check it all into Subversion (don't check in the Bin folder - which should be common sense). Go to a build machine, pull down the project from source control and run the build/deploy script. Then try to run the app on a web server. What? It didn't work. That, my friend, is what's wrong with the lack of a project file. Class library project in VS 2005 - no problem.
Well all this sounds really promising as an upgrade path. But at least the designer won't rewrite my HTML anymore right? Please tell me that at least works?
Jeff, Things are different that is for sure. You can't deploy like you used to, I agree with that. In your scenario some extra work needs to be done to make sure dependent assemblies are checked into source control and referenced by your build script, but in the end you actually have a cleaner deploy scenario. I prefer having explicit control over what is deployed. Paul, I am not trying to be better than anyone and I am not a "MS drone". It's a sad day where you can't state your opinion on something without the accusations flying. I have said in each of my posts I think they should have implemented both models and I stand by my OPINION that the web site model is a better representation of what will be deployed on the server. But I will say it again, they should have implemented BOTH models then we wouldnt be having these conversations and people could use whatever model they prefer. -James
WebSites in ASP.NET ARE Class Libraries. James if you think differently you are mistaken. They get compiled into dlls. Microsoft could have EASILY broken the IIS dependancy without removing the project file. I agree with the sentiment, they made ASP.NET 2.0 for mom and pop hobbyists instead of Enterprise application developers. I don't even see the point of using 2.0 given its current state.
Palermo, I almost forgot, some of those deployments issues will be fixed when nant is updated for 2.0. As it stands the project task doesnt support the new solution format right? This means it can't pick up where the references are stored.
"WebSites in ASP.NET ARE Class Libraries. James if you think differently you are mistaken." Well, they eventually get compiled into assemblies on the server but you still deploy .aspx files to the server which makes them a very different beast all-together.
I've been saying this for months now: http://geekswithblogs.net/ensoftblog/archive/2005/07/27/48392.aspx http://geekswithblogs.net/ensoftblog/archive/2005/07/25/48179.aspx ...to be fair: (My Take on Visual Studio 2005) http://geekswithblogs.net/ensoftblog/archive/2005/06/18/44134.aspx
In addition, if ASP.Net can support both styles, then we've got a winner. Project based "class library" ASP.Net running on the mini web server is perfect for enterprise developers.
I'm pretty slow on the uptake BUT.... wouldn't the void caused by the loss of a project file be filled by an msbuild file? (or for now an NAnt build file). I mean, most of what is being talked about in a project file (dependancies, pre/post build events) could be done in a build file right? Or did I miss a memo between versions and I don't know that they've cut MSBuild from Whidbey? Is the build file the new project file and that's missing from the web projects. <--has WebDev Express installed, but hasn't opened it yet.
J. Palermo, "Go to a build machine, pull down the project from source control and run the build/deploy script. Then try to run the app on a web server. What? It didn't work." I see your point. That does suck. But does that work now? The way we've handled that is by creating a \lib directory and storing our binary dependancies in there. Right now they get copied to the /bin directory at compile time by VS, but I've been moving away from VS and starting to use makefiles/buildfiles.
MS posted a change they have made to help refresh file based references. See comments in http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=4052b0c1-e0e3-4c3e-b911-48d393c8becc
Boy, that sure looks a bit kludgey! Mewonders if they actually changed the COMPILER to do this... Being an ol' compiler hacker, I get to say: EEEeeewwww! It would have been easier to implement this as a post-build rule. Maybe that's what they really meant. (But then...wouldn't that require a project file to store such a post-build rule?) Regardless, this might be workable. The only side-effect is that any other tools that have to look at the target folder (that contains these new .refresh files) will now have to ignore them in some instances. And here I thought they had sorta promised to restore the project file in whole, not just partial-functionally. Guess they're going to kludge the tools for the advanced and enterprise developers and instead favor the beginners... Sad! (They claim to be listening, but are losing parts of the message during translation by some program manager or project manager. I'm sure they'll rationalize this "do it right the third time" development technique as "lack of resources"...calling their software developers "resources" once again.)
Meanwhile, Paschal has reported a request for a VS2005 Beta 3 has been officially posted on the Feedback Center: http://weblogs.asp.net/pleloup/archive/2005/08/12/422314.aspx I voted for it, so that they can get the web project file feature "done right the fourth time"...
RossCode.com - References in Web Projects in VS.NET 2005
Yeah I think its "XML Spy" style XML projects. its cool, you can navigate through data hierarchially instead of as a DataTable :-) Also, sample data schema validation and so forth. Its cool, and some of these features would be nice in VS, but of course theres Altova XML Spy :-)
For me ASP.NET should be able to produce output I'm proud of and be part of the development process I want. That's: XHTML CSS One source for all browsers OR I control it Automated tests that easy to implement ... Somewhere along the line this design seems to have focused on the Wizard driven developer and forgotten the "unassisted" developer. In 1.1 I find myself throwing out all the design surface stuff driven stuff. It doesn't really mean more work cause fixing the wizard stuff ofdten seems undoable! I haven't tested the version 2 stuff, but I was hoping they had made it more possible for the non wizard developer to use this stuff. This post fills me with despair. Has runaway complexity destroyed ASP.NET forever??
>Themes and Skins are one of the cool >new features of ASP.NET v2, but have you ever >stopped to think that they wouldn't be needed >we just used CSS stylesheets! Actually, that isn't quite true. CSS is a way of styling HTML tags. Themes are a way of styling ASP.NET controls. Since controls are potentially quite complex composite HTML entities, styling them entirely through CSS could actually be quite complex, and would require knowledge of the exact HTML emitted by the control. Being able to style all GridViews on a site in a consistent way (where each aspect of the grid style can be specified using CSS, of course) is actually quite nice.
Actually even the most complex web controls tend to have all their many properties also totally configurable by just a few CSS classes. For instance, on a grid you may have a bunch of header properties, footer properties, main item properties, alt item properties, and selected item properties, but they are all equally able to be set with just CSS classes for header, footer, main item, alt item, and selected item. The same is true for the calendar (now that title works) and even web parts (although the implementation does not work), as well as every other well-written control I've ever seen, no matter how complex. Yes there are probably some controls that don't offer this, but that's a reflection of a design that wasn't friendly to CSS classes and not the complexity of the control. And I'm sure there are only more of these unfriendly CSS controls partly because of the MS mentality that you create lots of properties instead of just simple CSS classes. Now as much as I don't plan on personally using themes and skins, I do see a huge need for them. Huh? That's right, the majority of ASP.NET web devs don't know how to use CSS classes and will thus hopefully come to love themes and skins! :)
With your background in Visual Basic and COBOL its pretty hilarious that you are so arrogant. At work there is a group of us that follow your blog just for the laughs. One person said that this isn't a blog as much as it is an homage to your ego.
Glad I can bring amusement to you and your buddies. By the way, just for my ego's satisfaction, my background is almost totally math, and then it was Delphi long before VB. By the way, I'm more inclined to delete anonymous posts, although I couldn't resist this one.
Honestly, many of the things that we complain about today, aren't really huge. They are annoyances, but intelligent devs (and Architects) can work around them. I'm actually mostly concerned about fundamental design issues. Those are more difficult to fix. Also, there are other issues (Like PerfMon counter issues in .NET 1.1) that are more of a 'showstopper' than build or project difficulties. I do think that beta 3 is a waste of time, this close to release. It's really unlikely that there would be time to fix issues found in beta 3. Consider that there is probably a 2-4 week time difference between RTM (Release to Manufacturing) and GA (Generally Available). Microsoft has taken to calling RTM the time software is release to customers, but that's not really true. There is lead time for media and packaging preperation. The software actually does need to spend time in Manufacturing - remember, Visual Studio and SQL Server 2005 are both 'shrinkwrap' products. It takes time to shrinkwrap. So, this all means that the Visual Studio and SQL Server teams are very, very short on time. They can't afford to make changes that may cause ripple effects accross the codebase, there is just to big of a chance of bug regression. I would expect that the PDC release of VS.NET and SQL Server will be extremely close to RTM/GA. Unless you find a critical bug, I'm pretty sure that we'll find that there will be very few changes to Whidbey.
Sorry, I just realized that my comment was incredibly poorly written. End of a long day. What I was really trying to get at was that Themes let you style ALL instances of a control in one place (using CSS or not). That is, if you theme a control, you don't need to copy all of those styles to every instance of the control on your site - you set them once, and only have to change them in one place. It also makes it easier to rename styles (as you only have to change the style reference in one place) and to swap in and out entirely new style sets (swapping in a completely difference style sheet). Is it a huge win? No, but it can be convenient. I don't think of it as an alternative to CSS, just a more convenient way to apply it.
I've been on vacation the last few days (and fly back tomororw night), so am just catching up on the whole web project system thread (serves me right for finding an internet cafe to check my email). I'm planning on posting a blog post on Monday or Tuesday that goes into the web project system in more detail and why we've made some of the changes we've made. One thing I do want to clarrify is that we aren't changing things for the sake of "hobbyist developers". There are *a lot* of new web project system feaures that are specifially designed for enterprise building scenarios: much better scalability in terms of number of pages supported (support apps with 1000s of .aspx pages), patching binary support, much better error detection (much, much deeper and more accurate than VS2003 compilation), richer levels of pre-compilation support (including allowing you to completely remove all run-time compilation -- something not supported by VS2003 and ASP.NET V1.1 today), much richer command-line compilation support with MSBuild integration just to name a few. The web project system is also fully integrated with the new VSTS and Team Foundation features -- so you can now automate nightly builds using the new build server, run automated class unit tests, run automated web UI unit tests, calculate both block and arc code execution coverage of code, and perform performance tests against it. The other thing I want to clarrify is that most (if not all) of the "missing features" that have been called out as part of this discussion are now fully supported in post-beta2 builds (note: the Beta2 code-base was frozen in February -- so a lot of time has passed since then). Specifically, some of the ones I've seen called out that I want to clarrify: 1) Source control checks in \bin directory binaries. This was *never* by design (since it makes source control extremely painful and almost useless), but was a late-regression in the beta2 tree that wasn't caught in time. This has been fixed since then and not be an issue in the final product. 2) Exclude file support. This was something we origionally thought wasn't needed because of a new feature in web compilation that allows projects to skip and continue over errors. The feedback after beta2 clearly indicated we were wrong so we added it back in. It will be fully supported in the final product. 3) Solution-to-Solution references and Copy-Local assemblies. This was a missing feature in Beta2 that we've also added and will fully support in the final product. 4) Assembly created for each page with Publish Web wizard. The web project system supports a granular level of assembly creation. In Beta2 it supported lots of different levels, but the Publish Web wizard was hard-coded to "fixed names" support which generated 1 assembly per page (useful for extreme patching scenarios, but also something that generates a lot of assemblies). This could be overrided using MSBuild, but wasn't very discoverable. The Publish Web Wizard now allows developers to choose the granularity they want in the dialog -- and the default is now 1 assembly per directory (which still provides good granularity -- but a lot fewer assemblies). I'll go into more details about the web project system on Monday, but wanted to quickly answer some of the concerns above. Thanks, Scott
Well, they're changing the runtime to include Nullables... thats a pretty big ripple. Truth is this is software. Electronic media. Forget the shrink wrap. Let that be a nice thing that people can hold if they so choose when they buy the product. Let VS be the program that they have version issues with, and ServicePack VisualStudio2005 a HECK of a lot more than VS2003 (which to this day has NEVER had a SP) So I'd say concentrate on working out those Nullable runtime changes.
Sure. Fine. Beta 3. Whatever... Just release the framework itself (which is rock solid). Too many times people forget that .Net != Visual Studio. I started programming with CLI compilers way back when and can easily do it today. Yeah I like the pretty colors, syntax checking, and whatnot but if it means a delay then it's costing me time and money in developing apps today.
Kevin -- very nicely said. Of course it only works if your devs aren't setting properties and/or styles on the individual controls, since that would override your theme/skin. But if that's the policy that you enforce, and even for CSS that's always the hard part, then I agree that can be very useful.
To clear a few things up: 1. When I asked for a Beta 3, I ment for Visual Studio only, not the framework. That is why I filed the suggesetion under Visual Studio. 2. When I put the suggestion up on the feedback center, I knew that a Beta 3 probably wouldn't happen because I doubt they're going to push back RTM no matter what. 3. Due to #2, my main hope was that putting a suggestion up like this would get the community discussing VS issues more loudly so that the VS team would see what areas people are the most concerned about (which seems to mainly be web project issues). Then those areas could hopefully get addressed before release. The last time VS had a service pack was in the 6.0 days so whatever issues that devs think are important need to get fixed before RTM.
Thanks for the compliments though I must confess I had to ask around for the answer as well. :) I've blogged about how it is done. ~ Paul
COOL, thanks
cool
To whomever likes to post anonymously and/or pretend to be someone else: Its bad enough to post anonymous drivel, but its far worse to post nonsense under the guise of someone else. While I try to approve anything that isn't spam, even if it is critical of me personally, I will be looking closer for now on to make sure that others are not being made to look badly.
>only works if your devs aren't setting >properties and/or styles on the individual >controls Actually, themes override page-level control settings. Stylesheet themes, on the other hand, allow the page developer to override the theme settings. Ppersonally I find that naming to be unfortunate, as the distinction between the two types of themes isn't all that clear from the names.
for a joke that went too far. I will not bother you or your blog any further.
Kevin -- Wow! I did not know that! That has changed from the early alpha previews, and I guess I was so disappointed that I never bothered to keep up. Shame on me. I'll have to seriously rethink things and try more themes/skins -- although I'll still set css classes in those themes/skins. :)
So how do you do it then? I had exactly the same problem Mr Wilson described I couldn't figure out how to pass a generic type where the type itself was a variable? Paul can you post some indicative code?
Paul Welter details on his blog, but here's the simple code snippet: private BindingFlags internalFlags = BindingFlags.CreateInstance | (BindingFlags.NonPublic | BindingFlags.Instance); Type genericType = typeof(CustomType<>).MakeGenericType(type); object[] args = new object[] { ... }; relations = Activator.CreateInstance(genericType, internalFlags, null, args, null, null);
Aargh... I wish I had run into this post a while earlier because I struggled with this one for quite a while as well before figuring it out. Generics for all the power they present are going to take some time to digest and figure out all the oddities that they represent to the type system. Actually there's a slightly easier way: this.m_GenericEntity = Activator.CreateInstance<EntityType>();
I saw that this weekend, very entertaining, highly recommended. Is there anything cuter than watching penguins waddle around in sub-zero weather?
Rick: That work's great if you know the whole type (RootType<InnerType>) as a variable, but it doesn't work if both parts are variables.
Sheesh. You guys are all way over my head. Now I have a reason to start playing with .Net 2.0 - just so I can play and learn about all this stuff and keep up with the conversation.
you may find this of interest as well: http://www.thedatafarm.com/blog/PermaLink.aspx?guid=22bc28a2-2497-4ab8-a991-49e4b13604a4
... only on sqlserver 2005, as the db has to promote the transaction to a DTC controlled one, it won't work on Oracle, IMHO.
I tested this with Ms Sql 2000 -- so I know that its false to say you must have Ms Sql 2005. And my understanding, but untested, is that Oracle does support the DTC -- else how would it work with Enterprise Services. What I keep hearing, and its also in Julie's link, is that you will automatically get even a single transaction in the DTC unless you are using Ms Sql 2005. Thus you want to continue using IDbTransactions unless you really need more, but then it should work seamlessly -- or at least that was true on Ms Sql 2000 in my tests.
Yes, Oracle will integrate into the DTC, through a tool that Oracle has called the "Oracle Services for MTS" assuming you are using the Oracle Client. The MS Client for Oracle has support for DTC built in, however, it does provide for full integration with Oracle. I don't know if any of this will allow for integration with the TransactionScope without the 10gR2 client. According to the things that I have read and heard, the 10gR2 client will provide additional integration with Whidbey.
I thought to get the fully promotable transaction, you had to have a specific type of connection, which Sql2k5 as the first database to support this connection.
There's a lot of things we've all read and heard, and that's the problem. Some people seem to have heard that you need Ms Sql 2005, but my tests show that is simply not true since it worked with Ms Sql 2000. Of course my assumption that things will also work with Oracle, since I don't see it as any different than Ms Sql 2000, also needs to be tested since otherwise its no better advice than the other hearsay. The one thing that seems to be consistent in all the hearsay is that only Ms Sql 2005 is smart enough to not enlist in the DTC if its not necessary -- but that's not the same thing as saying you need Ms Sql 2005.
By the way, this reminds me of something I learned from someone far better than I -- and which taught me that you must test things for yourself and not believe what you read/hear: If you remember COM+ transactions, they required you to call either SetComplete or SetAbort. All the examples only called SetAbort if something went wrong, and in fact all the documentation flat-out said that calling SetAbort would doom the transaction. So I was quite annoyed when I looked at my colleague's code and notice that the first thing he always did was call SetAbort! My reading of the documentation and all the MS examples meant that he was automatically making all his transactions fail -- but of course he was not and that much was obvious since his code was obviously working. So I asked him how this could possibly be working, and he told me that what mattered was not whether or not you called SetAbort, but what was called last when you left that method -- so his calling SetAbort first didn't matter as long as he later called SetComplete when things worked correctly. I could see he had to be right since his code worked, but that brought up my next question, which was why do it this way though? His answer was that the default was Complete, so if something catastropic happened but SetAbort was not called then the transaction would get committed! What could possibly happen that would be catastrophic and not get my SetAbort called, since it was in my error handler? He pointed out that there are lots of things that can go wrong in the real world, like power and network surges. I kept wanting to insist on the documentation and all the code examples -- and he encouraged me to test it myself. It took the better part of a day, but I finally did manage to hit my power button at just the right time to cause just such a catastrophic event -- and I proved him to be quite right and all the documentation and examples very much flawed. So the thing I learned was that you can't assume that what you hear and/or read is correct in all the details.
Paul, Please correct me if I am wrong on this, however, I think we are looking at two slightly different questions. #1 is your original question with regards to the transactionscope integration. I believe that you are talking about the ability to integrate. #2 is the ability to have promotable transactions. I believe that this is a inadvertent threadjacking. Wally
I'm not sure I see the distinction. If you mean that only Ms Sql 2005 doesn't automatically enlist the DTC then I agree, but if you mean that Ms Sql 2000 (and probably Oracle) won't get promoted to the DTC then I think I disagree.
Ok, I misread your posting. I thought the transaction wasn't initially in an enterprise services managed component (or what's its successor called in .NET 2.0). So if it's not in a COM+ managed component, the DTC won't know about it, and it will never get promoted. Though if it's already in a COM+ managed transaction, then yes, you don't need to do anything. But that's not really that new, in .NET 1.x this is also already the case.
No you read the initial post correctly. I have intentionally not introduced anything related to Enterprise Services or COM+ -- other than the of course using the new TransactionScope. All I did was create two regular IDbTransactions against a Ms Sql 2000 database and execute two commands, the first of which I committed, but the second one failed and rolled back (due to duplicate record in my particular case). The block of code without be wrapped in a TransactionScope ended up with the first command having been committed, but the second not -- as I expected. The exact same block of code wrapped in a TransactionScope had the result that both commands were rolled back. Nowhere did I do anything else that involved any setup on my part to prepare things for the DTC by using EnterpriseServices or COM+.
Paul I saw a demo of this today. And this is my take away. Yes you can use System.Transactions with SQL2000 there is a drawback however. Because SQL2000 and every other database except SQL2005 aren't Ligthweight transaction aware, once a SqlConnection (2000) has an ambient TransactionScope it automatically enlists with MSDTC, even if only that connection is the only connection used in the transaction. I.e you don't get lightweight transactions. What does that mean? It means sure you can use a TransactionScope with SQL2000 but if you could have done it with a standard SqlTransaction and no DTC you have just made your code slower, because of the MSDTC overhead. To illustrate imagine this in a transaction scope: connection2000.open(); commandOn2000_1.execute(); commandOn2000_2.execute(); the call to connection.Open() will always spin up a MSDTC transaction, why because 2000 can't upgrade it's transaction manager on demand, and so it needs to start with the most flexible one first namely the MSDTC one. whereas this: connection2005.open(); commandOn2005_1.execute(); commandOn2005_2.execute(); won't get to MSDTC because 2005 is compatible with the ability to upgrade transaction managers on demand, so it can start with the lightweight one (which doesn't use MSDTC) and since it can all be done locally it never needs to upgrade. Does that make sense?
Sure, we are in agreement that using the TransactionScope is not the way to do a single transaction (unless maybe you know you are using SQL 2005). I don't think anyone has disagreed with that, although maybe that wasn't clear so thank you for clarifying that. My point was that you can take your existing code that uses the IDbTransaction and seamlessly enlist it into a TransactionScope when you need to do so.
We maybe in agreement, the point is it is a real shame... I would have really liked to replace my SqlTransaction code, with TransactionScope calls instead, it would have made my code so much more readable. But now I have a decision to make is readability or speed more important?
"...But you've already marked your Customer class with the attribute "Table(Name = 'Customers')", not too mention all the Column attributes -- so why isn't the attribute enough to make it clear what "Customers" refers to?" Perhaps one might use two databases at once? What's wrong with that? About being tied to MS SQL: I don't think that it will be tied to anything at the end (not sure what's the situation right now). But look on the bright side: it supports read after save and it supports saving all context at once. :-)
I think you'll find with a closer look at the docs that even using multiple databases doesn't require that additional complexity. And while I hope you're right that it won't be tied to MS Sql in the end, so far experience has taught us otherwise -- and as others have already pointed out (and me also a long time ago), an attribute based system makes it much harder to support multiple databases in many real-world cases. Finally, who doesn't support read after save, and you already know that I consider saving an entire context to be a questionable practice in most cases, but to each his own.
You said: why should I have to say "from c in db.Customers select c" when I could just "from Customers" or have a strongly typed Get accessor... In actuality, you can do foreach(var c in db.Customers). You do not have to use select if you want all the customers. Table<Customer> derives from IEnumerable<Customer>.
That's good to know, although in that case it doesn't look like there's any way to define a default sort order that many of us provide.
Would anyone plase actually read the overview document by Box and Hejlsberg? Quote: "Full-blown object/relational mapping could also take advantage of this core query capability for users wanting that functionality." Dlinq is not MEANT to be a full ORM. It is strongly typed querying against databases, that is it. I really don't believe that the main scenario they anticipate here is that you actually use instances of the classes on which you define the mapping as your business entities. They are just used to give you strongly typed access to a specific DB, that is it. What type of object you actually get from a query is a totally different question, and one Dlinq does not enforce anything on you. You can just project into an anonymous type, or if you want into objects that are your business entities. Its up to you.
It may not be intended to be a "full" ORM, but it is nonetheless an ORM. My own ORM also does not try to have every feature, but that's because it is targetted at simplicity and the most common 90-95% scenarios -- and I'm stating that DLinq fails in those goals too, and that after years of effort and already having had lots of feedback. Now I have read that document and seen that quote, but I believe you're failing to see that anyone attempting to build a "full ORM" on top of DLinq will still be limited by its basics. How will you build something on top of it without first defining these attribute based entities, and how will you add support for other databases if DLinq does not do so? No, I'm sorry, but DLinq is an O/R Mapper although it does appear they don't want to call it that -- maybe they're afraid people will then discover there are others once they are familiar with that term. :) And if someone seriously believes its not an ORM, then do tell what it is?
You may want to enter your feedback at http://blogs.msdn.com/danielfe/archive/2005/09/15/467239.aspx
Hi Paul, "I think you'll find with a closer look at the docs that even using multiple databases doesn't require that additional complexity." But how would you specify from which database you want read from? "And while I hope you're right that it won't be tied to MS Sql in the end, so far experience has taught us otherwise " Yes and no. Look at ADO.NET for example. "-- and as others have already pointed out (and me also a long time ago), an attribute based system makes it much harder to support multiple databases in many real-world cases." Attributes are just attributes. This doesn't mean that one can use some sort of mapping file, too. "Finally, who doesn't support read after save, and you already know that I consider saving an entire context to be a questionable practice in most cases, but to each his own" :-)
I think that David has a good point here. DLinq alone is a querying engine (sort of). ORM is done through DataContext which is a sepearate beast.
I have my own ORM also so when I heard about dlinq I was also wondering what place was left in the world for it. I agree with you that linq is great but dlinq is a poor substitute for a real ORM. I think you're overstating the importance of the fact that 99% of developers never use anything but what MS gives them. First off, MS is certainly giving them something much better than they've had before, so even for those people, dlinq is a step up. But more importantly, for those of us who *do* care about the features MS left out, the infrastructure invented to support dlinq pretty much guarantees that our own ORMs will be able to do cool stuff that's previously been unable to. For example, right now users of my ORM have to jump through hoops to do sorting - either by declaring several gets with different sort orders, or by doing stuff like: ArrayList people = Person.GetByAll(); people.Sort(Person.LastNameOrder); foreach (Person person in people) {...} secondary sorts are even more awkward. Allowing stuff like: var people = from p in Person.GetByAll() orderby p.LastName, p.FirstName select p; is much nicer especially if it's possible to get the database to do that ordering, which I think it is (again, using the same technology developed for dlinq).
I was actually waiting for your comments on this, and you are pretty much spot on. One more point: One of my complaints about WinFS when introduced at PDC 2003 is that they introduced Yet Another Query Language. We've got Query Languages for WMI, MSI, SQL (and all subsets like T-SQL and PL-SQL), XPath, SNMP, and who knows what else. Now, added to the mix is Linq/DLinq/XLinq. As a 'front-line' developer, the only usefull thing that I can hope for out of all of this is a melding of query languages while working in a .NET world. I think you are correct when you state that because it is in the framework, this will become the defacto standard. -- On a related note, what was more interesting to me than Linq was the idea of extension methods. To be introduced in C# 3.0, it provides a mechanism for adding functionality to existing (usually sealed) classes. Seriously cool stuff, though it should be used with care.
"On a related note, what was more interesting to me than Linq was the idea of extension methods. To be introduced in C# 3.0, it provides a mechanism for adding functionality to existing (usually sealed) classes. Seriously cool stuff, though it should be used with care." The rest of the world calls that AOP and is generations ahead in that field compared to the .NET world, except perhaps spring.NET and some early bird weavers. Extension methods can IMHO be used to enable AOP elements, which is great, though this can already be done transparently, now, as spring.NET shows. For the people who think DLinq isn't an attempt to write an O/R mapper, it's my understanding that DLinq performs CRUD operations, not just retrieval. The document of DLinq for example mentions change tracking and why would anyone need changetracking if you don't save data? ;)
The DLinq document I linked to quite explicitly has persistence examples -- so that's not an open question.
http://www.lowendahl.net/showShout.aspx?id=53
Frans - Yes, I'm familiar with AOP - however, until support baked in, then it's unlikely that I will be able to use it. I don't drive such feature adoption in my organization. For me, Spring.NET (or O/R Mappers) are a tough sell. I've got a large team to convince. However, if a feature is part of the base language, then it is generally not an issue.
"How will you build something on top of it without first defining these attribute based entities, and how will you add support for other databases if DLinq does not do so?" I think you're not looking deep enough at the technology yet. You're letting the "lameness" of DLINQ, which I somewhat agree with, blind you from what really matters. LINQ is the base. DLINQ and XLINQ are built on top of LINQ. If you wanted to build your own ORM you don't build on top of DLINQ. You build something that is a sibling to DLINQ. You then build LINQ support for your custom ORM. So considering your existing architecture, you essentially keep exactly what you have now for configuring and representing entities and all you do is throw out whatever mechanism you came up with for querying and replace it with support for LINQ expressions. For example, for querying in my custom ORM implementation I have the concept of an EntityQuery, EntityQueryConditionGroup and EntityQueryCondition classes. EntityQuery is made up of multiple conditions as well as exposing sorting and paging semantics. These essentially get thrown out when I update my ORM implementation to work with link LINQ. Instead, I allow people to use LINQ and I translate the LINQ expressions into SQL statments just like DLINQ does to be as efficient as humanly possible for the backend data store I'm talking to. For example, you mentioned paging, I could be sure to issue a TOP statement to ensure I don't get back any more records than I really need. BTW, DLINQ *does* support this the same way, the expression is just a weird name which I can't remember off the top of my head. Ultimaely I believe that once you give it some more time you'll realize that how they implement DLINQ really doesn't matter. Focus on your ORM and be very comfortable in the fact that you'll be able to integrate with the rich querying syntax smoothly into languages using your own custom LINQ expressions. Cheers, Drew
Hi Drew: That I can agree with -- you are correct that I can build just on top of Linq. I guess my issue is that even though this can be really cool for my OR/M, its not enough since MS is also giving us DLinq. Why, since as you point out I can ignore DLinq? Because the vast majority of people and shops in the MS world expect you to use the MS implementation. If MS only gave us Linq then a decent minority would be willing to accept other mappers that took advantage of Linq. But once MS also gives us DLinq, then that will be what most people will use, and they will never look elsewhere or see that there is even a reason to do so. While I do really like my mapper, I know that I'll have far more clients that won't be willing to use it or any other mapper -- and since I'm a consultant far more than I am a vendor that is a big deal to me. I do think Linq is great, but I find it inexcusable that MS has worked over 5 years on OR/M and in their 3rd attempt now they have made a mess. What were they thinking?
Paul, Yeah, I hear ya. I guess that's less of an issue for me personally since I'm not a consultant. That said, this technology is way out there (probably 2008) and they were VERY open to feedback. If you really are worried about DLINQ's shortcomings, I highly recommend getting involved right now if you want to voice your opinions and maybe get some of the changes you'd like to see taken care of. I'm just extremely pleased with the base LINQ technology and that our own ORM implementations will be first class citizens with respect to the language syntax. :)
Your review sounds like sour grapes to me. If you want all customers just use: "var q = Customers" I don't see how you can get any more succinct than this. Inheritance will be the next feature added when they return to redmond, heck maybe in time for your MVP conference. WinFS integration with LINQ was shown at the conference. There are several severe limitations with Dlinq right now but lets kick the tires and get them to raise the bar.
Hm, I am heavily looking into the whole LINQ thing right now for the next generation of our EntityBroker... AND.... It looks like while we WILL support LINQ (as "ELinq"), we will NOT throw out or own stuff. Because sadly LINQ is way too limited in it's expressions. Stuff like paging, load hints can not be represented - the query syntax is just too simple. As elegant as it is, sadly.
Just wondering if c# 3.0 is going to be released with visual studio 2005 and .net 2 in november 2005. All this new linq stuff looks cool but i'm wondering if its worth my time to looking into this if its not getting released for another year or something. thanks
Oh my no -- C# 2.0 will be released with VS 2005 and .NET v2.0 -- not C# 3.0. You're looking at 2007 or 2008 before C# 3.0 and .NET v3.0 comes out. PDCs are always about the next wave, not the current wave -- TechEd and other conferences are better suited for learning the current wave. So the question for you is are you preparing for 2.0 ?
As I understand it LINQ does not require a new runtime, i.e. .NET 3.0, but runs on .Net 2.0. What it does need is new compilers though. In the PDC presentations Anders Hejlsberg said they were targeting ORCAS(next release of Visual Studio after Whidbey) for those. This *probbaly* means early 2007. (http://msdn.microsoft.com/vstudio/productinfo/roadmap.aspx)
I think adding some information here might help. DLinq was designed to be an extremely low entry point into ORM and to be used as an example of how to build a LINQ enabled API. Dlinq is a preview of technology that will likely change considerably before it ships, adding or changing features based on feedback. We decided to show this technology extremely early in its design so that by the time it ships it will be the right combination for a broad customer base. However, we anticpate that other ORM vendors offering superior features will also choose to LINQ enable their products to take advantage of language integrated query. This was indeed a goal of LINQ's design, keeping the language features entirely separate from the API's. At this point, the design of DLinq has been biased heavily toward rich query support with an API targetted toward simplicity. This has lead to trade-offs in what is available today, such as attribute based mapping declarations and a class of mapping that is not much more than one-to-one with the database. While these may not scale to the kind of applications handled by ORM's such as Paul's, they are indeed simpler to define, easier to grasp and quicker to make use of. Still, our intention is not to leave DLinq in this state, but to advance it to include some of the more popular ORM features such as inheritance, many-to-many mapping, events, support for additional databases and so on, depending on the kind of feedback we get. Remember, this is not a finished product nor is it even a beta. It is not a revision of ObjectSpaces, yet it is based on many lessons we learned from building both ObjectSpaces and C-Omega. We've previewed it early so you can tell us what is most important to you.
Christoffer: While you can run the Linq preview with VS 2005, it works only by redirecting to a preview C# 3.0 compiler. It is not part of VS 2005, .NET v2.0, or C# 2.0 -- nor will it become part of that, other than a preview. Matt: Thank's for the explanation. Its very good, but its still extremely frustrating to keep hearing that this is just an early preview when we know MS has 5+ years experience wrapped up in O/RM. I still haven't heard anyone explain why ObjectSpaces wasn't turned into DLinq.
LINQ does not require version 3.0 of the .Net _framework_. It will work with v 2.0 of the framework. What it does require is new compilers. The c# 3.0 compilers and VB.Net 9.0 compilers will be part of ORCAS which *may* very well be released before a version 3.0 of the .Net framework...and hopefully before 2008 ;-)
sorry to hear you're not here. I was looking forward to meet you in person, perhaps some other time :)
Thanks for the tip. This is great info!
This sounds really fantastic, and made me sigh in relief because I had yet to hear of anything like it. Are you able to share any more details or links to any of the demos?
There's nothing else I can show or link you to right now -- its all stuff the MS ASP.NET team is in the middle of right now -- but its a high priority item since they plan to have this out at launch as an add-on.
The next and final edition of SharePoint 1, 2, 3! is happening next week. Come one, come all and hopefully learn a little bit about SharePoint
I wonder if this is what <a href="http://www.eworldui.net/UnleashIt/">Matt</a> was hired to work on? ;-)
Ah, been waiting for this one. Excellent stuff, Paul.
I loved the add in...
I look forward to aspnet_merge; however, I didn't want to wait for it. I have done something to do merging (and just plain ASP.NET 2.0 assembly renaming). Check my solutions out here: http://www.geekswithblogs.net/rwandering/admin/Referrers.aspx?EntryID=57585 and http://www.geekswithblogs.net/rwandering/admin/Referrers.aspx?EntryID=57651 Cheers!
Hi,Paul. I'm trying to use NHibernate now , but I'm confused of the files of O/R mapping (*.hbm.xml),especially the mapping tag of several relationships(one-one,one-many and many-many).Can you give me some other simple examples,code resources will be appreciate! BTW: Can you explain the outer join relationship between two objects.
You do realize that my ORMapper is not NHibernate? Anyhow, I've already posted an example using NHibernate: http://weblogs.asp.net/pwilson/archive/2005/05/26/409042.aspx. As for the outer join relationship, if you download my ORMapper demo you will see it for yourself. But the basic idea is that your object has a lookup that you want to display as part of your object -- my "lookup" feature allows that to be handled transparently. Thanks, Paul Wilson
The day got better IMO - I saw two pretty informative presentations in the SQL Track. Even with my light exposure to 2005 there was nothing new in the other track; I do think if anyone was brand new to 2005 then bar the opening sales pitch it was been a valuable day.
Paul, its the holidays, try to take it easy! :-)
Glad to hear that things are going well. Looking forward to seeing you speak at more events around Atlanta.
Oh man, play time tomarrow! Nice work Paul, can't wait to play with this.
Outstanding, Paul! Thank you for your continued support and commitment, as well as a big thanks to all those who have contributed. WilsonORMapper is a brilliant tool.
"Efficient Paging with Row_Number"??? Looking at the execution plan it doesn't seem efficient(at least according to my tests). if you select pageindex 100 with pagesize 10 out of a 10000 rows table, guess how many rows does the sql server scan? Br, Deyan Petrov
You or your DBA are still responsible for proper database indexing. O/R Mappers do NOT remove the need for database optimization -- they free your team from boring CRUD so that they can focus their time where it should be spent.
How would you index the dynamically ROW_NUMBER generated column?? Because afterall it gets down to this, when you want to filter out 1 page out of the 100 pages resultset ... Or you mean the 100 pages resultset should have been narrowed down before doing the ROW_NUMBER to 1 page using other indexes??
The ROW_NUMBER column shouldn't be the problem, at least I don't think so anyhow. The problem you are seeing is most likely the ORDER BY clause, and if you have a WHERE clause then it too possibly.
I've found the forums noticeably slower in Firefox than in IE since the upgrade. Not end-of-world slower, but ya :)
Is this more a grip with the asp.net's speed itself or the community server code itself? like if you goto CS's forums, are they just as slow/buggy?
I shot an email to telligent telling them they need to hire a developer with a good knowlege of web standards so they can avoid problems just like what you're referring to but I never heard back (not surprising though). There's really no excuse for this kind of thing anymore, it's not 1980.
Nope - works just fine for me. Pretty responsive. Next button works just fine. Most strange.
I just visited the forums in Firefox, and they loaded fine for me..just as fast as I'm used to. I clicked a few links and still seems fairly fast for me. I do, however, see that you have to click the next link twice in Firefox, but not in IE.
I haven't noticed anything. It works fine here with Firefox 1.5 That's http://forums.asp.net right ?
Paul, I use FF a lot too, but don't seem to have that problem. Do you have any plug-ins installed for FF? We've have seen some issues with FF with plug-ins, but through we had fixed all of those. Please let me know: rhoward@telligent.com
I just gave it a quick visit in fire fox and did not have any problems with load time and the next page link appears to be working fine. I would say that it was the same experience as when I was in IE. Checked the about dialog on FF, and here is what they list for version info. Plus I have no additional add ins installed. Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7
There is also an IE tab extension to open up tabs using the IE render engine. And offcourse there are some tabbed browser variants using the IE engine.
The ASP.NET forums loading quickly for me in FireFox 1.5.0.1. It's possibly an extension issue. I use the IETab extension (http://ietab.mozdev.org/) when I run into a site that works poorly in FireFox - it let you view the page inside the FireFox environment, but with the IE rendering engine.
I dont know about the speed but I can't agree more on the new layout of the asp.net site ... its simply doesnt look that it was done by professional but more by juniors ...
Steve: Just a CS Forums problem -- ASP.NET is plenty fast (if not faster than anything else). -------------- Everyone else: I'm using FF 1.5 (user-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5) with the following extensions: DOM Inspector 1.8 Talkback 1.5 Web Developer 1.0.1 Image Zoom 0.2.3 Loading a page takes too long, scrolling takes even longer, and switching back to an already loaded page takes too long. And yes, the next or page specific link takes 2 clicks in FF for me and at least one or two others apparently. While its nowhere near as slow in IE, its also obviously slower than it used to be -- and its just got too much eye candy to be as useful. A lot of the bells and whistles make for a nice feature list, but the beauty of the earlier versions was they were quick and easy to use.
Hmmm, I use FF 1.5 here and at aspnetpodcast.com site to enter and view data with no problems. I don't view the forums through the web much (mostly the nntp interface), but I haven't seen any problems this morning so far. I think the problem is the new version of CS thats out there.
Congratulations on shipping a new version Paul!
I too had problems with Firefox.Please see http://forums.asp.net/1123972/ShowPost.aspx#1123972 for my findings.
I know that CS started using components from ComponentArt.com. I like the look and feel of these components and I know they work well with major browsers. My question is what parts of CS are using ComponentArt? Abdu
Wally: I don't see any links or info on the NNTP possibility -- where is that option? I knew CS had that option, but I didn't know they were available on the ASP.NET forums.
The ComponentArt stuff is cool, but some of it isn't very speedy. I thought for awhile about giving up POP Forums and selling out, but CS has become too big and not useful if you plan to customize much of anything. I think Alex Lowe posted some stat about several thousand files being touched since the last build. You've gotta be kidding me! It's just too much a corporate product now.
that page wilco pointed to took 15 seconds to load in FF 1.5 here (and I'm on a 700KBYTE/sec internet line). I find it odd that the forums over at asp.net are so slow. Also when you reply, it's very slow, as it has to load all those darn icons again, like I care about that... :/ I'm not sure if it's the server hardware that makes it slow, or the software design. (or the stored procedures! ;) sorry couldn't resist ;)) What I do know of our own forum software is that it doesn't have to be slow. A forum is not rocket-science.
Paul: You can open an NNTP reader and point it at forums.asp.net. Use your forums username/password if you wish to post to the forums. The version of the forums that is on forums.asp.net does not do a good job pointing out the fact that NNTP is enabled and how you should use it. Later versions do a better job.
I will also state that the forums absolutely suck in Firefox 1.5 The forums are *pig slow* when scrolling up and down, and the search/advance page must have been designed by a summer student intern. I think they now are faced with the problem of going back and rebuilding from the old version, this time with a clear plan in mind.
As we say in the WoW community (and elsewhere no doubt), Jeff: QFT.
My computer struggles to show the page. When I see the memory usage by firefox.exe in Task Manager, its too much while I am visiting forums . Is firefox prefetching some of the link contents?
I never knew there was an nntp interface! Perhaps advertising the stuff more is more appropriate :) To elaborate a bit more: a forum page, any thread listing, should appear instantly, like in 2, 3 seconds MAX. In the netherlands we have tweakers.net, and their forums, http://gathering.tweakers.net has more than a million pageviews a day. I never experienced any slow downs on their forums. Ok, it's served by 4 servers or so and the database + site is stored in memory completely, but that's minor, compared to what amount of pageviews it can serve. Now, if I browse to a page in forums.asp.net, it always is slow, I never get a thread shown in like 2, 3 seconds max, it always takes a lot longer. I then wonder why that is: it can't be .NET, as that's pretty fast, so it's either the hardware or bottlenecks in the software. Either way, I think a good look at what's wrong is IMHO not that bad.
Karl: You mean quote for truth or quantum field theory? ;)
Odd, forums.asp.net is now suddenly a lot faster (threads show up in 4-5 seconds... )
Hmm. The NNTP interface to forums.asp.net shows the postings up to 15-dec-2005, no posting later than that shows up in my newsreader. Strange...
The NNTP interface is working for me with current postings. And it is very nice, although I still think the web UI should be "simpler" and speedier.
Far be it from me to refrain from piling on CS. I haven't liked what I've seen in the code since it was .Text. But... If it's taking a long time to scroll, is that really a problem with CS itself? Granted, more complex HTML takes longer to render, uses up more resources on the client, etc... But I've gone to some pig ugly sites (yahoo.com comes to mind) with some of the ugliest HTML I've ever seen in my life (tables with tables with tables and divs within more tables) and the only time I've had a scrolling issue is when a) my system has been overloaded b) they've had a lot of animated GIF's and/or Flash on the page. I just hopped over to forums.asp.net in FF 1.5( running the webdev and Yahoo toolbar extension) right now to check. Picked the largest forum I could find (Getting Started) and had no problem scrolling. All I have open right now is 5 tabs in FF and VS2K5 (which is a memory pig if there ever was one) "Advanced Search" did take a while to load for me, but the search went pretty quick. I think the slow loading is due to the tree view. Really, who still uses a tree view. What is this, 1995? So, to summarize. Loading the ASP.net forums in FF 1.5 works okie dokie for me.
I ran a syntax validator over the front page. It was set to stop at 200 errors, it got to the limit. Mostly repeats of errors that are odd parts of the standard (in my view) ("nowrap = 'true'" instead of "nowrap = 'nowrap'" and "class = ''" type stuff). There was quite a lot of unneeded space taken by spurious space characters at the end of lines. (A great way to consume bandwidth!!) Layout of code looked pretty clean except for some unnecessary line breaks within long tags.
The only problem I see with Firefox 1.5 is the above mentioned that you sometimes have to click Next twice. Other than that, the forum works as fast or faster as forums in general work, and I think the design is quite nice, and going back and forward is super fast?
Personally, my suspicion is the FreeTextBox control that they are using. I currently use it and it is VERY slow loading.
John: I'm not talking about pages with the FreeTextBox. And I personally use the FreeTextBox and don't have problems of this type. It definitely loads slower than other things (its a lot of javascript so that's the way it is), but it doesn't affect the entire page like this.
I'll be honest the FF 1.5 problems are a mystery to me. We have had a couple of people report problem, such as what Paul is experiencing, but we can't figure out how to reproduce. I just installed FF 1.5 on my DEV box and was unable to replicate the performance problems -- I even sent Paul a video/camtasia capture and he agreed that what I showed was very different from what he experiences. We'd really like to solve this problem. I appreciate the fact that there is some frustration, but until we have a reproducable set of steps... As for the performance, Frans, it performs and has performed very, very well. I suspect your problems may have more to do with the distanace of the network (were not using Akami servers inbetween) than issues with stored procedures (nice try <g>) or design. FWIW, much of the ASP.NET 2.0 design work I did was based on what is now in Community Server. The NNTP service news://forums.asp.net will continue to be an option and we are *considering* enabling email too, i.e. ability to send and receive email to the forums.
FasterFox consistently shows < 2 seconds for any page over on forums.asp.net for me, and I have a shedload of extensions installed: http://jaysonknight.com/blog/archive/2005/12/05/5002.aspx Run a tracert and see where the bottleneck is.
"As for the performance, Frans, it performs and has performed very, very well. I suspect your problems may have more to do with the distanace of the network [than with other things]" I've no idea why it's slower. If I go to the forums of anandtech.com, which are one of the largest forums in the world, and which run a commercial .NET forum package, the forums are very very fast, click a topic -> bang its there. No wait, nothing. Looking at how the forums look at forums.asp.net and for example at anandtech is that at forums.asp.net, there are way more graphics in the layout of the forums. Though what's odd is that yesterday, it loaded extremely slow (and no other internet activity was going on here) but now it's OK. Perhaps there are glitches in network connectivity or dips in performance here and there and Paul ran into one of them. I know the US of A is now asleep and perhaps that's the reason why it's fast, I'll try again later today to see if it makes a difference. About the NNTP interface, I can't get it to read messages later than 15 october 2005 (I said december but it's october). Very strange. I do get a connection error first and the second attempt loads the data, I use XanaNews newsreader. Also weird is that whatever I fill in for a password, it doesn't matter. Perhaps that's the reason of the oddness I experience with NNTP and forums.asp.net.
I have experienced the same... I have run into scrolling issues on other sites when CSS was conflicting. Also, the Click Twice for the Next (Or any page link) Button occurs only on the bottom pager not the top one, and I think it comes from the cell that you have it layed out in. It resizes after a click. You can also view the behavior by using the Web Developer Toolbar and choose Outline Table Cells. It is probably due to incorrect/Conflicting size for tables/cells. FF is less forgiving than IE. The only other thing it may be, is that on the bottom pager you have the options button. Maybe something with that is causing an issue?...
Frans: I guess the solution for you is to check the forums when the the US of A is asleep :) I think one way to troubleshoot this issue is to load a page without rendering it like using a text based browser or your app and see if the whole html loads fast and time it. Then see if the images load fast. Turn off images in the browser and test. The rendering could be the bottleneck. Do other Mozilla based browsers have the same issue? Try Netscape and flock. Abdu
******************************* I tried to to use the forums again today and found them to even slower today than ever before !! they load slow and scroll slow. Pig slow x 4!! somebody fix those things - they do not work with Firefox 1.5 *******************************
How do you use a variable in the order by clause of the row_number() function?
I don't use a variable for that -- O/R Mappers produce dynamic sql, some of it parameterized and some of it not.
asp.net forums SUCK ..period. it takes them 3-4 hours to even show your post. and by then, you probably figured it out. Basically, if you are on a tight time budget, they are useless. i dont know why they monitor it by hand when you can automate the process and show the posting right away as opposed to half a day.
Jenny: Unmoderated forums tend to get spammed so much that they quickly become even more useless. Most questions that must be answered fast have actually already been asked and answered somewhere anyhow -- there are far too many that don't even search, but instead just post and expect others to do their work for them. On the other hand, when it really is something new that hasn't been asked and answered, then you also tend to value the answer when it does come.
oh yeah i understand, moderation is essential. But few hours is a bit long to wait. Every time i search and find question similar to mine, the results that come up also have 0 Replies. I guess what happens is that by the time the posting comes through, it ends up being pushed to the back...since the postings are time sorted. If they did it fast enough, that would have been ok, the way it right now is not helping much.
here is a good idea - display the posts based on the time when they are moderated and not originally posted. anyways, pardon my ranting, i am just really annoyed by the lack of good forums
It was good to see you there, Paul - I'm sure we all look forward to seeing your presentation next month.
I'm no communicator, but maybe thats why said person is looking for someone to do his/her communication for them? :-)
What where they actually trying to say? I guess I don't get it. :D
They wanted a reply -- I don't think they wanted me to revert back to my former state, whatever that might be. :)
Well it's fairly commonly used in (British) business correspondence - meaning approximately "reply on this subject"
Why do those Brits have to keep corrupting English. :) By the way, I did look up revert on Dictionary.com just to make sure, and there was no usage that was noted that was similar to "reply". I do not know if it has British usage listed or not though.
My OED has "to go back to a former subject of discourse" which is close. My accountant uses it in correspondence - I think it's a bit old-fashioned.
People in India use it to mean "get back to"; I guess it has something to do with the British influence. I'm Indian, btw, but happen to disagree with the way this word is used.
Paul, Did some Googling on the same.. http://www.wsu.edu/~brians/errors/revert.html
That is awesome. I mean, you know, in a "I-can't-believe-the-world-is-full-of-idiots" kind of way. ;)
Hi Srikanth. Am so in tune with your music!! Indian-isms like revert and a whole list of others I've compiled during my 6-year sojourn through english as spoken in India makes me wonder how people view us
Srikant - just remembered... what about 'as per' and 'wherein'?
Paul, You probably keep an eye on Rick's blog? He's just had a rant about it to. Re the moderation - I remember in the early days Community Server had a feature that only moderated the user for the first 10 (customisable) posts. Once they had 10 approved, they were unmoderated after that. I thought that was a neat feature. I wonder if it's implemented in the ASP.Net forums.
In case anyone is wondering Rick who -- its Rick Strahl: http://west-wind.com/weblog/posts/4465.aspx.
While I've never written anything that competes at the level of an O/R Mapper, it seems that there is often a similar exchange if you've authored any technical content: Developer: I recently read your article discussing on GlobalThermoNuclear War. Could you tell me how to compile an x86-64 executible in Delphi? Me: Huh?
I have to agree with Jenny on the moderation part. Sometime, waiting for a few hours is a bit too long. Manish Jadhav
I noticed that, too - I was very suprised that the room was not full. His talk was amazing. There are very few people with his ability to take a complex issue and distill the concepts into a few clear lines of code. He's a great presenter, too.
I have been meaning to attend user group meeting; however, I have yet to make it and usually justify it by saying, "that traffic sure does suck." I think that there are a lot of .NET developers in Atlanta. They either don't know about the meetings or don't want to make the sacrifice.
I've been struggling for going on my third year now to get the word out about all the free training resources in general and user groups in particular (focusing, of course, on Atlanta) and I have to admit some level of frustration. We seem to always see the same faces. I have no idea how to get the word out to people who don't know that we exist, but the ones who do know and don't come out...all I can say is that I hope they're reading books, blogs, and everything else online to keep themselves abreast. If you're doing this kind of work professionally, how can you have no interest in improving your skills and opening yourself up to new ideas. I'll be the first to admit that User Group presentations aren't always fascinating, heck - they're not even always correct in the technology they present. However, I stand by them as one of the best ways to learn new things because people, the social animals they are, talk to each other about the new and cool stuff. I can't imagine being successful in this field without following UGs, blogs, books, etc.
Thanks for the excellent introduction to OR Mappers. I have to admit that I'm personally impressed. I've "known" what OR Mappers are for about a year or so now. I'd actually used one (an Ibatis type) for nearly five years without knowing what I was using. Now that I'm in a new job where I can actually write "object" code and I'm forced to handle all the CRUD stuff manually, I can really see how a quality OR Mapper can be helpful. This presentation showed me, in extremely clear language and wickedly pointed demos, how much time and effort I'm spending/wasting on trivial database access just to keep my application glued to the data. I'm about to start working with the Wilson OR Mapper in my company's application, starting TODAY!
Europeans and Asians will be familiar with spending money via their cellphones, but receiving money? I'm not sure I see the use case for that. Security in this context worries me (especially considering the lack of security on phones in general - consider some recent highly public hackings like Paris Hilton)
Their answer to security is that your phone receives a call-back where you have to confirm payment with your PIN.
Hi Paul, It was a great presentation. I was really surprised to find out that it was 9PM when the question answer session ended. Time really flew by very quickly. Obviously, there were many who enjoyed the O/R mapping concepts. Rama Krishna
So, got your XBox already?
No -- and never will at this rate. :) My kid has a PS2 anyhow, which is far better for his age, since the XBox doesn't have much for the younger scene.
Hi, Paul: I definitely agree with Rama. It was a great presentation. For the record, I thought your speaking skills were very good. You are the first person I've heard describe themselves as an O/R Mapper Evangelist! I think this is one of the key topics today regarding the subject of applications development. I'm trying to do my own internal evangelizing at my company on this very subject. Your presentation provided me with some fantastic insights into framing good arguments on why this subject is worthy of serious consideration. I sincerely appreciate your time Monday evening. Thanks again. Ken
Why do you say you're not a good presenter? You are clearly a subject-area master, and you speak very well!
Paul, You should really considering doing a podcast of such a talk. I think people hearing an expert such as yourself dispelling the O/R mapping myths would be a boon to all of us who are trying to convince our organizations that OR mapping is a good thing and not some new toy for OO dreamers.
Despite your protests to the contrary, it was a really great talk. The combination of interesting topic and impassioned speaker made for an interesting evening. Your points on measured performance with O/R mapping were especially interesting. This is the kind of information that potential O/R users are really looking for.
One thing that would greatly help the O/R Mapping cause would be to stop pushing the "write fewer stored procedures" point of view. ORM can be very effective when used in conjunction with stored procedures, and stored procedures are all about attack surface area. In order to expose client_order to my end user with most ORM systems, I must allow the process performing the ORM to have full access to the client_order table. And yes, it really still is most ORM (disappointingly, since I can remember having this same discussion with a manager about three years ago and coming to the same eventual conclusion). What really is needed is CRUD stored procedures that can take an opaque token indicating an authenticated user, so that the database can prevent any user that doesn't have an opaque token from seeing any client_order, and so that the database can limit client_order to only those that a specific token ought to have access to (and write audit logs if there is an attempt outside the security rules). In this way, even if the process containing the ORM is compromised, the database remains resiliant against attacks, and is not, itself compromised. An ORM system that both supports stored procedures and supports the factory pattern is capable of providing this feature. There are a handful of ORM's that do, in fact, provide this level of support. ORM in and of itself is a tool. All tools have their uses. In a secure code base, an ORM that does not support stored procedures is a serious liability. I would like to see more ORM's gain more support for common secure database practices, such as stored procedures (in general) and stored procedures with opaque tokens (in particular). I would also like to see more ORM's focus more on the modelling relationships side of things and less on the "you'll never have to write a line of SQL again" aspect -- I think that you'll have a lot better luck pushing forward that way.
Hi Dave: I strongly agree that O/RMs should support stored procs -- and by the way mine does. :) I don't however think that a stored proc is necessary for security -- its very easy to use an application role and only give it the proper permissions so that other users do not have those abilities. But nonetheless, I do understand the concern, and even if its not there are still times when a stored proc is best, if not required, so I do agree stored procs should be supported. I guess my opinion is that using an O/RM with stored procs in all cases, as opposed to just a few special cases, isn't accomplishing anywhere near as much. Its not as flexible at all, nor is nicely loosely coupled to promote better maintenance and code simplification. And of course its not as portable, although I will grant you that many people don't care about that one -- but the others are a huge deal to me, especially flexibility -- the ability to filter and sort on anything, with paging even. Thanks, Paul Wilson
Only reason I am showing up is for the snacks! :) Greg
Install Fiddler on the machine that has the problem. Confirm that cookies are being sent by the server Check if cookies are being received by the browser (look at the request header) If you don't have access to the machine, create a simple test site that sets and reads a cookie on the same server that the LoginControl page is running on.
I haven't heard of anything like this before. Let me know if you have a repro. One thing you might want to check is whether you are deployed across a web-farm, in which case you need to make sure you have the same machinekey across both machines. That is one reason why the login can be lost (if the browser switches to the other server the cookie will fail if the key isn't the same). Thanks, Scott
Hi, Paul: Some software firewalls (e.g., AdSubtract, Norton, ZoneAlarm, etc.) block cookies, so in addition to ensuring that cookies are enabled in your users' browsers, make sure they are not running third-party software that blocks cookies.
Its not a web-farm, and so far the two affected users that tried my bare-bones test login page were not affected in it. So I would like to say that it must be my code, but I can't really think of any of my code that would cause this either, precisely because I'm using the Login control and don't really have much of any code related to this. And of course it works for me and most other users, so I'm really dumb-founded -- but its probably something I've done somewhere.
Ran into a similar problem a few months back. I am trying to recall the details, but I am not sitting in front of the project right now. However, I think our problem had something to do with Master Pages and the login. So my question is, are you using Master pages in this project? Brian
Hey Brian: Yep, definitely using Master Pages, and my bare-bones test did not. Please let me know when you can recall more details, and if nothing else I'll redo my bare-bones test to include a Master if you can't recall the details. Thanks, Paul
I've had issues when a single pc is used by multiple users. When a user logs off they are taken to the login page with their previous location listed so they can go directly back there when they login. The problem is when another user logs in (same IE session, IE never shut down) it takes that user to the page the last user left off. Worse yet (the site is used to build custom cards) on the preview page it shows the card that the last logged in customer built (I'm not sure why I'm gussing browser cache). I worked around this for now (not to happy with solution) by immediately redirecting all logins to the default home page. I would like it to remember the last logged in user so if a new user logged in it wouldn't redirect them to where the last user left off especially showing them what the last user did. Perhaps even easier just remove the last location from the url when a user signs off - that way people wanting to bookmark a particular page could still use that feature versus me being forced to redirect them to the home page. I suppose I could write code to remember last logins and all but I would prefer that be built in.
I also had the same problem with a website I built for high school students testing. I recieved tons of email saying that they are not able to log in. But I used their credentials and worked fine for me. Not sure what was the main reason but I don't think there should be any problem with the Login control.
I gotten bitten by it recently because I didn't make the difference between the way C# handles it and the way the framework API does it. I'm not sure why the distinction is important, though.
And, incase anyone missed it, LINQ will have a mysql-like LIMIT syntax: http://codebetter.com/blogs/karlseguin/archive/2006/04/17/142964.aspx .NET Team +1 SQL Server -1
Interesting. I thought that this had been resolved along time ago so I am surprised to just now hear about it.
Hey Paul - Nice to learn a little more about what spins your wheels. :-) It's great to hear from tech writers about "here's a non-IT thing that makes me happy".
Paul, It is strange that you feel that way. I think any complete web development framework should have some libraries on the client side. ASP.NET has been lacking this till now. Any kind of Ajax application requires significant amount of JavaScript code. Google Calendar and other Google apps do have lot of JavaScript code. There is no Ajax without JavaScript. I don't think you can call something an Ajax framework without client side libraries and tools. I think Atlas is a step in the right direction. It provides a cross browser compatible layer, which is its great strength in my opinion and ability to access web services from JavaScript. I have not been that crazy about the Data classes and XML-Script in Atlas but you can easily run Atlas in without Script Components. As for live.com, it is slow but remember that Atlas is still in beta (or probably alpha). I am sure that problems will get sorted out by the time it is released.
Hi, for www.live.com I'm agree with you it's horribly to slow. But for Atlas I'm not agree at all. Ajax can just make some request to the server, how do you do to display the response ? you have to use JavaScript and a veritable framework to make what you want is cool :-) ClientSide != Ajax, we can do a lot of thing with JS without use Ajax and we need a framework : Atlas. for Rama, live.com don't exactly use Atlas. This is a part of an old build of Atlas.
I agree. I think that is why I'm such a huge fan of AjaxPro.NET (http://www.ajaxpro.info/) Ajax.NET builds the perfect bridge between your JavaScript and .NET code. It takes care of the HttpRequest and the serialization/deserialization of objects when passing them to your server code. But other then that, it leaves all the UI up to you. It seems like Atlas is going to start baiting people to use the framework to accomplish UI (JavaScript) features.
Live.com does have some performance issues, but that is less about Atlas and more specific to the amount of stuff Live.com is trying to accomplish (being an aggregated client portal that pulls information from lots of places and allows rich user personalization). Atlas provides both a client and server framework for building rich web apps. It does not require you to write client-side code at all if you don't want to (which it sounds like you don't). You should checkout the video I made on http://atlas.asp.net as an example of building a data driven task list app using Ajax updates. Super simple to-do, no javascript authoring required, and a much slicker interface. The power of Atlas is that you can optionally write client-side code if you want (or leverage server-side controls that encapsulate that for you). The server-side control encapsulation is particularly powerful -- since it means that you can get a much richer UI and advanced capabilities in a structured server-side way (which is ideal for a lot of apps -- especially business apps). I'd really recommend checking out the Atlas Control Toolkit download for examples of how this is done: http://weblogs.asp.net/scottgu/archive/2006/05/07/445530.aspx Hope this helps, Scott
Can I ask what provider(s) you'll be covering?
I would have to agree... I think there is alot of 'bloat' that comes with it. It has to be pushed down for every new site that you visit, creating a slow experience. I really like what FF offers with XUL for client side work.
Nobody's making you use it, there are other libraries available.
Did you ever had a look on the traffic when visiting live.com? There are enough internet users that have a slow network connection. See my article at http://weblogs.asp.net/mschwarz/archive/2006/04/04/441827.aspx. Regards, Michael
I've got samples for Membership, Roles, and SiteMap that we'll look at.
In Holland Scott did the keynote of the Dutch Developer Days on Atlas. At the end of the day all that everybody was talking about, was his Atlas demo and the amazing ease of developing rich client applications. And with the release of the new Altas control set this has become even better. Atlas may or may be not a perfect Atlas implementation, I actually really don't care. With Atlas I can increase my productivity because I don't have to worry about javascripts and cross browser compatibility. And the Atlase framework is still expanding with cool new stuff. But most of all, I think the best thing about Atlas is the way it's developement team has interacted with and listened to the community. A lot of people are really happy with this stuff, so why call it "a bigger problem" when you haven't even really tried it yourself?
Martijn,all is fine if don't see it's internals-use that you get out of the box.But if you try to develop custom components,you'll see that it's not such an easy task(if you're not microsoft of course;-)Large part of Atlas is asp.net plumbing-makes asp.net control model looks more ajax'ish,teach old dog new tricks as I can understand.Plus,they provide websevices plumbing(which is nice;-) and client side framework to tie these up together and bring .NET BCL to the browser.I'm very interested in client side of framework not directly related to server side=pure ajax style(think http handlers/modules and client javascript),so I don't need all this burden Atlas provide and from client side point of view I see more "close"(by spirit) client side alternatives-prototype/jquery.com like.If you asp.net developer and don't know much about javascript+discover xmlhttprequest just recently,Atlas is a way to go,no questions.But if you know internals of javascript/xmlhttp mechanism,it seems to me there's more "client side"/javascript oriented frameworks than Atlas exists.To create "pure" ajax framework ms need to rethink/reimplement asp.net framework as whole considerably,and that's not as simply as patching through updatepanel and bringing c#/BCL programming model to browser-browser/javascript is different by nature and has it's own stregth sides anyway. Regards. P.S. Look at http://www.jquery.com/blog/ to get idea about what I mean under "client side";-)
I think PageFlakes.com does what live doesn't, and that's use the atlas library to make the client actually feature rich. I really believe they do it right from a user perspective, and Live.com tries to do it just from a theory standpoint. What I mean by that is an extension of what Paul said, there's more to using Atlas in the right context. Both sites essentially try to do the same thing, one succeeds and one fails, because pageflakes ensures to take it from the user perspective. That said, my homepage is still google.com/ig
The simplest way I can explain what I mean is to simply ask anyone interested to compare what other Ajax for ASP.NET libraries do compared to Atlas. And by that I don't mean to imply that Atlas cannot do something more or different, but I get the impression that Atlas forces you too much down this other path. I do like having some JavaScript libraries already written for me, but if the result is slower than a simple postback, or other Ajax libraries, then what's the point.
I think you should set aside some time to look at Atlas Paul. If you want a network library that allows you to transfer .NET data types between client and server you can just write this: <script src="atlascore.js"/> <script src="mywebservice.asmx/js"/> And then you can invoke methods on the remote web-method really easily (and lightening fast): MyWebService.SomeMethod(arg1, arg2, callbackmethod); function callbackmethod(results) { // do something... } That is all there is to it. Atlas is layered so that you can then use additional libraries on top -- bu there is no need to download them or use them if you don't want to. I'd really recommend setting aside sometime to learn about it. If you want me to send you a simple set of slides + samples to walkthrough feel free to send me email (it will only take you about an hour to walkthrough it before you understand all of the core parts -- it is easy to learn). Hope this helps, Scott
I personally have found Atlas to be extremely easy to use and don't think it takes me down a different path. I've been doing Ajax-like functionality for at least 6 years now and it's never been simpler. I thank the ASP.NET team for removing the cross-browser compatability layer from me. This alone has saved me a tremendous amount of time. I think those who complain about Atlas are missing the spirit of it. I've used AJAX.NET fairly extensively (which I also like), but ATLAS seems more natural to me. As an enterprise application developer, I take comfort in knowing that I'm creating a more responsive application (at least perceived responsiveness) and my users have definitely noticed the improvement in the user interface. We will all just have to whether the abuse of making everything Ajaxified. There's a time and a place for it and most developers are not equipped to make this decision correctly. Find yourselves a good UI person and make him your pal! It's been a long time coming for something like this. I'm glad I didn't have to switch to Ruby on Rails - Thanks Scott and Nikhil!
So, if I'm, like, really early, do I get my pick? :) See you at the code camp!
I took an astronomy class my freshman year in college, and always thought the topic was fascinating (even though it rarely pays the bills). My favorite line from my ASTR 101 prof: "This is the most interesting 'A' that you will ever earn." How correct he was, too.
Paul, I can echo some of your feelings even though I've spent a fair amount of time with ATLAS. Microsoft always has grand plans and instead of gradually rolling out tools that are easy to grasp and integrate, they push out new frameworks that require complete re-architecting. And that's what bugs me about ATLAS. There's lot to ATLAS, though, and to give Microsoft credit they are providing a lot of different options for approaching AJAX development that ultimately put you in control and let you choose what level you want to work at. If you want to go low level and do your coding at the JavaScript level and use ATLAS as a service level interface you can. Or if you want to go full bore, using server side controls that generate client script markup - you can do that too. There are a lot of choices there. Then there are the server controls that allow you to use existing page layout and controls and AJAX enable them which is very heavy on wire traffic but can still be an excellent solution in a number of scenarios. I see two problems here - there's a lot to this, and while it all demos real nice, right now at least if you do real work you hit the limitations of abstraction very quickly and a lot of these dead ends seem to simply have not been thought all the way through. A lot of folks are going to start down that path and code themselves into a dead end because it looks so easy nobody'll bother to research what works and what doesn't. The client side architecture is hideously complex and difficult to wrap your head around too. If you think control building with ASP.NET in general is not exactly trivial, wait til you start building ATLAS enabled controls - lots of fun especially with the current state of documentation. It's a mixed bag, but it's early. And maybe that's part of the problem. As usual many people see ATLAS as the only solution even though it's not even in beta just because it comes from Microsoft. There are other viable choices out there that are easier to work and in full release today...
Thanks Paul. Your presenation was great and helped me clear up a few issues I was having. Thanks for letting us know baout the source code being released too!
Great work Paul! Once again you've raised the bar on simplicity!
Hi, This is my first foray into ASP 2.0 and after following your guide (in Readme.txt) I get the following error: The type or namespace name 'Wilson' could not be found (are you missing a using directive or an assembly reference?) That highlights this line: <add namespace="Wilson.Providers.Framework"/> Do you have any tips on what I'm obviously doing wrong? (I'm using the Visual Web Developer 2005 Express Edition.) Thanks in advance, Jose
Hi Jose: My first thought is to ask you if you have compiled / built the solution? If not, then that would certainly be an error that I would expect. Otherwise, I'm not real sure what limitations the Express Edition may have, so that may or may not be part of the problem. One last thought, I removed most of the binaries (dlls) to make the download smaller, but I could send you a version with the compiled binaries to see if that helps if you send me an email. That might help if there are limitations of the Express Edition, but if that's the case you probably aren't really going to be able to do anything this advanced in the first place. This also isn't exactly something basic to be starting with period. Thanks, Paul Wilson
I tried the test web page in the solution provided in the download and get the following error: An instance of type 'Wilson.ORMapper.Internals.Context' was being created, and a valid license could not be granted for the type 'Wilson.ORMapper.Internals.Context'. Please, contact the manufacturer of the component for more information.
I should have pointed out that the included WilsonORMapper is of course the demo version, which means it only works inside the VS debugger. Just running it without the debugger will rightly result in that exception since that is what keeps you from using the demo version in production. So try it all you want in the debubber, and you can certainly modify and use the source code with something else if you find it useful but don't want to subscriber for $50 to get the ORMapper.
I may be sounding novice in asking this question, but would like to know: Is there any specific coding we need to do in our existing application ( mine is a vb 6.0 appln) so that it runs w/o problems in an citrix enviro? prompt reply will be appreciated. Thanks LS
There's just a few things, although I may not recall the exact list either, so I would still recommend you looking this up officially (I know I've seen such a list online and in books in the past). The things I recall are that you must not assume local file paths -- instead you should use the appropriate APIs to get the user's assigned folder on the network. I think that you were also not allowed to use the registry to store information, or at least you were limited in some very real ways. There could also be some issues with permissions if you assume users have more than the minimal assigned -- so overall you should keep in mind that users are not working in an unrestricted local environment.
Paul, great article. We are in a similar situation. We're running a large enterprise .Net app with datasets loaded into a 3rd party control suite (mostly grids) on an 8 box Citrix server cluster. Where our old VB6/Access app could run 20 concurrent users, the new .Net/SQL Server app has trouble with more than 5 or so. As a stop gap workaround we've used TrimWorkingSet to force deallocation of memory at certain key process points until we can put in more permanent and programmatically sound fixes with our next major release. Dim Procs As Process() = Process.GetProcesses() If Procs.Length > 0 Then For Each Proc As Process In Procs If Proc.Id = pidTarget Then Dim ipMax As New IntPtr(1000000) Dim ipMin As New IntPtr(500000) Proc.MaxWorkingSet = ipMax Proc.MinWorkingSet = ipMin End If Next End If Only issue here is that this has to be run under Admin credentials. I certainly hope your users don't have Admin rights on Citrix so options are a) shell out a new process with proper security context from the primary app or b) run as a timed service on each citrix box. I know this not an optimal solution by far but as a finger in the dike it seems to be working so far.
Amen!
Very well said.
Nie article and amen to a debate that will unfortunately never die.
Apparently many in the Stored Proc only crowd have never coded in the Java community where O/RM is much more prevalent.
Without religious wars, some people will have nothing to talk about. Well said!
I had an assembly, originally written against .NET 1.1 and now running on .NET 2.0, that tried to convert...
I had a similar issue and was stuck with it for more than one month.. I had no clue what was going on, since the IIS and DNS settings were correct.. infact I turned off the antivirus software too.. Anyway I was able to wrap my proj, only after I went thru ur blog.. Thanks a lot for this information. - Senthil Babu
Does anyone have any thoughts on deploying the WinForm app in a Citrix environment? Specifically how to get around locked assemblies? Our current solution is to kick everyone off the server and then copy .dll's. Since this is a 24x7 operation, not very convienient.
Does multiple db login mean that the application on end-user's computer has a direct connection to the database? I am guessing that if the same company has gotten blasted (or I should "blaster" -ed) by virus attacks if they are using MS SQL Server (even other DB platforms are not immune to worms and other attacks).
David: That depends on the implementation. A traditional client/server app would have each client computer having a direct connection to the database, but a web app or other distributed enterprise app would have all the connections coming from a server computer.
The one thing I will say for stored procedures is that they can be used to better define a contract for the data source which isn't always a bad thing. That said there is no reason why the two should be mutually exclusive .. only use a hammer when you have nails :)
I have been using your mapper for 18 months now in both personal and professional projects, without stored procedures (not because I am necessarily anti-sproc, but because it is just easier and I have not needed them generally) and have 'converted' a lot of my peers to using it as well. None of them complain about not being burdened with writing TSQL and ADO.NET code (except where it makes sense) - I am continuing to win people over because, as you point out, their "apps are just as secure and performant as they were before O/RM, but far easier to build/maintain." I just figure those that want to let their fears get the best of them are just going to make it to market that much later than I will, with a product that isn't necessarily any better. I can't believe people don't do the very little research necessary to discover the real truth about things, but would rather remain in the dark; to each his own!
Something we were considering was each user having their own \bin folder on a shared file server (This is a users F:\ drive in our mappings). This would mean each user would be running their own DLL's & we could force updates to the F:\bin folder whenever we wanted. We have an application launcher program that checks versions when starting a process and forces updates where nescessary. Now this does 'work' but I think it introduces a number of problems. In particular, there is a perf hit when assemblies are loaded at run time. If your network has a blip, the app would probably fall over. Also, I have been suffering with the 'External Component has thrown an exception' error which I'm fairly certain will be resolved by deploying locally. I was weighing this up as a control vs performance offset...I would like to be in control of the applications' deployment and any hotfixes I needed to apply...but, I think instead I'm just going to deploy on C and be really careful with application updates. We have to schedule in the updates with the Citrix farm team who then update a single server and roll out the image to the farm. This means updates can only take place out-of-hours & we have to be really careful with our QA stage...! Is something like this not possible in your 24x7 environment? Is there never a point when there are no users using the assemblies?
One of the main reasons for using Citrix is to simplify deployment, so I can't imagine ever creating user specific deployments as you've describe. As for how to manage deployment, my experience is that companies that invest in Citrix also invest in the appropriate people with experience in Citrix deployments, which typically involves some serious planning. I do not have any idea what all the options may be, but I have seen weekly windows for Citrix maintenance, usually at times to affect the fewest people in a global company.
I have trouble logging into your site if I have the 'remember me' chack box enabled in IE. I log in and the page refreshes as it was with no indication of being logged in. It works fine with the 'remember me' checkbox disabled. It works either way with FireFox.....
"There are other viable choices out there that are easier to work and in full release today..." Like...? I find it interesting that people have these reactions. 1. javascript is ugly and painful. Powerful, no doubt, but problematic 2. asp.net 'postbacks' - this constant server side trip which reloads an entire page, regardless if all you need is one section updated... ...that is the key, Atlas gives you a way to do partial rendering. Smooth transitions - ie. you sort a gridview - the entire page reloads! Instead, with the Atlas updatepanel, only the grid reloads. Tell me what is bad about that??? I think it's just a different world - users want a better client side user experience.
This is the first NHibernate (or Hibernate) example that I was able to run successfully. I ran it using VS.NET 2005 using MSDE for the database. The only change I made was to update App.config with the database instance I configured for this example (as opposed to using the default instance). The example is sufficiently rich in features to make it a good basis for further study in understanding the Hibernate configuration and programming details. Thank you very much for taking the time to post this example.
Is it because stored procs can offer an 'interface' to a complex normalized database ?
Frans Bouma is the creator of the very popular LLBLGen Pro O/R mapper for .NET.&nbsp; He just posted...
See Jason Zander's blog: http://blogs.msdn.com/jasonz/ LINQ (and most likely ADO.NET 3.0) will not be part of .NET Framework 3.0, but will be released together with Orcas.
Earlier today, I was working on my article on the timeline for .NET releases over the next 18 months....
My understanding is that only the original WinFX content will be in .Net 3.0; i.e. WCF, WF and WPF. LINQ, ADO.NET vx etc will probably be a part of v3.5 / v4.0 er whatever they decide to name it :)
I don't like the merging of WinFX with .Net 3.0. To me, .Net is a platform-independent framework, akin to Java the Framework, with WinFX being a product-specific (Windows) layer of code built upon that, much like GDI would sit on top of the C++ runtime (and possibly STL), with .Net being a richer runtime. The confusion as each component of what is now the ".Net Framework" is only going to get worse as the increasingly numerous pieces of the puzzle progress at differing rates. But that's marketing people for ya.
I went To Aspx microsoft website found latest Web validation Script in Temp File and replaced original with this , now working fine
Paul, your question alone shows it DOESN'T make sense to name it _3.0_. I agree it does make sense to rename those silly acronyms, but it should have been 2.1
I'd like to see SQL Server adopt the new expression format. ps: Is that a new c# keyword, "afterall?" ...j/k man
www.netfx3.com .... there's no tab for LinQ (at least not yet). Dan
Is there any way to connect to a serial port from a web page using client side scripting. I'm using VS2003.
I believe you'll have to create an ActiveX control (or equivalent .NET control).
Hi Paul! I've joined a project that is still using your master pages and I must say that you did a nice job being about two years before Msoft... I'm just wondering about one thing... Is there a way to access the Master Template class from the front-end aspx-page? I would like to set some properties on this master template class in order to keep the hiearchy of the layers... Is this posible? eg: Public Class MenuTest Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim masterPage As TreoMaster = MasterPageTreo ' Here I would like to set some properties to the masterpage class... End Sub End Class
HOW CAN WE USE NHIBERNATE WITH SQLSERVER 2005....I AM HAVING A DRIVER ERROR...SECONDLY SOME TIMES I GET AN ERROR ABOUT .HBM.XML NOT FOUND....HELP
You shouldn't need to do anything differently for Sql Server 2005, other than change your connection string if that's necessary on your install. As for hbm.xml errors, I would think that you would get more help on the NHibernate forums, from regular NHibernate users, instead of asking me. I'm pleased to offer something to the NHibernate community, but keep in mind that I do have my own ORMapper that occupies my time.
Teh SerialPort class is wrong by design, its documentation is misleading. A serialport class should transparently move 8bit bytes in/out of the PC. Without codepage interpretation, stream interface etc. Have you MSFT guys ever worked in factory floor automation ? A trace and debug utility displaying the status of RS-232 pins is missing. Microsoft: pls just give us TRUE transparent ReadByte() and WriteByte() methods.
".Net is a platform-independent framework, akin to Java the Framework" What did you smoke for lunch? .NET is platform-DEPENDENT... i.e.: Microsoft. Mono and the others are completely independent attempts to mimic the framework so that it runs elsewhere. Lay of the pipe will ya?
How is this achived in .NET20 using "applicationSettings / MySettings" instead of "appSettings"?
Indeed, it is the CLS that is platform neutral not the Framework with is an implementation just as Mono is.
Thanks to Jez for pointing out that since I rebuilt my server over the New Year period, the submit buttons...
You know what? Owning a pool really sucks-). Oh, it’s great to go in but not a lot of fun spending most...
I agree with this statement: <i>Because of that fact, most all web apps, as well as those enterprise apps that have a distributed design, make the decision to have just a single db login that the application uses for all users and db interaction. This approach is used almost universally</i> The place I work at seems to be stuck in the past and doesn't like the idea of a trusted subsystem model. Do you or anyone have any documentation on who out in the world is following this model?
Hi, Paul Thanks for your work, it's very interesting and much more completed than other. I would ask a question. In the example you use always session.CreateQuery so you use the IQuery interface. So you must make the query string (SQL string). In other example I have seen session.CreateCriteria. In the first you must know the DB structure and think in Relational mode (SELECT, JOIN, OUTER JOIN and so on). In the second you think in more OO. It's true? It is better use session.CreateCriteria? I'm novice in NHibernate but I think that I must masquerade the DBMS. A real application with NHibernate don't must have SQL-spagetti (also for security reason aka SQL Ingnition)
I was wondering if anyone had tried running a Webform application on Citrix? We have a case where once the citrix session starts and calls the web form, the focus should be on the text box on the form. However the focus seems to still be on citrix and the user has to click in the textbox (even though the cursor is in the form - when you type, nothing appears) to enter text. Any thought?
First, keep in mind that I'm not an NHibernate expert since I have my own ORMapper -- so I simply used what I did to make it work and don't claim its "best". But having said that, I actually do like to think in Relational mode and don't view that as a problem -- but I agree its nice that an OO viewpoint is also supported. I do the same thing with my ORMapper -- I tend to build Sql strings, since that's my viewpoint, but the ORMapper also supports OPath for OO thinking. For my ORMapper though I do have a QueryHelper that helps me build those Sql strings, so I don't have to hard-code table and filed names, and I can also make sure my Sql strings are "clean" to avoid Sql injection. I don't know if NHibernate has a similar thing to avoid such hard-coding and Sql injection, so while that's not a problem with my ORMapper, it may be more advisable with NHibernate to avoid it.
Thanks, Paul Wilson
I've personally not worried about web apps on Citrix -- I'm also not real sure why you would bother to do so.
We have clients that are running very old slow machines. They are going to connect to our new Citrix servers to kick off some desktop applications as well as our web applications. (Citrix talks to our web servers). With over 100 different client locations and 5-10 machines at each location, this was a less expensive way to upgrade the client's environment
Paul, I tried entering the following as per your article in my app.config file: I get the following error msg: {"The root element must match the name of the section referencing the file, 'appSettings' (C:\Program Files\CTGi\CDREngine\app.config line 2)"} System.Exception Can you please tell me what I'm doing wrong?
Note that the file you're referencing must have its root be appSettings, not configuration, and there can't be a beginning xml element either. That's my guess anyhow.
Paul, Really nice article on MSDN. However due to my lack of exposure in httpContext / identity area I am not able to "plug in" returnUrl in redirectFromLogin method. what code exactly should be written in global.asax, what should go in webLogin.aspx.cs? how can I store a querystring["ReturnUrl"] even before page_load of winLogin.aspx? Could you give a brief idea?
Have you not looked at the code in the download that accompanies the article? If the download isn't working for you then you'll need to contact me directly via email so that I can send you the code. Thanks, Paul Wilson
man, seems in connection string shall change "User=ORMExample" to "Uid=ORMExample"
Very good argument. We are using the O/RMapper at our client within clustred environment in java world and sometimes we feel this layer is somewhat slower than direct connection to database. Even with this approach we are using single db login approach and ACLs.
Gotta agree. I've experienced the same thing. It's just ridiculous software design. At the very least, download the update and notify the user as they close the browser that an update will be installed. Logic.
I got a confirmation dialog after the download completed. I was asked if I wanted to install FF now or later. Perhaps you didn't notice the dialog popping up while you were typing. The "Install now" button was the default button on the dialog. Is it possible that you didn't look on the screen while typing? Perhaps you hit enter during your work in the textbox and confirmed the confirmation dialog by accident.
I confirm Jens Winter's comment. and that "update" window was pretty big, too...
I saw the confirmation dialog also... just after the update was finished it asks if you want to restart firefox now or later.
I suppose its possible some type of dialog window opened up and went away inadventently before I could see it due to my typing, but I also wonder if we're talking about the same thing. I too had a very big "update" window, and I too had a dialog when the "update" was finished asking me if I wanted to restart FireFox then, but the problem that I was referring to was that my browser windows were all closed before the big "update" window, and asking me if I wanted to "restart" FireFox after the "update" really isn't the same thing as asking me before the "update" if its OK to close everything. So maybe there was a dialog before the update that I missed, but I'm still wondering if we're even talking about the same thing since confirmation dialogs are not usually "big" or "update" windows. Anyhow, I've changed my setting to not install automatically in the future, so hopefully I won't have this issue again.
Are you sure you weren't just typing along and hit enter? I got the same warning, but there wasn't anything automatic about the restart.
I can also confirm Jens Winter's, there was a big "update" window. In fact I't popped up a few seconds ago (thats why I'm here now). All my tabs are still open and I can choose between "Restart Firefox Now" (selected) and "Later". Lets see, clicking "Later" (click) ... I get a text saying it will be installed next time I start Firefox, klicking the OK button and I can still type here :)
Anything's possible as I was actively typing when it happened. Its still obviously poorly designed if this is possible though.
Paul, I highly recommend installing one of the session restoring extensions, like SessionSaver or TabMix. It's hard for me to imagine life without them. Not that Firefox should be spontaneously closing anything (it never has for me). But at least with the extension you may be able to recover your state.
This is exactly what happened to me yesterday however after installing the updates a dialog box appeared asking me if I want to restart FireFox...but it didn't appear on the start of installation...
Content on this page is severely out of date. Go to
This is a great SP and just what I was looking for. I know this is a dumb question...I don't understand how to get the recordset pagecount in ASP. I see the pagecount being returned when I execute the SP in a new query...
Have I mentioned how nervous I am? (no joke)
Don't worry there's no reason to be nervous, afterall you just wrote the book on this and couldn't possibly mess anything up or leave anything out. Right? :)
There's really no reason for you to be nervous, Wally - it's a pretty friendly crowd. We even let Paul speak :)
I'm experiencing the problem in FireFox 1.5 and Netscape 8.1 however the solution has no effect. These browsers seem to ignore changes to window.location.href! IE works fine with: window.location = "newPage.html" window.location.href = "newPage.html" location.replace("newPage.html") FireFox and Netscape appear broken! That's the forth problem I've had with them today. Only one problem today with IE.
It's a short-sighted misnomer. It won't be just Mono that's going to suffer; I mean what are they supposed to call .NET 3.5 on Compact Framework? Where's the "3" when WinFX isn't even going to be there? http://www.petitiononline.com/winfx/petition.html
Paul, I just download the code, compile it and push it on an IIS6 server in domain. I followed the differents configuration instructions. And put the redirect401.htm file in the custom erors of winlogin.aspx. From a domain computer, it works fine, i have my domain user. But outside of the domain, the windows authentication dialog shows up. If i hit cancel i am then redirected to the weblogin.aspx. So the question is how to get rid of the windows authentication form ? Any idea ?
.Net 3.0 will use c# 2.0. It will not use c# 3.0 I think they should've named .Net 3.0 something more like .Net 2.5
Its a browser configuration option if you have that issue -- its not something you can get rid of just in code. I believe the details involved changing the security zone for that url to be intranet instead of internet, but I can't recall completely. I never experienced this in my tests, nor did the tester at MS, or we would have mentioned it, but since then its been apparent that lots of people do have this issue. Making a client browser change may make this unworkable for most people, and that's fair enough, as this really was just a hack of last resort and not something I wanted to do.
I have written a small project about LINQ and DLinq. This might an interesting read for some of you guys.
I just found the same problem in FF 1.5. My application uses 'location=...' in bunch of different ways via Event Handlers, functions, etc. I only had a problem with one specific instance within function called by a popup window and my fix was to make the URL an absolute. Ex: location = location.protocol + "//" + location.hostname + "/myfolder/myfile.html" I know this won't solve every problems but at least it might solve some problem. Hate Smucks... Hate people who would rather insult then help.
Setting an object to null in the middle of a method does have its merit - JIT tries to find out when your object is not in use as much as it can but it can't always do a perfectly job.
I use a simple converter for O/R mapping: public static class SqlTypeConverter { public static int? ToNulllableInt32(object o) { SqlInt32 i = (SqlInt32)o; return i.IsNull ? null : (int?)i; } ...or public static int? ToNullable(SqlInt32 i) { return i.IsNull ? null : (int?)i; } ... and so on ... } But, of course, this still doesn't help with the ignorant controls!
One of the advantages to ASP.NET server controls is the ability to package them into an assembly and...
PingBack from http://edwardotis.com/tech/2006/09/08/one-more-cookbook-for-redirecting-http-to-https-in-iis/
Couldn't you simply use host headers in IIS to solve this problem by performing a 301 redirect on the 80 port to the 443 port? Not sure if this will work but you would set up 2 separate sites in iis. One site has only the 80 port configured. This site would do a permanent redirect to the other site which only has the 443 port configured. This way any traffic coming in from port 80 would get permanently redirected to the actual site on the 443 port. This avoids placing scripts in a site.
Sounds like an easy and direct alternative Matt.
This discussion is another one of those holy wars with staunch supporters on both sides of the fence fiercely defending their views until the bitter end. But the reality is that O/R mappers are just a tool like all of the other tools we use in order to get the job done. Each tool has inherent advantages and disadvantages and no single tool has been invented that gets the job done in every situation. As developers we are guilty of having a limited view of the architecture and design of systems. What is perceived as “best” to us would not always be agreed upon by the corporate DBA, Systems Architect, or CIO. How well does the tool (O/R Mapper) work in a corporate environment with DBA’s in total control of the database? How well does the tool work in LARGE applications that have several hundred programmers designing them? How well does it coordinate change or even versioning with that many programmers? How do you guarantee security with the tool? How do you prevent the evil programmer (or DBA) from simply inserting or modifying database data and paying himself a million dollar salary? Performance is secondary and worrying about the actual performance difference between dynamic SQL and stored procedures is a moot point if you can’t prove the application is secure. Removing all direct access to tables and limiting users to accessing stored procedures simplifies things to a point that your manager, DBA, or company owner can understand. Yes, the SetSalary() procedure is only callable by the Human Resource Manager. I know you can set table and column permissions on a granular level but you have just increased the complexity of the system tremendously and reduced buy-in from your security and RDBMS departments. Security Auditing with this tool becomes a non trivial task. Single login versus multiple login is just an authentication issue. There are many ways to authenticate the user. What percentage of corporate intranet applications use Windows authentication where every user is uniquely identified ( or certificates, or card readers, or biometric scanners)? Not everyone is building and using Internet apps with basic authentication on a single login. Does the RDBMS in the application have to run standalone, or does it have multiple applications accessing it? I suspect that the question of whether or not to have stored procedures is really “where do you want your business logic”. And that is a topic worthy of its own discussion. Note that I am not bashing the tool. In environments where the programmer is totally in control (and probably serving all the other roles I mentioned) they can use such a tool without all the political and corporate hoops that many of us have to jump through to have such a privilege.
It's very stupid idea to name WinFx as .NETFW3.0. THen .NETFW3 = .NETFW2 + WinFx1 = mess. How about some updates? Downloads? Will be there different versions for download? Like only .NETFW? And what then will be a .NETFW? Or will be users pushed to download .NETFW + WinFx? It's very smart to download both especially when not using WinFX at all ;) And how about updates? What will happen when there will be an update to WPF? Do we have to then download a new .NETFW3.x version? Or will be there differente updates? It's very bad idea, going against basic versioning and project priciples. Then we could rename .NETFW and every product as MSSQL, Biztalk as Windows and it would be the simplest solution :) .NETFW IS NOT WINFX! It's something different!
The above did not work for me in Firefox But this did: window.open('new.php'); parent.window.self.close() Techback, LLC www.techback.net
I agree on every level. As someone who uses VS.NET 2002 and 2003 *still* I find it difficult to believe this decision has been made because of technical reasons and more to do with marketing reasons - pushing people into a new VS.NET.
for some purposes its neccessary to use win 2003 server as development OS, so for me its not a problem
If Visual Studio 2003 is not supported, then why do the release notes for Service Pack 1 for Visual Studio 2003 (not 2005) say Windows Vista is a supported platform? Shouldn't it be just a matter of installing Visual Studio 2003 SP1?
'We Developers' number an abject minority compared to the target audience for vista - like all software or hardware upgrades people choose to move to it when they feel it offers them benefit, for home users this may be sooner than developers. I don't see where you have a point.
The big technical challenge is with enabling scenarios like advanced debugging. Debuggers are incredibly invasive in a process, and so changes in how an OS handles memory layout can have big impacts on it. Vista did a lot of work in this release to tighten security and lock down process/memory usage - which is what is affecting both the VS debugger, as well as every other debugger out there. Since the VS debugger is particularly rich (multi-language, managed/native interop, COM + Jscript integration, etc) - it will need additional work to fully support all scenarios on Vista. That is also the reason we are releasing a special servicing release after VS 2005 SP1 specific to Vista - to make sure everything (and especially debugging and profiling) work in all scenarios. It is actually several man-months of work (we've had a team working on this for quite awhile). Note that the .NET 1.1 (and ASP.NET 1.1) is fully supported at runtime on Vista. VS 2003 will mostly work on Vista. What we are saying, though, is that there will be some scenarios where VS 2003 doesn't work (or work well) on Vista - hence the reason it isn't a supported scenario. Instead, we recommend using a VPC/VM image for VS 2003 development to ensure 100% compat. Hope this helps - even if the answer isn't entirely what we'd all like it to be, Scott
ברגעים אלה, קראתי את מה שנכתב במספר בלוגים [לינקים שונים] לגבי התמיכה של כלי פיתוח ב Windows Vista. בסופו...
I just don't get why you people continue to slavishly follow microsoft and subject yourselves to this kind of stuff. Vista "will not support developers" because it doesn't have to. You guys can sit around and *** about it all you want but it doesn't matter because you have no alternative.
"We Developers' number an abject minority compared to the target audience for vista - like all software or hardware upgrades people choose to move to it when they feel it offers them benefit, for home users this may be sooner than developers. I don't see where you have a point." Chad, Explain to me how we can be expected to weed out platform dependencies if we can't use the platform we are developing for? How many man hours are going to be lost to the compile-deploy-test-fail-recompile cycle? If the freakin' IDE won't run on Vista, how can we be sure that the code it's spitting out will? Not to mention the headache that game developers will have. Got a working codebase under VS 2003? Better get started migrating it to 2005.
The IDE runs fine (at least 2005 does without any SP1). I think it's a matter of UAC prompts and whatnot which are a side-effect of hardened security. I've made a couple of small C# class libraries and Web Sites using Visual Studio 2005 and had no problems at all. Not being supported does not equal "wont-install". Considering the jumping-through-hoops many 3rd party libraries and tools give you i don't think developers will be having many problems with running 2005 on Vista, with or without SP1. Also, it was sort of given that a lot of things would break or bend with all the added security and changes MS has done to Vista.
I think you guys are overreacting a bit. Microsoft's not out to intentionally screw you guys. Seriously, that's pretty irrational.
Stephan: Its mostly VS 2003 that's the problem.
Interscape: No one said MS was trying to screw us -- its more a case of MS screwing themselves.
I don't know if ScottGu will come back, but I'm afraid that I have a problem with this answer. I do mobile development. Virtual PC does not virtualise USB devices, and so ActiveSync running in a guest OS cannot synchronize with my devices. I need to be able to connect ActiveSync with a device and debug a .NET Compact Framework 1.0 application using Visual Studio .NET 2003. Yes, you can work on Compact Framework 1.0 applications in VS 2005, but it isn't possible to do this with no incompatible changes - editing a form causes its .resx files to be converted to a different format, which then won't load in 2003. VS 2003 is meant to be in mainstream support up until October 2008 according to the lifecycle policy. That means we expect you to make your best efforts to keep it compatible. That's what mainstream support should mean.
>or we developers need to tell everyone to ignore Vista since its clearly not ready. I sympathies with much of what you said however I cannot agree at all with your closing statement. The vast majority of users simply don't care one bit about our development hassles with Visual Studio on Vista. Developers are an amazingly small percentage of the user base. So why should we feel we have the right to tell end users to ignore Vista because of OUR troubles? End users care about programs not developers. If they find they have a compelling need for Vista then they should use it. If we feel there is a compelling need to not support it with our software then we should do it.
Windows Vista will be released later this year to partners and volume license customers and in the beginning of 2007 to the masses. A successful release of a software product such as Windows Vista req...
Vista and Visual Studio 2003 incompatibility: the reasons
I think this is absolute madness... Surely Microsoft can't be this dumb?
>...Virtual PC does not virtualise USB devices... VMWare does, up to a point; it has trouble with high-bandwidth devices like webcams, but it might be enough for remote debugging of devices.
The announcement of the beta of SP1 for Vista on somasegar's blog here seems to have caused some consternation since they're saying they need a new service pack for Vista and VS2003 won't be supported.The truth is a bit more mixed than that as Scott Guth
This is totally inaccurate. First of all, VS2005 already runs on Vista, secondly, Somasegar said, (at http://blogs.msdn.com/somasegar/archive/2006/09/26/772250.aspx), " Visual Studio 2005 SP1 will run on Vista but will likely have a few compatibility issues. " Stop spreading FUD.
If VS 2005 does not run in the operating system. Its a waste for me. Since I am working on the studio Most of the time
Richard: You need to learn how to read, since the main issue here by far is VS 2003, not VS 2005.
As part ofa recent Visual Studio 2005 SP1 announcement,the Corp VP of Microsoft's Developer Divisionstated
PaulWilson: So, that's why the title says, "Vista will NOT support Developers", eh? Come on.
Richard: if it doesn't affect your work, good for you. It does affect our work and a lot of other's work. VS.NET 2005 + sp1 also has problems on vista, but perhaps not that big, although I do expect to have UAC pop up when I debug. I want an OS which supports the software that I need. If the OS is incapable of running the software I need, the OS is useless and meaningless, because the SOLE purpose of the OS is running applications and providing a layer for my software and me to work with the hardware. If it fails to do that, the OS can take a hike. You also might not realize this, but Developers are very important. If developers lag behind on accepting an OS, less software specifically written for that OS is released, delaying the OS' large acceptance.
Dan: unfortunately VMWare Workstation is not free. Also, I don't know if you've tried to actually work in a VM. My experience is that it's painful - it's hard to get data in and out of the VM. Copy and paste doesn't 'just work'. You have to share specific folders you want to use in the VM explicitly, or use network protocols to access data stored on the same machine (also have to share the folders). The rational choice for us is to stick with Windows XP and remote debug into a Vista VM, and put up with not having Glass. Scott's comment suggests, though, that even remote debugging with VS2003 may not work very well.
Frans: The point of my complaint is that there are all these bloggers posting titles like "No Visual Studio support in Vista" and "Vista will NOT support developers" etc..., they don't say, "VS2002-2003 won't run on Vista" or "Vista won't have full VS compatibility at release!" or much more accurate, and less-eye-grabbing attention. So, I have to go into work and explain to my bosses that the headlines they read are wrong, and they shouldn't panic. That's my issue.
Richard: Yes, the titles are intentionally eye-grabbing, but the details are 100% correct. Why do the titles need to be eye-grabbing? I can think of two reasons right away.
One is because too many other Microsoft followers, like yourself, only like to report the positive spin. You may want to say VS 2005 SP1 is in Beta and Vista is gonna be great, but that's a very serious half-truth, unlike the full truth that is in the details I've posted. So unfortunately it takes some of us posting eye-grabbing titles with the full truth to get heard over the many misleading posts that don't report the full truth and only say MS is great.
The other reason for eye-grabbing titles is because you have to get attention focused on the negative aspects if we are to get Microsoft to change their mind. They know they are not doing what is expected and hoped for, and yes they do have reasons for that which I can and do understand, but they hope to spin it in such a way that we won't care. And if they don't get the proper feedback in time then we will be stuck with these poor decisions for some time.
This is very much just like the debacle with the change in the web project system in 2005. Microsoft wanted very much to make things easier for non-enterprise developers that were having a hard time, and that was a good thing to want to do on their part. But they ignored the enterprise developers in the process and only after the fact worried about the former style of web projects. Why were we ignored? Because there weren't enough that spoke up about the issues, and therefore few realized the impact until it was too late. I personally saw a lot of experts say nothing about the changes because they bought into the positive spin.
Like it or not, you get change by speaking up and getting attention so that even more speak up -- that is the way the system works. I like Microsoft's work for the most part, and I like the individuals on the ASP.NET team, most of which I have personally met several times in my trips to Microsoft. But I would be doing a grave dis-service to myself and other enterprise developers that need proper support if I either remain silent or join your happy chorus. No, I want Microsoft to reconsider their choice -- yes it will take work, and may delay things, or at least force a later SP to address the issue, but it is necessary if they expect Vista to be accepted in enterprises.
Hey man, go easy on em, and besides its just too easy to fire up a VPC with the old bits... The notion of extreme backward compatibility in Microsoft's Operating Systems has produced all of these security nightmares... having to support flawed interfaces for 10 years just doesn't make sense in the era of virtualization and emulation.
(dead conversation, i know) i got the same feeling too, though i still can't articulate it well enough. what do you think of anthem.net? so far that's the implementation that's matched my intuition best...
You know what? Owning a pool really sucks-). Oh, it’s great to go in but not a lot of fun spending
Paul, I think your attitude is commendible :-) It's a shame you don't have the time to work in the community any more as you have in the past come up with some of the most impressive ASP.NET samples out there. Cheers, Phil.
Paul - MVP is certainly a nice title, and a great way for Microsoft to recognize community contributors. I've enjoyed watching you obtain MVP status, and I believe that it was an award that was earned. It's also nice to see a 'fresh' perspective rotate through the list of MVPs, so it isn't a bad thing when someone isn't renewed. In the Atlanta Community, we all know that Paul Wilson is a 'go-to' guy, and we look forward to hearing you more in our C# user group meetings.
Paul. Thanks for your years of commitment. I know you didn't do it for the recognition, which is one of the great things about the MVP program (when done right). MVPs are rewarded for the selfless work they do rather than as a means for career advancement. This was truly the case for you. As a newly awarded member, I hope to carry your legacy on to the future (Even if I didn't get it in LINQ... yet ;-)
I'm using VS2005 on Vista RC1 (5600) pretty extensively... class libraries, Windows Forms, WPF apps and have not run into any problems that I am aware of, outside of an occasional failure to repaint the IDE. Am I missing something?
Another key question is whether new machines with Vista include an implicit license to Windows XP in order to run it in a VPC? Otherwise we have to purchase a license to XP in order to apply this workaround, no? http://haacked.com/archive/2006/10/02/Does_Vista_Come_With_An_Implicit_License_To_WinXP.aspx
There does still seem to be some confusion regarding the basic facts here. Visual Studio 2005 will definitely be supported on Vista. The C# team is testing it extensively, and a service pack is already in beta. I've installed it on Vista, and tested it, and it runs quite smoothly. There are still issues to resolve, but they are relatively minor. - Charlie
You know, there has been a lot of controversy lately (from developers I respect who should know better)
Paul - you'll always be an MVP to us!
Good luck and congrats, Paul! Let's hope they give you some time to work on your O/R mapper, too. :)
Congratulations, Paul!
Well done Paul - good luck. I hope one of the first things you'll do is give their Microsoft.com (back in 2000) look-a-like website a massive makeover or at least tell them to do so!! See the comparison: http://web.archive.org/web/20000301053545/http://microsoft.com/ Pahhhleazzzzzze! ;)
Wim: I honestly don't see either the problem with their current site, nor do I see many similarities to the historical one you pointed too. Of course I'm not much of a UI guy myself, as I've been told many times my own sites suck, so admittedly you may be correct. :)
Cool, and congrats, Paul. Hope that this is a great gig for you...
Wim: "Mimsware has been consumed on new projects and growth that bring revenue and haven’t had time to re-brand/update the existing site look-n-feel. It hasn’t become a need or priority based on our load. It is on the radar, but we just haven’t gotten to it."
Hmm. I've been using VC 2005 on Vista for a good while now and I haven't noticed any problems. Luckily, I saw this blog. If you hadn't told me it didn't work, I never would have known!
I have been working solidly all weekend on VS2005 (SP1 Beta)/Vista RC2. It runs *so* much quicker than XP I have returned to work where I have a higher spec PC and it feels 'broken' just because it is running XP! Some of the new features in Vista are compelling *especially* for developers. Try it - you'll see.
Sounds better than wading thru 2 feet of water in the rainforest. Good luck Bryant
Recently there were some news about Microsoft MVP program. Some known names such as James Cansdale ,
A couple of days ago, the community learned that Jamie Cansdale, creator of Testdriven.NET wasn't re-nominated
One of the most popular features in ASP.NET 2.0 was the introduction of the "provider model" for the
After walking through several options I checked into Matt Savacool's alternative. Now I am very far from a IIS guy, but it seems to work for me. I created a second site that intercepts all unassigned port 80 calls and accepts the url https://domain.com as the redirect. The only problem I had was that it seemed that IIS required me to have a non-SSL port for primary site - so I just picked a random port and went with that. Everytime I tried to remove it it would gray out the okay.
PingBack from http://JeremyCoenen.com/blog/index.php/archive/fox-valley-net-users-group/
As noted before I was NOT renewed as an MVP this year, so I was surprised to get a letter today that
To some extent, I think that the issue revolves around a couple of different points: (1) How comfortable are you with HTML and Javascript? (2) Do you trust Microsoft to do the right thing for cross-browser use and to not write bloated code? Admittedly, Visual studio 2 is a LOT better than 1.1 My answers to this are (1) Very and (2) NOT! In general, I feel the same way about Visual Studio and the Web controls. Do I NEED someone or something else to write HTML and Javascript for me? The answer is, again, NO. But I date back to before Netscape 1, write Javascript and HTML in my sleep and do not trust Microsoft not to try to trap developers into doing things in a way that precludes using other browsers or tools. Don't get me wrong, I like and use Visual Studio 2 and data grids and lists can be really time saving. However, once you try to do something unusual with these timesavers, you may find that it is (a) difficult and (b) result in a really slow process. I have heard that Atlas integrates really well into Visual Studio and makes Ajax development very easy. If you love web controls, don't like to write Javascript, or even HTML, then Atlas is likely for you. If you like more control, then maybe one of the other libraries is better. Personally, I have been using AjaxPro.NET and do not see an overriding reason to change. These are 'comfort zone' decisions, though, so if you love Atlas, do not be surprised that others may not.
Paul, as your current client/employer, thanks so much for busting it hard and working very diligently after you gave notice. Many times people check out work ethic wise after they've given notice. You are definitely an exception to that and it is very appreciated. - Kevin
It is funny how much Matt and I think a like. I recently read, in many places across the web, that...
Hi, I tried out LogiXML - I couldn't get a single report to work due to errors. Got a one liner help from their support, which was useless! Crystal Reports - their documentation is non-existent. Their Business model revolves around selling licenses and then getting things working through people trained by them alone! Don't fall into that trap. Active Reports - I've just been experimenting with. Again the bundle looks best of all the three. But then you have got to be careful of the pit falls - the product seems to be maturing .. and documentation is quite buggy and difficult to piece together. But of the three - I would prefer playing with Active Reports!!
Paul, Just to note, even Mr. ASPNET himself (ScottGu) in his recent blog also considers you as valuable as ever in ASPNET community. Thanks for the great works. http://weblogs.asp.net/scottgu/archive/2006/10/13/Tip_2F00_Trick_3A00_-Source_2F00_Documentation-for-Simple-ASP.NET-2.0-SQL-Providers-Published.aspx#662835
I'm not getting Crystal as a productive report tool. I have other users creating excel reports that are developed in short period of time and out perform any Crystal report I've seen. My issue is having to tightly couple report parameters in the report. It would be nice to create a template report and have different version based on different user parameters. The lack of native support of DB2 database is a huge issue in my office.
This didn't seem to work. I dug further and found this: http://www.codingforums.com/showthread.php?t=56428
Vista MUST support VS2003.
>Dan: unfortunately VMWare Workstation is not free.
But it's worth every cent (unlike Vista, it seems).
A few people have already mentioned .NET 1.1 SP1 (in addition to .NET 1.0 SP3) being available as of
MySpace = Geocities 2.0.
Ironically enough they "MySpace.com" are looking for a Snr. Developer right now. I got an email from one of their recruiters a week ago, they are in Beverly Hills. Too bad that is a two hour commute or I would persue it...
Yeah, it sucks that they are the "de facto" due to sheer number of users. Sites like Orkut (or even Friendster) are so much easier on the eyes.
This is true. In order to really customize a myspace You have to hide things and then use divs to overlay all the original myspace content. It's actually really easy-once you go to the many many sites that give tutorials on how to do this. One is http://joyboner.com/ but there are a lot more.skem9,bbz.com myspaceprodesigns.com, jchysteria.com and loads more. If you look at my myspace you'll see that it doesn't look anything like a regular myspace. And it was all done with css. Maybe myspace should've done it differently before they launched.There are a few new things you can do but yeah for the most part it takes a long time to go to all those tutorials and learn how to use your own css to make a better looking page.
Wish I knew the answer. I have a product that includes Crystal for .NET, but it is hobbled by CR deployment restrictions. Also developing CR reports is all about knowing workarounds, very non-intuitive. ActiveReports apparently has xcopy deployment (which would be ideal for a product designed to be deployed outside of corporate intranets), uses pure C# coding (again ideal), and seems to get better subjective ratings too from users. Going to give it a try I think.
I have been searching for an example of NHibernate and was glad to find this. I'm kind of a newbie, so sorry but how do you get the database data? Thanks.
Paul Wilson, creator of the popular Wilson OR-Mapper, presented on the Provider Model and custom providers....
I just had both Firefox and Thunderbird (Firefox on three different PCs no less) automatically install the 1.5.8 update DESPITE my having turned automatic updates off. And now of course Tbird refuses to update properly so I can't access my mail. This is actually the second time something like this has happened; and honestly, if it happens again I don't care how great Tbird and Firefox are ... I'm dumping them for something that is better designed!
I use Crystal since vb3 and found at greatly powerfull and without bugs. The only concern now is that they are competing against MS and MS obviously is gonna kill them. Will they outlive version 11?
I am a novice to Active Reports and could not creat cross-tab. Is it their limitation, or my stupidity?
Hello,
Thanks for your article and code. However, I have been unable to get your technique of storing user tokens in cookies and then recreating windowsidentities from them on later requests to work. Is this technique platform specific? (IIS X, WindowsXX) I'm beginning to think it's not possible to store the token alone in order to recreate the WindowsIdentity. The symptoms are rather interesting. I pull the token out on the loading of winlogin.aspx, and store the token in the forms auth cookie. I also go ahead and store the token in a Session variable and also create the WindowsPrincipal object from the token and store it in Session scope. Recasting the WindowsIdentity from the Session scope works perfectly. However, recreating the WindowsIdentity from the token (whether its in Session or FormsAuth cookie) is problematic. The first request seems to always return the WindowsIdentity related to the IUSR_XXX account. Then on subsequent requests (perhaps reauths) it will return the ASPNET account. Then, it will invariably return a "Invalid token for impersonation - it cannot be duplicated. " error when trying to create the WindowsIdentity from the stored token. Debugging the tokens they appear to simply be four digit integers... any idea what their lifespan is? I can't imagine it could be relied on to remain static for the lifespan of the forms auth cookie... I also used your stock code along with your above code and experienced the same issues. Have you successfully used this technique in production? Thanks.
Hi Ryan:
The technique presented in the article does NOT recreate Windows identities, so I believe there is a misunderstanding of intent. Instead, the goal of the article is to show how you can grab the Windows name of the user, if it exists and the browser is setup properly, while still presenting the typical login form otherwise. In all cases though, the result is ASP.NET Forms security since in the end the ASP.NET infrastructure forces you into one and only one model. If you actually need Windows identities then you will not be able to combine it with ASP.NET Forms in the same "app" -- you can however create two different "apps" with the same code base with one configured as ASP.NET Forms and one with Windows identities.
Hi Paul. I understand your intent in your original article. And it works well which I applaud you for. However, your followup code in this blog post certainly does try to recreate Windows identities for users that previously authenticated via Windows authentication does it not? It is with this followup work that I am having difficulty implementing. You basically store the user's token in a cookie and then use that token to recreate a WindowsPrincipal object in order to populate the Context.Current.User object on subsequent requests. Wasn't the intention there to recreate that user's WindowsIdentity for role checks and try to get the best of both worlds of authentication? I understand it was just a quick example which was probably not thoroughly tested and not included in your original article, which is why I was wondering if you ever used this followup technique in a production environment or ran into the issues I 'm encountering. I apologize if I still misunderstand your intention here. Thanks again.
Ah, my apologies as I totally forgot this post was not about my article in any real sense. So to answer your question, I certainly did not ever use this sample code beyond what was most likely a minimal test, so there may very well be issues that I did not ever notice.
Also, as I've said many times in emails, and I'm pretty sure a couple of places publicly over time too, I was never really happy with any of this. I was forced to find a combined solution by a manager that refused to listen to my protests. Those reasons included that these types of hacks are very brittle -- they require odd IIS settings and even specific browser settings. The alternatives of just accepting either everyone login, or two separate "apps" with the same codebase that are configured differently, are more than adequate in my opinion. So why did I write an article that I didn't really like? Because in the process of doing what I was made to do, I discovered that many others were in similar situations, so I thought it would make a good article. Anyhow, while I did quite a bit of work and testing to get the main concept in the article, I've never spent any time on this since then -- other than responding to emails which tend to either be "this works great" or "this doesn't work". :)
Good luck, Paul Wilson
PingBack from http://rtipton.wordpress.com/2006/11/22/web-links-11232006/
I found that this did not work when performing a descending sort on the second page of a multipage recordset. However adding an additional parameter for sort order and only calling it on the outermost sql statement fixed the issue.
I look at webhost4life.com, for one thing i hold back is it provide unlimited bandwidth. I been advise to be aware of those who supply unlimited bandwidth.
I found another cheaper web hosting providers http://www.webhostforasp.net. They starting at $4.50 with 2gb space and no setup fee. As compare to webhost4life, 1gb space and $19.95 setup fee. However, have anyone here heard or try with webhostforasp.net before? Sound new to me.
For m6.net, it only cost 4.00/months but same like webhost4life, it offer 250gb bandwidth which sound a bit too good to be true for me.
Any others good suggestion?
Paul -- I've got a precompiled version of the adapters that you can drop into web projects easily. Check it out at http://demarzo.net/archive/2006/11/24/1055.aspx
I've heard people making such blanket statements before, but it just doesn't really make sense to rule something out without looking into it. I know several people that run some pretty large sites on webhost4life, and they've never been charged extra or pushed off. In reality, if you are really going to be pushing that much bandwidth (unlikely 99.9% of the time), then you'll run into problems that have nothing to do with bandwidth. For instance, you'll probably need multiple dedicated servers just to keep up with the number of requests that will be causing that bandwidth. In other words, incredibly large amounts of bandwidth is really a symptom and not a problem, and charging more for bandwidth isn't going to solve the real problem at all -- it will just line the pockets of a shared host.
So if you can accept that you shouldn't rule out a shared host that offers unlimited bandwidth without checking other things, then what does matter? Certainly we all want low costs for non-critical sites, which is what shared hosting is about, but is there really a big difference between $5 and $10 a month when there are other things to consider. For me the two biggest things, once you get to that price level, are support and features.
Support for me includes uptime and the tools to do things yourself, as well as their responsiveness when its necessary -- and I've personally found webhost4life more reliable than other far more expensive hosts. I don't want to imply they're perfect, as they are not, but neither is no one else, and you can't expect that unless you're paying hundreds or more every month. My point is that I recommend webhost4life because all of my sites run on them, and do so very well or I wouldn't recommend them -- you can see them for yourself.
As for features, I want ASP.NET, multiple domains and sub-domains, lots of space, MS Sql Server, and more. I also expect very good email including catch-alls, multiple accounts, aliases, forwards, spam filtering, and more. I'm sure there's more I've left off, but you get the idea -- I don't need everything, but I do need a heck of a lot, and webhost4life has more than I need. By the way, I used to host with M6.net back about 5 years ago and they were also good -- but they didn't get ASP.NET up quick enough for me so I left. On the other hand, I was hosting with ASP.NET v1.1 and v2.0 on webhost4life very quickly when they were available publicly, if not the first day.
One last disclaimer, if you sign up with webhost4life using "wilson" as your referral than I do get a small commission. I would not however keep my own sites somewhere that did not work very well for me and give me what I expect. In other words, the small commissions are a nice extra, and you can get them too, but I would give them up and move somewhere else if webhost4life wasn't working great for me. As for the host you're thinking about, they may be equally great, but do you know anyone that is using it that can attest to that?
I think Microsoft's statement is a lie when they say that "it is easy". If it was so easy why would it take them (with all their resources) so (and i mean SO) long to come up with the final version of the adapters?
If you look at the code of some of the existing controls inside BCL you will see that there is a lot of logic in methods that are normally replaced by the ones provided by adapters. Now since adapters are only adapters and no new classes, I suppose that we have the very same logic duplicated in them!
Other than that, It is Microsoft's problem and not ours and I'm happy about the CSS adapters :-)
In my company, we are currently developing dnn site. We developed new modules, custom database and other. By my opionion dnn is for low quality websites and nothing else. Why? Module parsing - model: too complex and really slow. Users: nothing special, module customisation - totaly wrong, too complex and totaly anti-design standards. Personally i examined code, lots of wierd behaivours, (i follow framwork model, and after i had added another portal everything started to behave really slow). Another minus is community which is crowd who are just selling their modules and don't offer any help. I sure i will never use this platform again.
ONLY situation in which i would recommend it is for really simle websites - u got modules for mail, document repository, u can add links and text. Everything else is pointless. Role security is very exensible, but complex and in many cases unnecessary. My suggestion - why to use this CMS when u can buy mucm better and simplier CMS (remember - for all aditional good looking stuff u need to buy commercial modules) and if u need real extensible cms then u should find some other (i was thinking this is good base, and now i am working this project 1 month plus, and i can tell u it would take much more less to progam it from scratch, in normal .net).
Couldn't I just use the option in IIS for Custom Errors that for error 403,4 to redirect to the https site??? For example just add in the redirect box something like https://www.mysite.com/ and that way it would automatically redirect to the correct ssl site?
Thanks.
good note. I was looking for a book like that
If i use this code, In submitting record i am getting the following error:
"The state information is invalid for this page and might be corrupted."
I have just copied and pasted the above code in my code behind page. Is that any changes i have to make. I am using ASP.NET 2.0.
Worked for me, now it works both in IE and FireFox, thanks a lot!
I create packages for over 16,000 workstations and though I've used different products, WISE, makes it so much easier. If you need any specifc custome actions, you can either use the quirky WiseScript languange or VBscipt/Javascript, or call your own custom dll.s
Here's how I get around the <null> value in a datareader:
if (myDataReader.GetValue(5).ToString().Length > 0)
{
do stuff
}
ive only used to to test the selected value of a dropdown list when I was populating it from the database and getting the value that had been selected by the user a previous time.
worked like a champ.
the reason I used that if statement was because when I tried to write that value to the page, nothing happened. So, since testing != null or != "" didnt work, I went with length
Check against the DBNull object, not null.
ok... sound good to me as well... i will rejudge webhost4life because of your testimonial. thanks anyway.
So what if MYSpace runs on Asp.Net
One other nice-to-know: They're actually developing with Visual Studio Team System on top of Team Foundation Server. Not a big deal, but when you consider their all-up continuous integration solution, it definitely speaks to the power and capability of the VSTS/TFS combo.
MySpace runs on BlueDragon.
BlueDragon is a ColdFusion Server for .NET.
What makes you say the *.cfm templates "are now mapped to ASP.NET"?
They certainly use do use BlueDragon also in some parts, but those are getting fewer. Here's the non-NDA "proof" for those that don't believe it: http://weblogs.asp.net/scottgu/archive/2006/03/25/441074.aspx. As for "so what", well there are a lot of poorly informed people that think IIS and ASP.NET and MS SQL due not scale, and this is another real-life example that they do.
Dang...and I just switched to PHP/MySQL. lol
Seriously, who cares....well, I do a little.
It is nice to know that IIS can scale to the ginormous bandwidth crapspace needs.
cbmeeks
http://www.codershangout.com
MySpace runs like crap.
oops, hit enter. What I meant to say is - MySpace is often slow to respond and I get lots of "sorry, we couldn't process your requests." One hopes it isn't b/c of ASP.NET and IIS.
I heard this news a long time ago that MySpace was switching to ASP.NET and thought "cool" b/c that is what I develop with but then I started noticing a gradual degredation in performance since the news and I couldn't help but have bad thoughts...
Certainly MySpace isn't perfect (I've already said in a previous post that I don't like their site), but follow the link on ScottGu's blog to get more background. For instance, while they may be too slow at times for sure, I believe its safe to say based on ScottGu's blog (and from what I saw myself) that they are running far "better" on IIS and ASP.NET than their previous platform. On the other hand, it could still be far better, but they are also still very limited in that they are kind of stuck with an existing site for the most part and therefore cannot start from scratch and take advantage of a lot of ASP.NET features. So in summary, I'm not trying to say MySpace is a great example of a well-architected site, but I am saying that given what they are stuck with they are doing "better" with IIS and ASP.NET and make a solid case that they do scale.
MySpace has also been growing like mad, so they are dealing with a platform change, and trying to scale out.
www.imatch.com just migrated from coldfusion to asp.net, and picked up some perf gains. my feeling is that the perf gains were more to do with better cleaner code, than the platform.
It's also used iBATIS http://ibatis.apache.org/, see http://www.infoq.com/news/2006/11/iBATIS-MySpace
Here you can find a very good example on how to use log4net very fast:
http://www.dotnetspace.com/articles/general-articles/using-log4net---very-quick-start.html
Paul, I was a VP in a company owned by the same parent as MySpace and I know a few people working over there. Trust me its not all what it looks like on the outside. At the same time I have to give them credit for continually keeping that crappy code base they started with from completely breaking. Its an indirect credit to MS Tools I believe. They succeeded in spite of themselves.
Good explanation from http://www.codingforums.com/showthread.php?t=56428
add return false; in FF otherwise a submit is performed (which does not happens in IE)
The duplicate install is likely caused by the following: first you installed vs.net 2005 professional, and later on when you received the msdn team system edition like all the other dev mvp's, you installed/upgraded the install with teamsystem, and from then on, you get two times the install.
I have this as well, with hotfixes and this service pack also tried to do this. So I decided to postpone it a little and first re-install vs.net, now just teamsystem, not the professional edition first. :)
No SP1 for VStudio 2005 professional?
Kevin:
Professional is included in that, but here's the link that says that and has other links for Express:
http://msdn.microsoft.com/vstudio/support/vs2005sp1
Frans:
Interesting theory, but no dice here since this is a machine I've built from the ground up after having team system, so it did not start with Pro (unlike my older machine). Maybe its because I added Data Dude?
Paul,
Thanks, You are correct. I see they even added a footnote next to it stating that.
Kevin
Paul: hmm, ok :)
Kevin: use the same servicepack. :)
It's always interesting to hear what technologies high profile sites use. But, all the proof I need that ASP.NET can scale is that the Microsoft, MSDN and Dell websites use ASP.NET.
Thanks! It fixed the exact same problem we were having.
Although it's true that the lack of integration is annoying, the fact that I CAN now create a null-value base type is a tremendous relief. I don't mind using obscure conversion syntax at the border of the data-retrieval-layer if I don't have to pollute the rest of my code with all those ugly SqlTypes.
Le roi est nul! Vive le roi!
What is your opinion about EntitySpaces. Is their Dynamic SQL implementation good?
I have used CSLA successfully on several projects. Like anything else there was quite a learning curve and getting by in from other developers was also an issue. We relied heavily on mass code generation (CodeSmith) and unit testing. (VSTS) Without a good unit test harness I think you will not be successful with any OR/relation mapping tools.
Sorry, but I'm not familiar with an EntitySpaces product. I searched and found what I guess you are referring to, and it appears to be by the same person behind MyGeneration. But I'm not familiar with it, so I can't comment on it.
People at our company have started installing SP1 and from what Ive heard its about a 2 hour experience from start to finish. Good times!
Would it really destroy the site if one day everybody's content was output with all the styling gone apart from some basic stuff like the background image?
Hey Ian:
Yes, it probably would destroy quite a few "spaces" out there. Why? Have you created a "space" and tried to personalize it? Have you then looked around at all the sites that offer "tools" to help you personalize it? Have you looked at some of the "spaces" that are very different then the standard "space"? If not, then it probably is hard to imagine the degree of personalization that is being done by many, but it goes far beyond just "style" at times. My "space" is just styled better, and that's probably true for the majority, and so ours wouldn't "break", although they would look ugly and you don't want to tick off millions of users when there are alternatives. But I've seen a fair number of "spaces" that have their content managed by their "style" tags, and even if its just a minority its probably still a pretty hefty number given their base size -- and these would be very much "broke". I suppose the best answer would be to have two modes that the user themselves could choose, like a "classic" mode and a "personalize" mode. But for that to work they would have to make sure that users that choose "personalize" have a significant number of good options, and that they no longer allow the open-ended style options they currently have, else they'll either find no one will care, or they'll be right back in the same bind if they aren't careful. Maybe you also limit the time that "classic" mode is available to force users to move away from that, but they have to be prepared for at least some people to be very vocal about being forced if they go that route.
I was born in Mobile as well (1957) and played chess on the Shaw High team. I also graduated from the University of Alabama!
Local boys, huh? I lived in Mobile, off and on, from age 16 to age 45, then seeking a better life, I moved to Fairhope. BTW, graduated from Vigor in '69.
20 minutes for me. I ran it from the command line with /quiet. I'm even on a mediocre PC (with notoriously bad performance with heavy paging).
I think the key is to run with /quiet.
Hi Paul,
Sure I appreciate that many spaces would be ruined if a new system was rolled out but what I mean by 'destroy the site' is would it tick off enough users that myspace would lose its leading position in online social networking?
They could say, 'Jan 1st 2008' we're going to switch. Who knows? Maybe users in general would think it was cool.
Another thought, perhaps the way Myspace is is a reason for it popularity? A lack of easy personalization means standardization between profiles which keeps people's minds on who it is that they're viewing instead of being distracted by eye candy.
Personalization is individual centric. But an online profile is supposed to be used by many others. So maybe moving columns around etc. is simply not appropriate here.
Ian.
Dave Mims has taken Wim's comment to heart and made updating Mimsware's website a priority -- so take a look now.
Much nicer website now than before...
PingBack from http://www.sashasydoruk.com/?p=54
Erm... you can have mono on the Mac now, which more functionality than the wpf/e framework. Or am I missing something?
That's a good question. And I think the answer is that it depends on what you're doing. Mono is likely to support a larger subset than this new mini-CLR, but then again this new mini-CLR might be more up-to-date than Mono. So if you're going to run something on the Mac you'll need to decide what the relevant subset is that you need, and how best to accomplish that. Then there's the issue of size and ubiquity since Mono is very large, as is the full .NET, while the new mini-CLR is going to be very small. And over time we'll probably find that the new mini-CLR will hopefully become very ubiquitous so that we won't have to worry about even a small download, while that's not likely to be the case with Mono. Finally, the other aspect, like it or not, is something that you already know very well, and that is that the vast majority of MS devs only care about the official MS stack, and Mono ends up never even being considered.
wow, is this the news of the year for me....
Microsoft at the moment have several different branches of their CLI implementation, the .NET Framework as we know it today is branched into the SSCLI (Rotor) line. Rotor is different to the commerical CLI in that several parts are replaced, largely to remove commerical interests but also to allow for cross platform running. There Microsoft have added a Platform Application Layer (PAL), which is a unmanaged C++ layer that sits at the very base point between the CLR and the OS that allows the IL to be run across different chips and translates system calls (error calls etc) and thread allocation etc. The PAL allows Rotor to run on windows, the OSX and FreeBSD. OSX and FreeBSD are close targets as the OS are very similar (OSX being based on FreeBSD) so adapting the PAL for each is not as much as work as say Linux would be (and possible with work).
So the .NET framework can with an adaption like the PAL be run on other platforms. What I suspect Microsoft will do is either a) extend the PAL for the commerical line so that window dependent code can use it. b) keep the PAL light weight and lighten the framework to reduce the windows dependent code. Microsoft will also improve perf with the PAL for the commerical line.
Thats my take on it :)
Andy
Seems like the more Apple is spitting in the face of microsoft, the more microsoft likes them.
After vista, windows and all other bashings, MS should just cease all Apple development. No Mac Office means OSX is as good as dead in any business environment.
That's a pretty stupid assessment. OS X wouldn't go anywhere just because Microsoft would stop doing Office. The iWork suite, if expanded the way the rumors indicate, works just fine.
It's great to see Microsoft moving forward on the initial .NET and IL vision of mulit-platform support. It sounds like WPF/E will give Adobe Flash and even Apollo some good competition...
I think this is more about stemming the flow of Rich Web App development and taking on Flash, rather than any serious support for C# and .NET on OSX.
If MS really wanted the .NET CLR to be a cross platform solution they could do it by porting the lot (runtime, library, tools) to OSX. But they have no interest in doing so: they make their money and dominate the market through Windows. Why would they do anything to weaken that?
I'm with Krishna on this one. Don't expect to be able to write any cross-platform enterprise app with this WPF CLR.
But you most probably can code Tic-Tac-Toe in C# and XAML and run it on MacOS.
If they want to support the WPF/E plugin for various browsers, it makes sense to slightly extend that support for rich UI's to the desktops. Similar to downloading a Flash file and running it locally...
Definitely a great improvment!
Carlos you cant do that as it requires an absolute url. It can't start with http:// or https://.
It's not neccessary to do the redirect with code. I serve RedirectSSL.file which is an empty file. IIS is configured to redirect all traffic to the file to the https website. Substantially easier than redirecting with code :)
Wim, I think you're missing the point of this. WPF/E has the possibility to build richer front ends that HTML can't handle today or that are difficult to do or require fancy frameoworks built on a house of cards. Having a rich UI that can talk to the server to get data to the client doesn't require a huge amount of functionality in terms of framework...
It's in Microsoft's interest to be a player in this area or else loose out to Flash or other tools that are starting to crop up to take that place.
Whether Microsoft can make any inroads on anything but Windows is another story, but it all depends on how well they execute WPF/E and whatever CLR framework/language features they support. Let's just hope it's not crippled to the point of being unusable...
It was a good presentation even with the projector issue. I look forward to going through your examples.
Great presentation, Paul. Thanks for taking the time to do this, as it is efforts like this that make local Code Camps successful.
I worked for a Hummingbird ISV for 5 years and developed for many DM solutions in many different industries. It certainly does take some time fealing your way through the dark places that don't have documentation to light them up, but once you are familiar with the room you can find anything. Now, I spend my time on Sharepoint ECM and related record retention and BPM solutions. I think it is the best space to work in. Good luck on the project and I will be interested to here more, maybe at one of the .NET UG meeetings.
If producing a superior OS means Apple is spitting in Microsoft's face than so be it. I'm not sure why Microsoft would make a version of VS or any 'light' clr for OS X because this would be a conflict of interest for them because there would be a line of developers at every Apple store. Right now Microsoft has the best of both worlds with the new Intel Macs. You can run windows natively via Bootcamp (dual boot) or by using Parallels which allows you to run both at once - the windows os in a virtual machine. With the new Core 2 Duo processors you can run VS inside of Parallels on an iMac faster than you could on a year old 'centrino' based machine running windows natively. So for those of you wishing for an OS X version of VS - try X-Develop - MS will not lead this charge and given their track record I'm not sure we want them to.
the very thing I was looking for!!!!
It helped me a lot... gr8 work.
PingBack from http://kojiroh.wordpress.com/2006/09/06/hello-world/
I absolutely refuse to believe that SQL generated by OR mappers or whatever else would perform well by default. Dynamic SQL seems as if it is doomed to poor performance, unless the people using the OR mapper or otherwise changing the dynamic SQL are severely limited in what they are allowed to do. Otherwise, what your 'user' ends up doing could eventually lead to long-running queries.
This scenario seems worse to me than hard coded SQL in code or in a stored procedure. Your tuning efforts involve figuring out the exact things your user did that ended up generating long running sql, and then you have to ensure your "tune-up" won't impact any other series of actions the user may take.
So, perhaps dynamically generating SQL may be ok under severely limited circumstance. Otherwise, bad idea.
List of JavaScript functions don't work in mozila 2 But work in Ie 6
PingBack from http://www.desertpenguins.com/PermaLink,guid,367c7a73-34ff-4d91-9f15-209f0ef1a7cc.aspx
This is a good example, but honestly, it's really stupid not being able to use an external REAL xml .config file that has the 'xml' tag in it and all other sections and stuff. I have a windows service
that has its own config file and i want to use this file from an other Windows application that resides in the same folder, so it looks like this <appSettings file="MyWinService.exe.config"></appSettings> and what i get is the error: "The root element must match the name of the section referencing the file...". In other words - it is almost useless.
The only thing scarying me is the lack of updates to WilsonORMapper.... :)
Yea, I've got some half done and never had the time and energy to finish them. Lots of changes in my life to blame, all of which I'm making efforts to fix, or already have fixed in many cases. Luckily DLinq, now called LINQ to SQL, is looking better and better with each drop. :)
hehe,
glad to hear you say that - I was just installing it yesterday, did some Linq for the first time over a Dlinq model I created, and I was pretty impressed.
Granted Paul, I agree, it's probably not perfect, but it's making progress and it's definitely easy to get started with.
:)
I didn't mean to knock you by the way, you've done a great job on your tool and I felt it was definitely worth the money I paid to help support it!
I am having the same problem right now with some of my users. I can use their credentials and login without any problem.
I have asked them to try Firefox and one users reported that Firefox works fine.
Did you even get to the bottom of this?
Hi Nathan:
No, I never could figure out the problem. I also haven't heard any more complaints in some time, so it may have been resolved by a service pack, but I'm honestly not sure.
Paul I just blogged about a comparison between Wilson ORM (WORM) and LINQ for SQL (LINQ)
http://mikelockyer.spaces.live.com/blog/cns!D935506AB1D72BB9!132.entry
Have been having a really postive time with your ORM and my students.
Thanks
Mike
I have put a short discussion about using your ORM and LINQ at
I'd be interested to learn your up-to-date opinion on LINQ to SQL. I also thought very little about DLinq when it first arrived on the radar back in 2005. However, i have to say that having experimented with the latest CPT I'm pretty impressed in general.
Cheers,
Chris.
Hi Chris:
I noted in a previous post, and in some comments on this thread, that LINQ to SQL is definitely looking much better to me. I still haven't had time to play with the March 2007 CTP though, so I'm not in a position to comment more yet.
Bravo! I wish all clients were as open about sharing their experiences with professional pet-sitting companies as you are!
Thanks for helping get the word out that there are professionals out there!
And Congrats to Tanya for making such a positive impression!
Best,
Peggie
I thought it had been a while since you posted...
To further constrain the input for T, add a type constraint of where T: struct. You can't use : enum, so struct is the next best thing.
Another handy utility enum function I use quite often:
public static T ParseEnum<T>(string value) where T: struct
return (T)Enum.Parse(typeof(T), value, true);
PingBack from http://test3.netmoviehost.com/garbage-collection-information-must-read-for-net-devs/
I've been looking at the implementation of Enum.ToObject(Type, int) (using Lut'z Reflector, of course), but can't seem to think of a reason to use it. Why not cast the int directly to it's enum?
MyEnum = (MyEnum)typeValue;
Can you demo the usage?
As for the usage, consider an enum named MyEnum and a variable of that enum type that you want to load from an int value, possibly one you've stored in the database -- just do the following:
MyEnum test = ToEnum<MyEnum>(value);
As for the direct cast, that's a good question, and I could have sworn I'd tried that many times and it didn't work -- although it did just now in my test. Maybe I'm thinking of a limitation I encountered in .net v1 that I've been working around -- but maybe I'm wrong there as I didn't retest that assumption. Oh well, it seems that its not necessary for .net v2 at any rate, and if you have generics then you have .net v2, so mute point I suppose.
Thanks for the comments.
I would throw something like this into your helper:
System.Diagnostics.Debug.Assert(typeof(T).IsEnum);
all these helper function can not ensure valid value of enum.
at .net 2.0,
support MyEnum only have two enum value, and the value is 10, no exception will throw. So i don't know MyEnum test now have a invalid value.
You can call Enum.IsDefined in the helper function first to guarantee a valid value, and if it fails then throw an exception. The same problem occurs with the simple cast syntax, so at least using a helper function makes it easier to add extra things like this when you find it is needed.
I am having the same problem.
It is affecting a very small portion of users who try to log into our site (<1%), and the common factor is that they are all using IE (6 or 7). Firefox works fine.
Recently we changed from our own customised authentication implementation which made use of the <asp:Login> control. With this implementation, we created a forms authentication ticket and issued it to the users, once we had done this we simply redirected through a Response.Redirect() to their requested page.
Now when we upgraded, we made the authentication method simply create a user profile once they had been authenticated, and then FormsAuthentication.RedirectFromLoginPage(Login1.UserName, false); to take them to their desired page.
I can gather this from Fiddler (on the problematic machine, NB also: all IE settings were default etc) :
The login.aspx repsonse is sending me a cookie from the site, as you would expect.
Then when I get forwarded to my target page (default.aspx), the cookie does not exist on the client, intsead I have this cookie... ASP.NET_SessionId=tp0k4x45mljteojyxnmexlz2, the Default.aspx response then redirects me back to the login page - as I'm not authenticated.
So for some reason, the client browser is not accepting the cookie. I am 100% satisfied that we have been through every setting in IE to allow cookies etc.
Can someone please shed any light on this?
Regards,
I haven't heard anything about this except here on this thread. I never had the user's computer to reproduce or debug either, so you have something much better than I did. So please contact Scott Guthrie or open a bug report and let them know that you have a machine that they can come and reproduce it on.
Have you ever consider this?
http://aspnet.4guysfromrolla.com/articles/032206-1.aspx
This was written long before Sql 2005 was around with the RowNumber function. My ORMapper does support using the RowNumber function with Sql 2005 for optimal paging.
PingBack from http://derek.netmoviehost.com/even-small-configuration-changes-can-cause-bigger-problems/
man, I was about to pull my hair out..
thanks a lot for the tip, you saved me hours
My problem is definately with master pages. The control works fine ( using my custom MembershipProvider )on a simple page with just the control itself. Same page placed in a content area of a master page and the
"Log In" button doesn't do anything.
I have a login control that works fine ( with a custom MembershipProvider ) on a simple page, but in the content area of a master page, the Login button doesn't function.
Any feedback on this would be appreciated.
I would guess that a control event handler is expecting a hardcoded name.
We use Stonefield Query out of Canada...A far superior product when compared to all of the alternatives...SQL Reporting Services is free, but somewhat limited in customization. Active Reports has the worst UI I have used. Crystal Reports is the oldest and should be the most flexible, but they seem to have forgotten the latter part.
Be careful about the performance of enum operations.
I'm not as enthusiastic as you over Orcase dropping EF in favor of a supplemental post-RTM drop.
However, I am a fan of LINQ to SQL and tend to agree with you that EF is excessively complex.
--rj
http://oakleafblog.blogspot.com/2007/04/dj-vu-all-over-again-entity-framework.html
Yes like you I am actually relieved by this. Linq to SQL will be powerful enough for many apps.
I am also relieved that I do not need to explain (yet) to our younger devs about these two frameworks.
Hopefully EF gets delayed longer (another year or two) and fits in better with Linq to SQL.
I agree that the Entity Framework is complex enough that not shipping an excellent designer with it makes no sense, but saying that LINQ to SQL is good enough for the vast majority of O/RM scenarios is just plain wrong.
Yes I agree. LINQ to SQL looks so much better for many cases. The dissappointing information here though is the suggestion that we will not get support for dbs other than SQL Server in LINQ to SQL, or any enhancements around inheritance hierachies i.e concrete table per class. See my notes at: http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!365.entry
If you define your ORM as having two models, one relational and one object -- the "let's build the software twice" style of ORM that happens, LINQ doesn't quite help you.
However, if you have an ORM view that says 'including relational data in my objects', LINQ fits in the same fashion as embedded SQL.
And for the hip Rails/MonoRail style folks, LINQ could be a very cool way to get an ActiveRecord in C# that is more like the Ruby variant.
Ian: My understanding is that MS is not themselves supplying non-MS providers, but that does not mean that 3rd parties cannot fill that gap.
Joe: Time will tell I suppose, but look at how many people are happy using my simple ORMapper, and then add MS designer and support, and being built-in.
Will: I agree Linq to Sql is essentially the ActiveRecord pattern, and that's what really hot in both Rails and NHibernate communities -- simplicity.
LINQ to SQL is great and useful in many scenarios as you say, but I think it cannot be called ORM. You can call it an OR-bridge or something, but it lacks mapping capabilities. What you get on the object side is just a direct representation of relational data, and nothing you would expect from an object model. Really mapping relational data to ojbects can be very complex, but tools like the Entity Framework makes it easier.
Another way around the non-ssl IIS issue is to set a host header that will never occur, e.g nevergonnahappen.com. This will completely close the door to requests to the website.
Microsoft should take on the model of other companies (Novell, IBM) and embrace solid open-source projects from an implementation and consulting front rather than try to emulate, where they have mixed success. Microsoft's funding and blessing of key OSS projects could be huge, and wouldn't hurt Microsoft at all.
I agree with your "simple is good" comment, too. Simple fits many needs, and your O/R mapper does just what an O/R mapper needs to do to fit the need of many projects. Speaking of which... have you seen the WilsonORWrapper I've been working on? http://www.hosted-projects.com/trac/computersims/wilsonorwrapper/
To set the record straight - or at least firmly crooked:
VS 2005 w/ SP 1 WORKS ON VISTA - with some issues. Nothing I have seen is a showstopper though...
VS 2003 SORT OF WORKS ON VISTA - ASP.NET Development will not work in the IDE - you can't install that feature because you can't install Frontpage Server Extensions.
That's been my experience, and I'm pretty close to the source - I work at the MS Corp. Campus, and that's the consensus here...
Regards...
Oh man. This sounds really good. I wish I could come to these but I have been so busy the last few months when I have been in Atlanta, I just haven't been able to make it.
well , if you go to other websites you can get layouts , and you can get DIV layouts that makes it all different .
you can even find sites where you can make your own layouts . and they're very easy .
these sites help it make your site more personal .
i think the reason people are on myspace, is that it's just another form of msn , where you can chat with each other and all [:
I have been looking for a good example for long time now - i found yours and it were working the first time - damn good work! :)
How cool that about 4 years later we can still find blog posts like this one... which denotes how everyone is still confusing IIS applications with virtual directories!
[quote:c3529a8a16=\"MrRex\"]welcome, dotnetninja! I have seen some https: sites in the Google SERPs, but that doesn\'t mean a whole lot. It just makes me think that if you give the spiders access to it, then they will crawl it. But I\'m not all that familiar
blast, why do I always seem to stumble across these sort of announcements the morning after the event!? [grin] I'll catch you guys next time 'round.
Pingback from Rhonda Tipton’s WebLog Web Links 12.10.2006 «
What's happening if there are approx 100,000+ objects of Product (e.g., Product[] products = new Product[100,000]), will they make the app slow down?
Which is the best approach to manage a huge list of objects?
Thank you very much for any idea.
Lenny
We're also trying to run .NET winforms on citrix using infragistics. Our app's are copied to a file share, and then the exe is fired up from there. We copied our infragistics dll's along with the rest of the files in the bin directory to that file share. When the users start up the exe, it just opens the form and shuts down. If we copy the same files over to a PC, it works fine. Has anyone else run in to this situation in regards to using the infragistics controls in a citrix environment deploying to a file share?
My thoughts are that we would need to register the infragistic dll's in the GAC of all 3 citrix boxes we have.
A file share is just where something is stored -- it does not actually run on the file share. So yes, if something is necessary to run the exe, then it must be installed on the boxes that are going to actually run it -- citrix boxes in this case.
It doesn't really matter if you're using an O/R Mapper or regular ADO.NET -- don't work with more objects/records than necessary. If its something to display to the user then you use paging, and provide filtering and sorting options -- no person is going to look at 100,000 records. If its something that needs processing, then do it the most efficient way possible, which would be in the database using sql or a stored proc.
In May I was blog tagged by Andy Schwam . So here are five things you may not know about me: I am a
Another way to accomplish the same result in ASP.NET 2.0 is to use a LoginView control on your login page. If a user is not logged in, you can display the Login control using the <AnonymousTemplate> section of the control. Otherwise, you can display the not authorized message in the <LoggedInTemplate> of the control.
Yes, as the title says, .NET will be running on Mac OS systems in the future. I was searching a different
Congratulations on the new job. Of course, as I work for the competition, I'm not sure I can associate with you any more :)
Seriously, though - hope you enjoy the new gig, even if the new drive is quite a bit longer.
Hi Paul! I was on the asp.net developer site at msft and saw "McKession" and that jumped out at me. I work for a company called Iatric Systems. We do lots of interface work off of one of (I think) your competitors, namely Meditech. I myself am a .NET developer, but new to the medical industry.
Anyway, if you get a chance drop me a line at derekbeyer@hotmail.com.
Have a great Christmas!
Congrats on the new job Paul, I am glad to hear things are going well and that you will be doing some things you enjoy. Keep us posted on what you learn. =)
Great to hear you're happy and the family's well Paul. :-) Our little nipper Tane is 16 months now - and providing us with endless joy and wonder. Taking him swimming in 5 minutes. :-)
Small world. I work for a company barely a 1/4 mile from that McKesson office on Windward.
Congratulations on your new job @ McKesson. Ever since I moved to Atlanta I have been trying to get in but they are very s-l-o-w to respond. Glad you were able to make it.
Paul, you change jobs almost faster than me. :) Good luck to you, and I hope your new job meets and exceeds all your expectations!
Congrats! I am glad you are finding more value in spending time with family than doing work for people you don't owe anything to - while it is nice, it isn't necessary for being happy!
It's great. I got it to work for a web application that uses a business object (DLL) when I wanted to override the values defined in App.config in Web.config. Based on my understanding, the advantage of defining values in the Web.config is that it updated every time the content is altered and it doesn't require restart. Anyways, it's great stuff.
Yes, if you use VS2008, you must deploy SP1. Anything else is just working with luck and is unsupported.
Just to clarify, I'm using VS 2005, not the multi-targeting feature of VS 2008. I suspect that's still a mute point, but I just wanted to make sure we're all on the same page.
I think its fair to suspect that if you start using VS 2008 to build your 2.0 apps then you probably are knowingly taking some "risks", while I think most of us would never suspect that just putting VS 2008 on our machines now forces us to update all our deployment machines!
Hi, Paul: Have you tried adding a <supportedRuntime> entry to the app's .config file? http://msdn2.microsoft.com/en-us/library/9w519wzk(VS.80).aspx
Good idea, but this is where MS hasn't been very kind in their versioning. They may have kept v1.0, v1.1, and v2.0 separate, but service packs just update the existing version in place so there is no different "version" to reference. Then by making v3.0 and now v3.5 simply reference v2.0, instead of being a real complete new version, they made it worse since v3.5 ended up requiring a service pack to be made to both v2.0 and v3.0.
You can use VS 2008 to develop applications that work with .NET 2.0 or .NET 2.0 SP1.
The only trick with targeting .NET 2.0 directly is that you need to make sure you don't use any API introduced with .NET 2.0 SP1. Otherwise you'll get an exception when you try to call it with vanilla .NET 2.0 (note: this same issue exists with VS 2003 and .NET 1.1 SP1).
We are looking in the future to enable VS to automatically filter intellisense based on SP target to help people avoid this. I believe there is a FXCOP rule you can use now as a post build step to check.
Also - if there are behavior changes in an API with an SP (which might be what you are running into above), you can run into problems if your old assumption about the behavior has changed. In general we really try hard to impact people this way (we have a strict breaking changes policy), but since bug fixes are by definition behavior changes (by fixing the bug you are changing the old behavior) sometimes these effect existing applications. This is true for both VS 2005 and VS 2008.
Hope this helps,
Scott
This is almost exactly the issue I had with the vista .net assemblies when vista came out - it was 2.0, but the xml serialization was different than the 2.0 on my xp machines. Now those differences have been put in sp1, so it's no longer a vista/xp issue.
See philiprieck.com/.../933.aspx
Simply compiling in the presence of SP1 won't cause problems. But, the presence of SP1 means you can use new methods/classes introduced in SP1. HttpServerUtility.TransferRequest (which only applies to ASP.NET applications), for example, doesn't exist in .NET 2.0 prior to SP1; so there's no way you can use it without installing SP1 on your development computer. Once you install SP1 and use HttpServerUtility.TransferRequest all your clients must then have SP1 too.
See also www.hanselman.com/.../CatchingRedBitsDifferencesInNET20AndNET20SP1.aspx
Scott and Peter: If only things were as simple as we're led to expect.
From my point of view, I've done enough today to prove it does matter! That's right, I built my virtual machine, with VS 2005 but not SP 1 for .net 2.0, and then I ran the very same Nant script that I do on my dev machine, which gets the source, sets the version info, and compiles it all -- and it worked just fine when I deployed it to my QA environment. No code differences at all, just different machines compiling it, one with SP 1 and one without.
I'll be the first to admit I haven't proved anything, since my dev machine certainly has other things on it that are also not on my new virtual machine. But the only 3rd party reference in my projects is log4net, so none of those other things should in principle have any chance of messing up my build, while its hard to argue that since SP 1 clearly does change things that it just might. And I see just enough from others to feel I'm not alone, including:
philiprieck.com/.../933.aspx
discuss.joelonsoftware.com/default.asp
That is th only reason i am taking cautions to use vs2008 on my development machine.
I have BI,Devices,and webapplication.
I get to know that vs2008 is not for sql server 2005 related business intellegence solution but for sql server 2008.
Also in vs2008 i can't find option to target a device application to use compact framework 1.0
So there should be some page from microsoft for addressing the possible problems.
I had the same issue. The resolution I found and is working for me is...comment the second line of code ie.,
"// Keep the viewstate hidden variable but with no data to avoid error
RegisterHiddenField("__VIEWSTATE", "");".
That is reinserting multiple tags of __VIEWSTATE instead of actually replacing/working with one tag.
Great post. Excellent solution.
This is one to remember. Paul Litwin has posted about forcing SSL gracefully on a site using a post from
Pingback from Hardware IT Blog » Blog Archive » Review of Excellent Book: Linq in Action
Pingback from Book Reviews
Link Listing - March 12, 2008
Can you compare LINQ In Action to any of the other LINQ books on the market, or is this your first one?
-Tisho
I've seen others and this one is better. I've actually received another to review that was so bad that I told the publisher they probably didn't want my review to be posted. :(
Pingback from devry university
Pingback from arcadia university
Since our LINQ in Action book was published last month, we are lucky to receive a lot of nice feedback
Pingback from dotNet Application Framework « maonet technotes
Hmm... same problem here. I'm using a custom membership provider and master pages. My login button does not submit in IE 7 but works perfectly in Firefox 2. What's crazy is that when I remove the master page references and take my login control out of the content place holder and into a form in the login page, it works perfectly. In summary, custom membership provider + login control + master page = no worky.
Pingback from document location firefox problem
Pingback from logiccolony.com/blog :: .NET on OSX
Login control ASP.NET works in Firefox, not in IE
go here
www.thiagarajan.net/.../Login-control-ASPNET-works-in-Firefox-but-not-in-IE.aspx
I've removed Master Pages from my login page and still I get this error. It is so puzzling, but it's good to know that this is a known problem. I have to tell my users to use Firefox, I'm not sure what else to do.
But the fact remains: the built in Login Control for ASP.NET 2.0 does not work properly.
We really need an answer, this is just not acceptable.
Tushar
lo and behold miracles are possible! I have found a solution. Took me ages to find and in the end it's so simple.
In IE go to Tools-->Internet Options-->Privacy-->Tick OVERRIDE AUTOMATIC COOKIE HANDLING-->Accept or Prompt First-party Cookies, Accept or Prompt Third-party Cookies. You may need to configure/switch off ZoneAlarm too
Hope that helps. I can release my database to my clients now!
Tushar :-D
Pingback from Phil Bernie Consulting » 7 Things That Will Make You a Better ASP.NET Web Developer
Tanya has been taking care of our two dogs, Rudy a yellow Lab and Jessica a Golden
Retrvr. Recently Jessica underwent cancer surgery and we thought we were losing her. Tanya came over right away and did her Reike treatment, repeating it over several days. The improvement in Jessica was amazing. I know she would not have made it without Tanya's healing.
Thanks again Tanya, we look forward to you caring for our pets in the future.
Sincerely,
Patty and Pat.
Well I just got offered a position to work for mckesson but I am not sure if I should take it because I also got offered a governmenmt position as well and I just graduated and I am trying to find out so info on Mckesson and moving up in there company. Can anyone help?
Chastity: I certainly can't pretend to know what is best for you, but for me McKesson has been a great place to work so far. Its a huge company (Fortune 18) with lots of opportunities for good people, including opportunity to grow over time.
Our deepest condolences to you, your family, Matthew's wife and many friends. We can hardly begin to repay the immense sacrifice that brave souls like Matthew and their families have made on our behalf.
Paul, be strong. Nothing will replace you loss. Ours prayers to you and you families.
Andrey.
my most sincere condolences to your entire family!!! it is such a pity that a young man lost his life. Hope good and happy things happen to his family in the future.
You and your family have my heartfelt support. I have lost 3 of my best friends in Iraq. I have a sense of your family's loss and disruption.
Thank you Paul for sharing this very personal event with the us here. Thank you to Matthew for his service.
Respectfully,
Harry Coles
My thoughts and prayers go out to you and the whole family! My cousin is Bridgett O'Bryant(his wife) and while they were stationed up here at Ft. Meade,MD I was able to meet him and hang out with them and Matt was a really great guy and a sailor. He was very proud of what he did.
Paul, I assure you that people in Pakistan remember those who were killed and the families who lost their loved ones in their prayers.
I'm really sorry to hear about your loss. You have my deepest condolences.
I was Matt and Bridgett's pastor in Laurel, Maryland. We have only known them for a short time but we love them dearly. It was such a shock to all of our church family to hear the news. Matt and Bridgett were both vital parts of our children's ministry. Our deepest sympathy and prayers go out to the family.
HE IS NOT FALLEN, BUT RISEN, NOT DEAD
BUT IN THIS PATH WE MORTALS TRED,
ONLY GONE A FEW TRIFILING STEPS AHEAD,
AND NEARER TO THE END.
AND YOU TOO, MY FRIEND, ONCE PAST THAT BEND
SHALL MEET AGAIN WITH THIS FRIEND YOU
FANCIED DEAD.
My sincere condolences, May god bless his soul and give strength and support to his family during these hard times..
God will not forgive them those who have done this and supported this..
Nice discussion but no one have mentioned the ASP.NET control´s Dispose method. And I´m curious on that issue because many controls have the Dispose and what we harldy see is them being called in the code behind.
My thoughts and prayers are with you,Bridgett, and the rest of the family and friends. I was one of Matt's classmates while we were at NAS Pensacola and Corry Station. I have been assigned to a ship and was out to sea when the news was left on my phone. I cannot imagine what you are going thru, I can only offer my prayers, thoughts, and willingness if you need any help. Matt was a shining example of selflessness and courage to fight for what he thought was right - and unfortunately he paid the ultimate cost. Even tho I too am in the service, I owe him. You can contact me anytime. ctmallen2007@yahoo.com
God Bless you all.
Sad to hear of the passing of a shipmate. I got out of the Navy in July of this year and found your site while doing a search of my name. What tragic coincidence.
Eternal Father, strong to save,
Whose arm hath bound the restless wave,
Who bidd'st the mighty ocean deep
Its own appointed limits keep;
Oh, hear us when we cry to Thee,
For those in peril on the sea!
Work-around for NumericUpDown and databinding to dbnull.
Here is the crappy workaround I came up with to handle the fact that Nup controls silently fail on databinding to DBNull.
My scenario is that I have a DataGridView and when the user moves from row to row I display some other information and some of that information is displayed in NumericUpDown controls.
On the WinForm I add a hidden textbox control right under the Nup control and set its DataBindings to be the same as those of the Nup control.
In my SelectionChanged event handler for the dgv, I have check the textbox to see if its nullorEmpty and if so then call the Nup's ResetText and set its Value to be zero, else set its value to be the value in the textbox.
This seems to work.
Sample of my code:
if (string.IsNullOrEmpty(this.TxtLIWage.Text))
this.NupLIWage.Value = 0m;
this.NupLIWage.ResetText();
else
this.NupLIWage.Value = StringToNumber.ConvertToDecimal(this.TxtLIWage.Text);
The StringToNumber is my own class that handles converting text to decimal and takes care to culture (Canadian English/French).
This crappy workaround might also come in handy for dealing the DateTimePicker controls too.
Hope this is helpful to others.
Sheir
it's so sad. My deepest condolences to you and your family.
I am using DNN for one of my site and involving in developing DNN sites for a large company in the UK, the reason I am choose DNN because I am a .NET developer and DNN enables me to do my task quick for customers. There are lot of high quality commercial modules that you can buy for quick implementation or you would spend several years to build your self. Now the bad thing about DNN is that make new module is scary thing with its DAL, Info class.Also making skin (themes) in the framework are not simple as you do with master page.
Time to empty the FeedDemon flagged list. Jeff Key updated the indispensable Snippet Compiler a few weeks back. Mr. Agile Configuration Management, Brad Appleton has put up a very valuable page of Iterative Development Resources. Make sure you bookmark
I graduated from Theodore High School with Matthew. He was also in JROTC with me and he was an awesome person. His love for the Lord and his pride in what he did inspired me so much. I am so terribly sorry for your loss and I will continue to pray for your family. God Bless your family and America Bless God
If my class uses just private variables( no other resources and unmanaged code) like:
Class Test
#region Fields
private int test1;
#endregion
#region Properties
public int Test1{ get; set; }
Do I need to implement Dispose method for this class?
Thanks in advance...
No, you don't need a Dispose method unless you have something else, like a file or stream or db connection, that needs Disposing.
Note : This entry was originally posted on 9/14/2008 5:16:11 PM. I present at a lot of the local Florida
Pingback from Setting up SSL with IIS for ASP.NET | Don Kitchen
Pingback from baza danych (lub provider) oparty o dane z XMLa | hilpers
Pingback from abusing.me » Blog Archive » Framework UI - DataBindings und Nullable<T>
Thanks for your reply. I am using Microsoft Enterprise Library and one of my method in DAL looks like:
Database db = DatabaseFactory.CreateDatabase();
DbCommand myCommand = db.GetStoredProcCommand("MySPName");
Do I need Dispose for db(Database Connection) and myCommand(Db Command)?
Also when I use SMTP object to send mail, Do I need to call Dispose Method?
In short, can you please tell me the type of the objects that require Dispose()?
Like many others I assumed Dispose was an automatic functionality; reenforced by Microsoft's own lack of explicit calls in their designer generated code.
I'm learning now (painfully) that this isn't the case. My question to you though, is should this extend to UI components?
Should I (do you) call the Dispose method of all controls added to a form/usercontrol (through the designer or not.)
So what is the verdict on calling dispose on connections then? Because if you don't call it for database connectiosn then basically the only time you actually need to call it is when using a fileStream or TextStream basically right? So in 99% of your .net code you will never call dispose correct?
Database connections definitely need to be closed or disposed (close calls dispose). You can use a try / finally block, with close or dispose in the finally block, or use a "using" block, which translates to the try / finally block in the il without all the work for you.
What other objects should have dispose called? In general any object that implements IDisposable should use try / finally or "using" to make sure dispose gets called. There are certainly some cases where we may be "smart" enough to know it doesn't matter, but you may be wrong, and it may change in the next version, so don't be too "smart"!
Pingback from Nullable Types in .Net 2.0 « CollectedDotNet
Quem é que ainda não conhece o NHibernate , LLBLGen Pro entre outros ? Como sabem estas "tools"
Pingback from Property with Formula (generated=always) generates invalid SQL for post-insert Select | rapid-DEV.net
What do you mean by "call to...for some users is failing"? Did you try make a direct request for the resource? What error does the server respond with?
Try using Fiddler to see the requests and look at what is being sent and what is being returned for the axd requests when logged in as one of those users.
www.fiddler2.com/fiddler2
Raj
Any invalid view state exceptions showing up in the event logs?
connect.microsoft.com/.../ViewFeedback.aspx
It looks like the problem lies entirely with the portal's gateway, as the webresource.axd is being sent from IIS even when the portal does not serve it up. It looks like we have a viable work-around by making our internal calls from our portal server to our .net portlet servers be https, matching our external client calls to our portal server, although that doesn't really make sense that it would matter.
Pingback from Video – Reunión ALT .NET Café 29 De Agosto « BeyondNet
Pingback from Brainsick Patterns — No Code Relation » Blog Archive » C# Dispose
Pingback from ?????? ???????? ?????? ???????????? https - Persian Networks
Pingback from Twitter Trackbacks for The Truth about Stored Procs and O/R Mapping - Paul Wilson's .NET Blog [asp.net] on Topsy.com
Pingback from Rich Internet App Development
Pingback from So who’s not setting their objects to null? – .NET, Web development, Contract programming
Pingback from Deploy .net windows application on citrix | hardware wacool
Pingback from Setting up SSL correctly with IIS and ASP.NET | WebHosting Matters
Pingback from Bridgett bryant | Sejani
Pingback from Post Back Hell : To Read & Pounder….. « SwimmingPool.Net
Pingback from Use Full Website… « nishantcomp2512
Pingback from Appsettings file | Moneymaketonli
Pingback from Authorization redirect | Supernaturalrocks