Archives / 2005
  • Old-skool demoscene effect in C#: Rotozoomer

    On a day like Christmas day, people can often lose themselves in old memories. As an old demoscene member (1989-2002), I have tons of great memories about writing endless assembler to plot pixels on an Amiga 500, demo parties etc. etc. Some time ago I had written a simple port of my old rotozoomer code in Java, and today I thought: wouldn't it be great to release that on a day like Christmas day, so my fellow nerd programmer friends have something else to mess with instead of grandma's cake?

  • New VS.NET 2005 IDE Crash: it just takes one mouseclick

    Please vote for this issue here: To reproduce, see the attached project.

    The problem is potentially major: a .NET exception brings down the complete IDE. This is a problem, if a control wants to throw an exception at design time because it encounters wrong input data: it can bring down the complete IDE by doing so. If you attach a debugger after the crash occurs, you'll see that the exception not being handled is one thrown by the code in TheView class, normal .NET code.

  • Microsoft, please fix MSDN Feedback Center bug report form.

    Disclaimer: rant straight ahead

    Ok, I'm getting pretty fed up with MSDN Feedback Center, Microsoft's bugreport system. It uses a bugreport form that's unusable in Firefox and also is simply stupid when it comes to uploading files. I really wondered why my attachments weren't attached to the bugreports, while the files were uploaded when I submitted the form (checked that). Turns out, some brilliant 'programmer' cooked up the idea to add a button (I never saw that button, after spending more than 10 years with websites you get blind for these things apparently, but nevertheless, it's completely unlogical why that button is even there) which performs the attachment upload, but it's in the same form! While everyone expects the file to be uploaded when you click submit. And the silly part is: because it's a file upload input element, the file is uploaded anyway when you click submit! So the file is uploaded when submit is called (as it has been since, what, 1995?), but the file is ignored when the form submits. That's what I call Coding for the Customer.

  • VS.NET 2005 C# : IDE hang with simply code...

    Today I was doing some small research work with generics in VS.NET 2005 professional RTM and I was just typing normal code when the IDE suddenly locked up, a hardcore hang with 100% CPU usage. After a kill process, I restarted the IDE, loaded the same testproject, went to the same line of code and typed the same text... bam! hangs again!

  • .NET 2.0 GridView for winforms... why is it so slow?

    Is it just me, or is the .NET 2.0 gridview control for Winforms about the slowest grid-like control that has ever been released? I mean, the painting of it is so incredibly slow, it hurts the eye.

    In SqlServer 2005's management studio, open a table in Object explorer so you get a grid of rows. Open a table which has enough rows for a full screen. Then open a query window, which is effectively a new tab. Switch between the two by just clicking the tab headers. On my Xeon 3GHz box I see the painting done top to bottom on the grid which is taking at least half a second.

    I noticed the same thing in a simple .NET 2.0 app with a Gridview on it. Other people have the same thing?

  • Placement of Solution Explorer in VS.NET

    The first time I ran VS.NET 2005, I was asked to select a profile matching my developing needs. I selected the C# developer profile and expected to have the Solution Explorer docked to the left side of the IDE. Though, it was placed on the right side. This is IMHO a bad choice.

    I think it should be docked on the left side because of the following:
    A developer who looks in rest-position at the monitor normally looks at the center of the screen (funny jokes aside what you define as 'rest' position ). Because all code is left-aligned (unless you're using hebrew or arabic writing), the left half of the code window has more code statements than the right-half of the code window. Having the Solution Explorer docked at the left (and the Solution Explorer is likely to be opened at all times) the left side of the code window is placed at or around the point where the developer will look at in rest-position. If you have the Solution Explorer at the right side of the IDE, the left half of the code window, with most of your code, is positioned at the left side of the IDE, and thus at the left side of your screen. You then thus have to look at the left side of your screen to see your main focus of work, IMHO that's not the most optimal position.

  • SqlServer 2005's installer... Oracle Quality, at last!

    SqlServer 2005's installer is a bit hopeless. It needs IE to get you started. Not a problem. I open the page in IE 6 on XP, I give it permission to run objects/activex and what have you. Then I click a link. "Error on page", IE says.

    So hunting through the sourcecode I find a link, to an .hta page. Also doesn't work. So I hunt through that sourcecode as well and find a setup.exe. Unfortunately for me, it was in the Tools folder. I run it, but at the end, of course, no SqlServer 2005 installation. Just docs 'n tools. Though the installer gives you the suggestion everything is installed. It even displays the dialog where it explains you have to run the config wizard to start services.

    Why on earth isn't there a single installer, which simply starts with a .exe, like in SqlServer 2000? It's great Sqlserver finally got a lot of Oracle's features, but one 'feature' wasn't that required to be implemented in SqlServer: Oracle's horrible installer.

    Ok, take 14...

    (Update): Ok, the setup.exe in the Servers folder is the real setup. So don't bother with the setup in the Tools folder nor with the .htm files or .hta files. Also, if you're installing on a system where SqlServer 2000 is already installed, be sure to select during the setup of SqlServer 2005 for a named instance and give it a logical name, like SqlServer2005 (don't include spaces). This way you can refer to the SqlServer instance as yoursystemname\SqlServer2005 in the connection string for connections to SqlServer 2005 and yoursystemname in the connection string for connections to SqlServer 2000.

    Another tip: after installation of SqlServer 2005 and/or VS.NET 2005, you'll probably notice a new service which eats a lot of CPU time. This is the NGEN service, which is NGEN-ing the .NET assemblies and sqlserver .net code. So be patient (takes a couple of minutes)

  • VS.NET 2005/Sqlserver 2005 RTM and are available at MSDN


    Now, the MSDN subscriber download site seems to be hammered by a gazillion mad geeks looking for the bits as it seems, because downloading seems impossible at the moment, but I'm sure it will ease somewhat in the coming hours (yes that was wishfull thinking )

    Congrats to the VS.NET and Sqlserver teams with this big milestone!

  • LLBLGen Pro v1.0.2005.1 released!

    Time flies when you're having fun, they say, and it's true . After 6 months of hard work, it's finally done: LLBLGen Pro v1.0.2005.1 is available. This release is a significant milestone, because it includes some key elements, like full inheritance and for example basic support for .NET 2.0.

    Let's have a look at some of the new key features:

    • Full inheritance support. LLBLGen Pro now supports 3 types of entity inheritance:
      • Complete hierarchy mapped onto a single table. In LLBLGen Pro this is called TargetPerEntityHierarchy. This is the inheritance type which is very easy to implement and therefore supported by most O/R mappers.
      • Every type in a hierarchy mapped onto its own table, no discriminator column. In LLBLGen Pro this is called TargetPerEntity. This inheritance type is hard to implement, most O/R mappers fall back to option 3.
      • Every type in a hierarchy mapped onto its own table, with discriminator column in root type. Similar to option 2, and because LLBLGen Pro doesn't need a discriminator column for option 2, this type is supported but the discriminator column is ignored / not required.
    • Compact Framework support, including support for SqlServer CE
    • Type conversion technology, map transparently any .NET type on any database type Type converters let you map an entity field of any type onto any database field. LLBLGen Pro will do the conversion transparently for you, behind the scenes. You just work with the entity field type. With this you can for example map a boolean entity field onto a NUMBER(1,0) in Oracle, to have true database generic code, which works with SqlServer and Oracle (SqlServer supports a bit/boolean type, Oracle doesn't). But it doesn't stop there, you can also use this to map a field with type XmlDocument onto a varchar database field. The conversion is done through simple TypeConverter objects which are easy to create yourself and which are used inside the LLBLGen Pro designer to control the types of fields which have a type converter applied.
    • New, easy to use, compile-time checked query construction mechanism. Here's an example:
      Get all orders which have been shipped 4 days after the orderdate:
      // C#, SelfServicing
      OrderCollection orders = new OrderCollection();
      orders.GetMulti(OrderFields.ShippedDate == (OrderFields.OrderDate + 4));
      // C#, Adapter
      EntityCollection orders = new EntityCollection(new OrderEntityFactory());
         new RelationPredicateBucket(OrderFields.ShippedDate == (OrderFields.OrderDate + 4)));
      ' VB.NET 2005. SelfServicing
      Dim orders As New OrderCollection()
      orders.GetMulti(OrderFields.ShippedDate = (OrderFields.OrderDate + 4))
      ' VB.NET 2005, Adapter
      Dim orders As New EntityCollection(New OrderEntityFactory())
      adapter.FetchEntityCollection(orders, _
         new RelationPredicateBucket(OrderFields.ShippedDate = (OrderFields.OrderDate + 4)))
      All compile time checked and easy to formulate.
    • Map as many entities onto a single table/view
    • Polymorphic queries and polymorphic prefetch paths Say you have an inheritance hierarchy of entities: Employee <- Manager <- BoardMember, and BoardMember has a relation with CompanyCar (m:1) which also is an inheritance hierarchy: CompanyCar <- SportsCar and CompanyCar <- FamilyCar.

      Fetching all Employees in a collection, will fetch all Manager entities into objects of type ManagerEntity and all BoardMember entities into objects of type BoardMember. Say you want to load all employees and also for each boardmember the company car they have, and as efficient as possible. This asks for a prefetch path, which allows you to specify which related objects to fetch together with a set of fetched objects. Our code then looks like:
      // C#, Adapter
      PrefetchPath2 path = new PrefetchPath2((int)EntityType.EmployeeEntity);
      EntityCollection employees = new EntityCollection(new EmployeeEntityFactory());
      adapter.FetchEntityCollection(employees, null, path);
      ' VB.NET, Adapter
      Dim path As New PrefetchPath2(CInt(EntityType.EmployeeEntity))
      Dim employees As New EntityCollection(new EmployeeEntityFactory())
      adapter.FetchEntityCollection(employees, Nothing, path)
      This not only fetches all employee types in objects of the right types, but also fetches only for the boardmember entities the related company car entity, and because CompanyCar is also a hierarchy, each loaded company car will be loaded into objects of the right type: FamilyCar or SportsCar.
    • Support for SqlServer 2005 (no UDT's/UDF's/CTE's) Support for the database types varchar(MAX), varbinary(MAX) and Xml is added as well as creating projects based on SqlServer 2005 catalogs and generating SQL at runtime fully compatible with SqlServer 2005. No support for UserDefinedTypes and UserDefinedFunctions based on CLR types nor support for CTE's. This will be added to LLBLGen Pro v2.0.
    • Support for partial classes in .NET 2.0, design time databinding and native .NET 2.0 runtime libraries.
    • Much faster/compact serialization for remoting.
    The LLBLGen Pro designer is also updated to fully support the new features, like inheritance and type converters. The new designer looks like this:

    This upgrade is, as always, free for our customers. If you want to download the demo, please go to this download mirror, to avoid hammering our server: Solutions Design website (12 MB)

    Full list of changes


    • All type enums are now public
    • Firebird driver is now build against v1.7a of the Firebird.NET provider
    • Sqlserver's driver now always reads the @@IDENTITY sequence as well, so users can set entity field sequences to @@IDENTITY instead of SCOPE_IDENTITY() if they want to. This is required for entities mapped onto views and which are used with instead-of triggers. The driver now also signals calling code that the user can select a sequence, so in the designer a user can now select a sequence for a field in an entity, this isn't disabled anymore for projects targeting SqlServer.
    • SqlServer driver: support for Xml types in SqlServer 2005
    • Oracle drivers using ODP.NET: support for XMLType types in Oracle 9i/10g

    Runtime Libraries

    • Adapter: Catalog name overwriting at runtime has been reworked. You can now pass in a CatalogNameOverwriteHashtable which contains all the name value pairs and the setting what to use. Internally the DataAccessAdapter uses this setting as well. Name overwriting is now done by the DQE at fieldname construction, not when the fieldpersistenceinfos are retrieved. Wildcard can be used. SQLServer specific
    • Structure of DQE's: they're now instance classes, no longer classes with static methods.
    • Reworked recursive save pipeline using topology sorting of a directed graph: first queues are constructed, then the save actions are started on these queues. This both gives faster recursive saves, but also keeps the transaction shorter (in time), as it's started later (selfservicing has same starts, adapter starts the transaction later). Originally, the recursive save routine saved the entities while traversing/building the tree.
    • UnitOfWork classes now use the new recursive save pipeline elements to construct first queues to process before starting the actions on these queues. When a unitofwork(2) object is serialized, it first determines the real elements to save, which makes serializing unitofwork(2) objects very efficient, as only the elements which will take part of a persistence action are serialized into the UnitOfWork(2) serialized data.
    • Adapter: serialization / deserialization of entities is now much faster and the data produced is up to 60% smaller.
    • Selfservicing: Multi-entity fetch logic now calls OnFetchComplete() after an entity was succesfully fetched and filled with data. Post-fetch initialization logic should be placed inside a method which overrides OnFetchComplete().
    • Inheritance support (3 types of inheritance)
    • Multi entity on single target mapping
    • Type converter technology for converting values transparently from one .NET type to the other .NET type and vice versa, to be used in Entity/View fields and predicates. For example, it offers the ability to map boolean fields directly on non-boolean/bit types in the database, or for example to map an XmlDocument object onto a string type.
    • Ability to not map a field in a table / view to a field in an entity
    • Polymorphic query support including filtering on entity type
    • Compact framework .NET 1.1 support
    • SQL CE support
    • Prefetch path fetches in combination with paging
    • Adapter: Schema name overwriting settings at runtime for multiple schema name overwrites. You can pass in a SchemaNameOverwriteHashtable which contains the from-to namepairs and the setting what to do. Wildcard can be used. SQLServer, Oracle, DB2 specific.
    • MySql: Update entities directly with multi-entity filter has been added.
    • FieldBetweenPredicate now also handles field BETWEEN value AND field, field BETWEEN field AND value, field BETWEEN field AND field
    • ORMInheritanceInfoException exception, meant for errors determined during query execution, for example when the inheritance info data is out of sync with the data in the db, which occurs for example when the type has to be determined of the row retrieved from the db and the discriminatorvalue is unknown.
    • Prefetch path optimization with a user definable threshold when to switch from one method to the other.
    • Support for Cross joins.
    • Overload to DataAccessAdapter.SaveEntity, which accepts recurse and refetchAfterSave but not a predicate.
    • SelfServicing: EntityCollectionBase.DoNotPerformAddIfPresent flag to signal if EntityCollectionBase.Add() should check if the entity to add is already in the collection (default, true) or not (false).
    • Adapter: New overloads for FetchTypedList and FetchTypedView which are simpler to use (e.g. accept a typedlist/typed view and don't require you to retrieve the fields info / relations info first.
    • EntityCollectionBase(2) now has 2 properties (ConcurrencyPredicateFactoryToUse and EntityValidatorToUse) which will set these properties of any new entity created in a collection fetch to the values stored in these two properties. Also done when AddNew() is called in a databinding scenario.
    • OnBeginEdit(), OnEndEdit(), OnCancelEdit(), OnTransactionCommit() and OnTransactionRollback() as protected virtual methods to EntityBase(2).
    • Adapter specific constructor to EntityRelation class.
    • SqlServer: inserts into a table with solely an identity field are now possible. (INSERT INTO table DEFAULT VALUES)
    • Prefetch path optimization through caching of PK hashes.
    • UnitOfWork(2) now offer a way to construct the insert/update queues prior to actually committing them. These queues aren't reset after a commit so can be used to fine-grained control over the elements participating in the unitofwork.
    • Native .NET 2.0 builds for the ormsupport classes and various DQE's. The ORM support classes build doesn't use ICustomTypeDescriptor on the entity classes, which should enable design time databinding on .NET 2.0 for the time being. (winforms).
    • Polymorphic prefetch paths: fetches of supertypes can be performed with prefetch paths which refer to related objects of subtypes and which will load only the subtype's related objects into the subtype instances (if available).
    • SortClause.CaseSensitiveCollation. This flag will apply UPPER() (or db specific equivalent) to the field to sort on, to make case sensitive database installations be able to sort case insensitively.
    • Adapter: OnBeforeTransactionCommit, OnAfterTransactionCommit, OnBeforeTransactionRollback and OnAfterTransactionRollback added to DataAccessAdapterBase as public virtual methods.
    • Adapter: New constructor to RelationPredicateBucket which accepts an IPredicate to ease the construction of filters for Adapter.


    • The regular color in the logviewer is now green instead of maroon. Errors are now much easier to spot.
    • Custom entity relation editor: the checkbox for auto-detect m:n relations is now only checked if the refresher preference to hide m:n relations automatically is set to false.
    • Custom entity relation editor: the name of the field mapped onto the relation to create is now initially set with the name of the related entity.
    • Relation nodes of an entity are now sorted ascending in project explorer
    • Fields mapped onto relation nodes of an entity are now sorted ascending in project explorer.
    • It's now possible to select a sequence for a field which is in an entity mapped onto a view and mark it as identity for sqlserver.
    • New preference setting: AddNewFieldsAfterRefresh, which controls if newly found target fields are added as new fields or are added to the list of unmapped fields.
    • New preference setting: HideManyToManyRelationsOnCreation, which controls if newly created m:n relations should be marked 'hidden' by default.
    • Multiple entities can now be mapped on a single target.
    • Entity list viewer for proper overview which entity is mapped onto which target.
    • New preference setting: AutoAssignTypeConverterToNewField, which controls if a newly added field (for example in a new entity) gets a matching type converter assigned to it automatically, based on the type conversion definitions defined in the project.
    • Plugin which toggles the hide flag on m:n relations. If a relation can't be made unhidden (because one of the two relations it's build on is hidden), it's not marked unhidden.
    • Plugin which applies selected Type Conversion Definitions to selected elements, to quickly set type converters on existing projects.
    • Option (ManuallySelectRenamedTargetsAfterRefresh) added which will cause the refresher to pop up a dialog (if not unattended) in which the user can select which target to select for a given entity, if the target couldn't be found by the refresher, for example in the case when the target has been renamed.
    • Option (LazyLoadingWithoutResultReturnsNew) added to set the flags for the _entityReturnsNewIfNotFound flags in Selfservicing to a value specified in the designer. This makes it easy to set this flag once for all generated entities. Selfservicing specific.
    • Context menu to Relations treeview in Entity Editor for easy removal of custom relations and toggle actions on relations.
    • Typed list relations can now also have the join hint for a Cross join.
    • Typed list designer now has 'Field index' in the column list of the fields in the select list. Use shift-click on the column headers to sort on multiple columns.
    • Entities mapped onto views can now have nullable fields.
    • Entity hierarchy visualizer.

    Task performers

    • Lpt templates can now be bound to templateid's which are included in TDL templates. This greatly enhances the scope of the include templates as with lpt templates (with <% %> syntax and template code in C#/VB.NET) it's possible to access the complete project object graph. This is completely transparent, just bind a .lpt template to a template id which is included in a TDL template and it will be called.


    • Two new overloads to ResultsetFields.DefineField() for each typed view, which accept an alias for the field.
    • New method in entity classes: TestCurrentFieldValueForNull(index), which returns true if the current value of a field represents null/undefined. This is for example the case for a field of a new entity which hasn't been changed, or a field in a non new entity which hasn't been changed or which has been set to null/Nothing.
    • Support for partial classes in VS.NET 2005 scenario's: all classes are generated as partial classes (C#) if a VS.NET 2005 generator scenario is chosen. VB.NET 2005 classes can already be extended with partial classes without having the generated classes defined as 'Partial'.

  • Server problems solved

    We're experiencing server problems at the moment at, our ISP is looking into the problem now, hopefully it's solved a.s.a.p. Problems were solved, but it's failing again. . Due to heavy traffic for our new version, the server burned down. We hope to solve it a.s.a.p.

  • Back from the Summit

    Summit was awesome! I think that word covers it. Had a great time, met a lot of great people and it was well worth it. Mr. Jetlag payed me a visit however with his little brother Johnny Cold so I'm not feeling very well, physically, at this moment, but that will be gone in a few days, I'm sure . Can't say anything about the content (NDA), other than about stuff that's already in the open, like DLinq. I wrote during the DLinq demo the same code in LLBLGen Pro 1.0.2005.1 (which is currently in beta), with even fewer lines of code. . WITH compile time checking of filters etc. It's gonna be a great authumn.

  • MVP Summit!

    I'll be leaving for the MVP Summit in Seattle tomorrow (tuesday) morning. I hope to see you there, if you're attending as well! .

  • Google competing directly with MS? No, why should they?

    Jason Salas wonders what will happen if Google got into the developer tool business. Interesting thought which I'm sure, among other thoughts, has bounced inside Microsoft's exec's minds a couple of times. Though, with all the hoopla about Google picking up the gauntlet and heading over to Redmond to conquer the first house on Microsoft Way, one would almost forget that it would be a silly business decision to do so.

  • Let me say it again: Linq==cool

    For the people who misunderstood me in my last posting: I really like Linq as a general purpose system to offer a single interface for accessing enumerable data structures.

    My point in my previous posting wasn't to rant about Linq, as I truly like it, my point was that the video gave me the idea as if they believed they had invented something like O/R mapping, an OO overview of your relational model and a compile-time checked query system. I can do that today, so that's nothing unique. .

  • Yes, that's called O/R mapping, and it exists oh... for a decade or so.

    I just watched this video, where Anders Hejlsberg explains to Channel 9 what Linq is. I couldn't help it but think "Why is everyone at Microsoft doing as if they've invented something new, or hearing from it for the very first time?". Also read the comments below the video on channel 9... I seriously doubt it if some people ever look beyond what they get from Microsoft. . I like Linq's general structure, and I think it's a step forward, but please... drop the act as if you all discovered something no-one has thought of before, especially in the department where databases come into play.

  • Linq==Cool. DLinq==... what!?

    Ok, everybody and his/her brother has blogged about Linq already so why not ramble some words about linq here? .

    First, Linq itself. Linq is cool. It's a system to build language constructs inside C# or VB.NET. For the people who haven't waded through the .docs describing Linq in detail, you can see it as operator overloading on steroids: define your own language constructs with C#/VB.NET language constructs in a typed way, so that you can write simple queries or functions over data, which resolve to your own structures, expression trees, or to plain C#, VB.NET, whatever you can think of.

  • CommentStripper: strip out xml comments and/or normal comments from C# code

    A customer of ours asked me if there was an option in LLBLGen Pro to not generate XML comments into the generated code. As there isn't such an option, I though it would be cool to write a little command line app to strip out any xml comment and/or normal comment from C# sourcecode. It might sound to you like the most worthless piece of code ever cooked up, I mean: why would you remove comments from your code, right? . There are situations however, where you have to distribute sourcecode to your client, but you don't want your client to have all the comments, so in a way you give the client the feeling they have the sourcecode, but they also will have a hard time reading it.

  • VS.NET 2005 Beta 3? Why?

    Some people argue that VS.NET 2005 should get a Beta 3 before RTM. I disagree: there are CTP builds for the people who want to see progress, and above all:


    Requiring a Beta 3 of VS.NET 2005 suggests production work is done with VS.NET 2005 Beta 2. Well, I never understood that, but alas, some people have no choice as they say. Despite the situation you're in, you're working with beta software, and a Beta 3 won't change that. As with everything that's in beta: it's buggy, and not reliable, by definition., otherwise the version would have been called RTM and it would have been released to use already.

    If you run into problems with such a beta product, you should have expected that. After all, it's beta software.

  • To all 3rd party control vendors: push MS to release hotfix 887818

    I've had it completely with Microsoft's Hotfix policy for VS.NET 2002/3. This is the most lowest form of support you possibly can get. What's the problem? Well, the (in)famous 'Cannot copy assembly <Referenced Assembly> to file <Current Project Output Folder>\bin\Debug\Release\<Referenced Assembly>.dll. The process cannot access the file because it is being used by another process' error.

    The thing is, Microsoft already fixed it in October 16th, 2004. That's right, almost 9 months ago. Please see the details of this crappy bug and its fix here:;en-us;887818

  • TechEd 2005 ended. It was a blast!

    TechEd Europe 2005 is now officially over, it was a great event, I had a wonderful time! . Being on the stand of Ask the Experts was great, and a lot of fun.

    Today I met again a lot of interesting people. Too bad I couldn't make it to Roy's sessions (once it was full, the other time it was stress all over here due to a bugfix that needed deployment) so maybe next time, Roy! Besides my daily technical discussions with my good friend Jeroen vd Bos, I met Paul Gielens and Alex Thissen, and we had great in-depth discussions about everything IT. These are the great things of being at TechEd: you can discuss on a high level with people about topics they are specialist in and you want to know more about. . I also had more time to show the new LLBLGen Pro designer in development to Dion Olsthoorn of Macaw.

    It was also great to finally meet Ingo Rammer! Too bad we didn't have much time to have a long chat, but nevertheless meeting him in person was great!

  • TechEd 2005, so far

    TechEd 2005 has been great so far. Met a lot of interesting and nice people, like today for example Andres of DeKlarit, we had a great chat .

    Yesterday I met one of my favorite Irish .NET developers, Marcus MacInnes. Great guy, I hope to have another chat with him later this week.

    Working on the Ask the Experts area is great too, today a lot more people came to the booths to ask questions. Keep them coming! . Tomorrow is my birthday (35 already!) and I'll attend to 2 sessions only: the panel discussion with Roy Osherove, to finally meet him (I wanted to enter the Chalk and Talk session of Roy but it was full), and the DSL architecture course in the afternoon to see what the DSL capabilities are, as it looks promissing.

  • TechEd Europe 2005, meet me at Ask the Experts!

    I'll be at TechEd Europe 2005 next week in Amsterdam, from Tuesday to Friday, at the Ask The Experts (ATE) stand!

    I'll be there on the following date/time:
    Tuesday July 5th, 14:00 - 16:30
    Wednesday, July 6th, 14:00 - 17:00
    Friday, July 8th, 11:00 - 13:15

    During the other timeslots, I'll wander around or will be in the MVP / speakers lounge.

    If you're visiting TechEd Europe 2005, feel free to drop by and say hi and have a chat . I'll bring a laptop with a pre-beta of LLBLGen Pro's upcoming 1.0.2005.1's designer so you can see a bit of that in action as well if you want to. . Version 1.0.2005.1 of LLBLGen Pro will include inheritance with a visual designer, click here and here for a preview screenshot.

    See you there!

  • Keyboard error: press F1 to continue

    Yes, you've heard about them, those funny error codes and you actually thought... those are cooked up, of course no-one gets these, right? Well, I did too, until this morning, when I fired up my old test box (p3-933 box). I was pretty surprised to see the following screen (I took a picture for proof)

    . Well, it turned out, the keyboard cable was unplugged accidently. You really have to admire those Ye Olde Bios code programmers for their sense of humour

  • The DotNED meeting

    I'm not going to write a very long story about the DotNED meeting last Thursday, other than that it was great!. . Due to time restrictions I only had half an hour for the presentation and the demonstration of LLBLGen Pro, which was too short for me to explain a lot about O/R mapping, its details and how it works in practise, though I hope everyone enjoyed what I had prepared! I've translated my slides to English as well, for the few who want to have them in English.

    Some people said the presentation was good but I wasn't as enthousiastic as they expected. I was and am very enthousiastic about O/R mapping and data-access as a subject, I'm just not that experienced in giving presentations (this presentation was my first in years, and my laptop appeared to be very outdated). But that might change in the future, who knows. . Either way, thanks for the feedback.

    The other presentation given was by Jeroen van Helvoort who made RADvolution Designer, a layout designer toolkit. Now, besides the obvious RAD advantages of the toolkit, one thing that was really great was its naming scheme engine. You could define a naming scheme (like use m_Name_controlType) with a rich set of options and every control you added to the forms automatically adapted that naming scheme. Very clever idea, which should be a core element of Visual Studio.NET as well, for example in the class designer.

    Peter van Ooijen made some great pictures of the meeting, he'll write an own review of the meeting as well, so check back on his blog as well later today. One picture he made is shown below, with me in front of the code which fetches all countries from Northwind's Customer table, filters on the selected customer, shows the customers of the selected country in a grid, the orders of the selected customer in another grid and save changes to any object in the graph customer - order - order details! Using LLBLGen Pro of course

    picture by Peter van Ooijen

    Presentation slides (powerpoint): Nederlands, English

  • DotNED meeting yesterday

    It's 31 degrees celcius here now, so too hot to be at a keyboard (even for a True Nerdtm like me) so I'll write a more thourough posting tomorrow. Though I'd like to say that I very enjoyed giving the presentation about Data-acces and O/R mapping yesterday at the DotNED meeting .

    Sander Gerz has a review some photo's online, I'm the tall guy in the black MVP tee

  • PS3 and PS3 games reveiled.

    At E3, Sony reveiled the specs and photo's of their upcoming console yesterday. I can only say: whoa. I've the feeling it will be tough for the XBox 360, although that's a great machine as well. One major feature of the PS3 is that it can play any game from the past, the XBox 360 only a subset.

  • No nullable types in VB.NET 2.0 ?

    As an O/R mapper developer I was looking forward to nullable types in .NET 2.0, so I could solve the problem of nullable value types in a solid way, but I just peeked into the new online .NET 2.0 Beta 2 documentation for VB.NET but I couldn't find any reference about nullable types in VB.NET.

  • ASP.NET without Web Projects

    This is apparently an old trick, though I learned it 2 days ago, and I'm very happy I finally found out about it. If you've ever struggled with VS.NET and webprojects which have to be loaded from an IIS server, load terribly slow and can't be used with Subversion? Well, check out this link: Follow the steps and you'll be webproject free, but you don't lose any functionality.

  • MS Petshop 3.x, your material times 1000

    For the soon to be released major update for LLBLGen Pro, v1.0.2004.2, I'm porting the Microsoft Petshop project v3.x to show some of the new code implemented in the upgrade. Now, I've seen a lot of crap code in my life but what Microsoft dares to offer as an example for .NET is beyond, well... , crap. Sorry to say this, but after working with the Microsoft Petshop code for a few hours, my eyes bleed. This isn't an example, it's code solely ment to run as fast as possible in the benchmark tests to show how fast .NET can be.

  • Regex fun

    Update: Oliver Sturm made a few great suggestions to improve the expression and also fixed a bug with eager matching. Click here to view the complete comment which explains what eager matching is and how to fix it if you run into the same issue!

  • FIX: Nested groupbox controls on .NET 1.1 SP1 have corrupted caption text

    A few days ago I blogged about a nasty bug in .NET 1.1 SP1, which made a nested groupbox control show up with garbled caption text (see here and here).

    It took some hoops but Microsoft has fixed this now. It's a fix that's available through PSS, and has KB number article number 890828. The fix is still under review so it might be the KB article is not yet available, the fix though is available through PSS.

  • Repro case of nasty .NET 1.1 SP1 bug in groupbox control, Microsoft please read

    Yesterday I blogged about a horrible huge bug in the groupbox control for winforms in .NET 1.1 SP1 on a themed XP system (and that's pretty much all XP systems nowadays, since .NET 1.1 SP1 is a mandatory fix on windows update.). Today I'll show you a repro case. It's a silly form with just two nested groupboxes. On a themed XP machine you'll see that the inner groupbox' caption is garbled and has a horrible font.

    I've tested this on more XP machines and they all showed the same results, with different themes (native XP ones). I'll try to contact PSS later today to get a fix for this AND to get this fixed publicly, because a private PSS-call-us-fix is useless, as users of applications by ISV's first have to call PSS to grab the special fix, which most of them won't do.

    Update: It seems to occur on .NET 2.0 beta1 as well.

    Full code:

  • WTF! .NET 1.1 SP1 gives butt-ugly Groupbox captions!

    I decided to upgrade to .NET 1.1 SP1. Then I ran one of my .NET winforms applications which has nested groupbox controls on a winform and FlatStyle set to System so they will be XP themed.

    Then I saw that the nested groupbox controls had their captions in bold arial font and this made the caption to be too big and the text wasn't readable. See this screenshot:

  • This SOA hype is getting out of hand

    Via Scott Stewart I came across this article on Infoworld. Let me rehash the quote Scott posted as well:

    The database community is also heading toward SOA. Plans are afoot to enable IBM DB2, Microsoft SQL Server 2005, Oracle 10g, Sybase (Profile, Products, Articles) ASE, and other platforms to participate actively in Web services-based SOA activities as first-class citizens -- even without the use of application servers. This will have profound implications for the design and management of widely distributed n-tiered applications because, in effect, hierarchical tiers will become horizontal peers.