Tuesday, December 18, 2007

Vista SP1 stable (after a reinstall)

I installed SP1 RC1 the first day it was available.  Almost immediately my Vista box would hang overnight.  It would seem to work great during the day but at night simply would not come out of sleep mode.  So I uninstalled it.

This past weekend I had a few extra minutes (or was it hours?) so I paved the box and reinstalled Vista x64 deciding this time to not install any third party drivers that I didn't absolutely have to have.  Turns out the only one I needed was for my Realtek audio chipset. 

I reapplied SP1 RC1 and after 3 days no hangs.  Everything seems rock solid.  Well, it is an RC and Microsoft has an amazingly hard job getting all the different flavors of machines out there to play nice with Vista.  All in all they do a fairly good job.  SP1 RC1 stable for me.. so far.

Sunday, December 16, 2007

Something to know about the new Hyper-V beta

Just installed the new Windows Server 2008 RC1 with Hyper-V beta and, after adding the Hyper-V role, created a new virtual machine.  Trying to start this machine gave a message that the hypervisor was not started.  This is not uncommon but is almost always the result of either having a host CPU that doesn't support hardware-assisted virtualization or hardware-assisted data execution protection (DEP) or having these features turned off in the BIOS.

Not so in my case.  The hypervisor kept failing to start giving some ominous error that its internal logic had failed.  After some poking around I noticed that I had a mass storage controller that did not have a driver installed and was not functioning.  It was my SATA controller and since my system was operating in IDE mode was essentially not being used.  Still, I disabled the controller and restarted the system.

This time the hypervisor started up correctly and I was able to install the VM.  Just a little FYI.  If your hypervisor fails to start, make sure your host hardware is all setup and working correctly.

Thursday, December 6, 2007

Family timer sucks

I have 4 kids (with two of them being old enough to play video games and one of them being really obnoxious about it) so I was very excited with the XBox 360 fall update including a family timer feature.  Ideally the way this would work is I could specify an amount of time for each child account so when they logged into XBox live their time would start counting.  This would not prevent me from using the XBox as much as I want.  In this way I can grant or remove time according to how they behave, if they do their chores, etc.

But as the current political landscape tells us, we are not in an ideal world.  Instead the family timer is a hard timer that simply counts down no matter who is using the console.  So in the few days that it has been enabled it has stopped several DVD movies and forced me to input my "secret combo password" to grant us more time.  Give me a break!

Oh well.  It's a Microsoft product so it feels quite normal to get less than you expected.  Anything else would be, well, unexpected.

Vista SP1 RC1 installed

The system seems faster to me but then again I don't have alot running right now.  It just seems more responsive.  We'll see how it goes with network file copies, etc.  I haven't measured boot time just yet but it wasn't really a problem before so I can't imagine it's a problem now.

Install took less than the 1 hour warning although not my much.  Maybe 35-45 minutes including the reboot-applying updates cycle.

Tuesday, December 4, 2007

Thanks to New Horizons, Nashville!

Just wanted to drop a quick line and give a big thanks to New Horizons in Nashville, TN.  We hold our MySQL users group meeting there every month and they provide a great facility.  Classrooms with overhead projectors and a convenient central location make it a perfect location for our meetings.

Thanks New Horizons and may we have a terrific relationship in 2008 as well!

Tuesday, November 20, 2007

MySQL Connector/Net 5.1.4 GA has been released.

Hi,
MySQL Connector/Net 5.1.4 a new version of the all-managed .NET driver for MySQL has been released.

Connector/Net 5.1 represents a change in how we package our products. Until now, we've shipped our core provider and the Visual Studio integration bits as separate downloads. This has become a bit of a problem. Often we would fix a bug that involved changing code both in the VS package and in the core provider. This provided a versioning problem where users would need to upgrade both products to see the benefit of the bug fix. To solve this, we've decided to discontinue Tools for Visual Studio as a separate product and have, instead, integrated it into a new Connector/Net installer. We hope this provides a better "out of box" experience for our users.
All previous versions of Tools for Visual Studio should be uninstalled prior to installing this product.

Version 5.1.4 works with all versions of MySQL including MySQL-4.1,  MySQL-5.0, MySQL-5.1 beta or the MySQL-6.0 Falcon "Preview".

It is now available in source and binary form from [http://dev.mysql.com/downloads/connector/net/5.1.html] and mirror sites (note that not all mirror sites may be up to date at this point of time - if you can't find this version on some mirror, please try again later or choose another download site.)

Issues fixed

  • Fixed issue where column name metadata was not using the charset given on the connection string (Bug #31185)
  • Fixed problem where closing the connection before the reader where the reader was opened with CloseConnection would cause a object disposed exception to be thrown
  • Fixed problem with installer where the installation would fail if the performance counter categories had already been removed for some reason
  • Fixed problem with attempting to use a command with a connection that is not open.  The problem was caused by the introduction of the internal method SoftClosed that is used with transactions.  (Bug #31262)
  • Fixed problem where attempting to enlist in a distributed transaction would succeed even though Connector/Net doesn't currently support that. (Bug #31703)
  • Fixed problem with web providers not being usable on medium trust systems
  • Fixed problem with installer where attempting to install over a failed uninstall could leave multiple clients registered in machine.config.  (Bug #31731)
  • Marked MySqlDbType.Datetime obsolete; replaced with DateTime (just corrected capitalization) (Bug #26344)
  • Fixed code where we were returning bit(1) as boolean but mysql treats tinyint(1) as boolean (bug #27959)
  • Added the Default Command Timeout connection string option to allow DDEX users to set an initial command timeout for very large databases (bug #27958)

Changes ported from 5.0 branch

  • Fixed problem where fields that were blobs but did not include the BLOB flag were treated as binary when they should have been treated as text.  (Bug #30233)
  • Changed from using Array.Copy to Buffer.BlockCopy in MySqlDataReader.GetBytes.  This helps with memory usage as we expect the source and destination arrays to not be overlapping. (Bug #31090)
  • Fixed problem that prevented commands from being executed from the state change handler.  Not sure why you would want to do this but...  (bug #30964)
  • Fixed problem with connection string caching where our collection class was using case insensitive semantics and this causes cases where a user orginally used the wrong case for a user id and then fixed it to still get access denied errors. (Bug #31433)
  • improved the speed of load data local infile significantly
  • fixed MySqlDateTime.ToString() to properly return the date value (Bug #32010)  
  • fixed problem where string parameters who have their size set after their value could cause exceptions (Bug #32094) 
  • fixed problem where old code was preventing creating parameter objects with non-input direction using just a constructor (Bug #32093) 
  • fixed problem where a syntax error in a set of batch statements could leave the data adapter in a state that appears hung (bug #31930)
  • fixed the MySqlException class to set the server error code in the Data[] hash so that DbProviderFactory users can access the server error code (Bug #27436)
  • fixed problem where changing the connection string of a connection to one that changes the parameter marker after the connection had been assigned to a command but before the connection is opened can cause parameters to not be found (bug #13991)

Enjoy and thanks for the support!
Reggie

Thursday, November 8, 2007

Subtext has been ported to MySQL

Looks like Subtext, a popular fork of the old .Text blogging engine that runs on .NET, has been ported to MySQL using Connector/Net.  He gives a nice rundown of how the port went including an earlier post on some issues he ran into.

Not too many big issues and a terrific success on the whole. 

Tuesday, October 30, 2007

A last plea for Windows/.NET presentations

Today is the day.  Today, October 30, is the deadline for submitting your proposals for the 2008 MySQL Users Conference and we have very few Windows/.NET proposals. 

I know you're out there.  I get emails from you.  We're friendly here at MySQL and we like Windows so don't be afraid to show up at a MySQL conference wearing your I *heart* Windows t-shirts.  Ok, maybe we'll razz you a bit for that but it's all in good fun. 

Seriously, if you use MySQL in a Windows or .NET/Mono application we want to see and hear from you.  Get those proposals in!  You have about ... 6 hours left. 

UPDATE - Turns out that MySQL and O'Reilly are going to extend the CFP deadline by 1 week but are still going to take down the home page link for it so you'll have to know the url for submitting your proposals.  Here's the URL: http://en.oreilly.com/mysql2008/public/cfp/2.  This URL should allow you to submit (and maybe edit) your proposal for 1 more week but not one minute more so quit procrastinating and do it now! 

Monday, October 29, 2007

Bitkeeper on Vista x64. Yup!

According to Bitmover this is not supported.  It shouldn't work.  Might eat your data.  But it appears to work.

I have not had the time yet to redo these steps and fine tune them so some of these steps are no doubt unnecessary.  However here are the things that I did on my way to getting this working.

  1. Install the latest Vista x32 compatible version of Bitkeeper on a supported platform.  I installed it on Windows Server 2003.
  2. Copy the BitKeeper folder from where you installed it to the Program Files folder under Vista x64.
  3. Edit the registry under Vista x64 and add the following registry key (try to use the same folder as I did).
    1. HKLM/Software/Wow6432Node/bitmover/bitkeeper/installdir=c:/program files/bitkeeper
  4. Right click on bk.exe in the BitKeeper folder and set the compatibility for all users to XP SP2.

Again, not sure if all of these steps are required or if I've forgotten a step or two.  If the above doesn't work for you then drop me a line and I'll see if I can fine tune these. 

And remember if it eats your data, you were warned.  :)

Friday, October 19, 2007

So what kryptonite is deadly in bizarro world?

Times - they are a changing.  First I read that the OSI has approved of two new Microsoft licenses as compatible with open source.  Now I see that a new beta of Windows Live Photo Gallery will allow you to publish photos to Flickr as well as Windows Live Spaces.

Could Microsoft really be coming around?  Could they really be starting to care more about what the users want than shoe-horning everyone into some second-place offering?  We'll see....

Tuesday, October 9, 2007

NCover 2 on Vista

For those of you who are using the new NCover 2 on Vista there is something you need to be aware of.  The installer runs the registration wizard at the end of the installation but does not run it elevated.  The wizard accepts your key and gives you a successful registration message but any attempt to run any of the binaries will fail with a 'not registered' message.

To solve this, just run the NCover registration wizard as administrator.  All components of NCover should work once this is done.

Wednesday, October 3, 2007

Back in the game -- with a new addition

Well I've been pretty quiet for the past few days and for a very good reason.  His name is Daniel Mitchell Burnett and at 9 lbs. 7 oz. and 21 " long he is larger at birth than our other 3 children.  He was born at 11am on September 27.

So far it's been a wonderful time, just like with my other children.  Elevated jaundice levels right after birth, lots of nursing, lots of dirty diapers, and lots and lots of fun and love.

Image 8C-138

Image 8C-142

Tuesday, September 25, 2007

It's 9/25. Do you have your Halo 3?

I knew the Halo 3 launch date had arrived last night when I look over and see my 1 1/2 year old putting on the headset and grabbing the controller.  I had to take a a few quick snap.  (never mind his dirty shirt -- he had just finished eating without a bib!)

2007-09-25 001 035

Monday, September 24, 2007

Connector/Net 5.2 now supports batching

Just finished checking in initial support for batching in 5.2.  Even though MySQL doesn't support batching in the protocol, the connector sends updates and deletes in multi-statement fashion (read: sent at the same time but separated by a semi-colon).  For inserts the connector tries to be a little smarter.  If the insert command is simple and uses a simple VALUES(...) block, then it will construct a multi-value INSERT statement of the form INSERT INTO <table> (col, col, ..) VALUES (...), (...), (...).  This is significantly faster for the server than sending the inserts in multi-statement mode.

For those not familiar with .NET, we have an object called a DataTable.  This object contains columns and rows and is what the user uses to insert, update, and delete data on the client side.  When the user wants to update the data on the server, this table (or a series of these tables) is passed to the MySqlDataAdapter.Update method.  A data adapter object holds references to at most 4 different commands, one each for select, update, insert, and delete.

For each changed row in a data table, the data adapter will choose the appropriate command and ask that command to execute giving it the values in that data row as parameters.  A user can set the data adapter's UpdateBatchSize to tell the system how many commands should be sent at one time in a "batch".  Setting it to 0 tells it to send as many as the server will allow.

Batching saves tons of time when you have many rows of the same operation in a data table.  For one it saves on network round trips.  To get an idea of how much faster batching is I ran a simple test.  I inserted 100,000 rows into a data table and then setup a data adapter to do the insert to a database running on Ubuntu in a virtual pc I was running (just so the network round trip wasn't just to localhost).

Without batching:  1 minute 47 seconds

With batching:  4.5 seconds.

Yea.

Friday, September 21, 2007

NCover is now commercial, but friendly to open source

Unless you've been coding under a blogosphere rock  you've heard that NCover has now gone commercial.  NCover has become a staple in many developer toolboxes.  I can understand this move.  People are so busy today that it's becoming increasingly hard to get people to contribute time to a good open source project.  And even fewer contribute money.  Unless you are functionally wealthy (read: actually wealthy or a nothing-better-to-do college kid), finding the time to significantly push projects forward can be daunting.

So the guys behind NCover and NCoverExplorer have banded together and formed a new organization named Gnoso.  Their first product is NCover 2.0 (now up to 2.0.1) and is available in x32 professional and x64 enterprise editions.

While the prices of these two products are fair, I really appreciate their friendliness to open source.  They are offering free pro licenses to developers who fall into one of three different categories:  prior donators, educational developers, or open source developers.  You can read all about it here.

I've got my license.  Have you?

Connector/Net working with Visual Studio 2008 beta 2? Oh yeah!

Microsoft says that Visual Studio packages are binary compatible from 2005 so any packages that loaded successfully into VS 2005 should work in VS 2008.  Err, no.  At least not with VS 2008 beta 2.  I admit it didn't take much of a change to fix things, but it wasn't seamless.

So, I just committed a patch to our trunk repository that enables Connector/Net in VS 2008 beta 2.  Here's a shot of it running.

image

This trunk repository will eventually be our 5.2 release and you can grab a sneak peek by pulling a snapshot from here

Thursday, September 20, 2007

NUnit testing with dynamic configuration files

My use NUnit for all my unit tests in Connector/Net. Over the past few years I've added a few features to my test suite library to make testing easier. One of the better ones I implemented was test subclasses. I had been looking for a way to run my test fixtures multiple times against the same host/database but with different
configuration options. I didn't want to restart the test process because I wanted to collect coverage stats without having to resort to merging multiple output files. Test subclasses handled that nicely.
My most recent test related task was writing unit tests for the web providers we include in Connector/Net 5.1. I had already written some tests but they really needed to be run manually and they included an app.config file that would have to be changed with every release. Here is the app config file I am talking about.

<configuration>
   <connectionstrings>
     <remove name="LocalMySqlServer">
     <add connectionstring="server=localhost;uid=root;database=test;pooling=false" name="LocalMySqlServer">
   </connectionstrings>
   <system.web>
     <membership defaultprovider="MySQLMembershipProvider">
       <providers>
         <remove name="MySQLMembershipProvider">
         <add applicationname="/" connectionstringname="LocalMySqlServer" enablepasswordreset="true" enablepasswordretrieval="false" maxinvalidpasswordattempts="5" minrequirednonalphanumericcharacters="1" minrequiredpasswordlength="7" name="MySQLMembershipProvider" passwordattemptwindow="10" passwordformat="Hashed" passwordstrengthregularexpression="" requiresquestionandanswer="true" requiresuniqueemail="false" type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=5.1.3, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
       </providers>
     </membership>
   </system.web>
 </configuration>

As you can see, this config file directly references not only the testing host and database in the LocalMySqlServer connection string but it directly references version 5.1.3 of MySql.Web (the assembly that houses our providers). I like this to be very automatic so this will never do.

I already have config files that I use for testing against MySQL 4.1, 5.0, and 5.1. All that is included in these files are the port number, named pipe name, and shared memory name (and I could remove these last two and generate them dynamically now that I think about it). I wanted to reuse these config files for my web testing so I started writing code to read these config values in. However I then realized that I had already done this with the base test class in my core assembly test suite. So rather than rewrite that, I added a virtual method named LoadStaticConfiguration (so web tests could extend it) and made the base test publicly acessible.

Now my web test library includes a class named BaseWebTest that extends BaseTest. At this point, all my web testing fixtures inherit the config reading and dynamic database setup that is in the base testing library. However, there was still a problem. My server testing config files didn't include any connection string and membership provider registration (and I didn't want to add it).
Let me explain why these parts are important. The web providers are assemblies that integrate into an existing provider framework provided by .NET. There are static methods that a user can call such as 'Membership.CreateUser(…)' that will use the information found in the config file to know what providers to instantiate and what connection strings to use. I needed to be able to test this type of behavior so the config files are important. Still, I wasn't about to hand update my config files on every product release.

So I decided what I needed was to dynamically update the config system when the test starts up. There wasn't a lot of information in the blogosphere on how to do this so that's why I'm writing this. Here you see my implementation of LoadStaticConfiguration.

protected override void LoadStaticConfiguration()
    {
        base.LoadStaticConfiguration();
       
        ConnectionStringSettings css = new ConnectionStringSettings();
        css.ConnectionString = String.Format(
            "server={0};uid={1};password={2};database={3};pooling=false",
            BaseTest.host, BaseTest.user, BaseTest.password, BaseTest.database0);
        css.Name = "LocalMySqlServer";
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        config.ConnectionStrings.ConnectionStrings.Add(css);
      
        MembershipSection ms = (MembershipSection)config.SectionGroups["system.web"].Sections["membership"];
        ms.DefaultProvider = "MySQLMembershipProvider";
        ProviderSettings ps = new ProviderSettings();
        ps.Name = "MySQLMembershipProvider";
        Assembly a = Assembly.GetAssembly(typeof(MySQLMembershipProvider));
        ps.Type = "MySql.Web.Security.MySQLMembershipProvider, " + a.FullName;
        ps.Parameters.Add("connectionStringName", "LocalMySqlServer");
        ps.Parameters.Add("enablePasswordRetrieval", "false");
        ps.Parameters.Add("enablePasswordReset", "true");
        ps.Parameters.Add("requiresQuestionAndAnswer", "true");
        ps.Parameters.Add("applicationName", "/");
        ps.Parameters.Add("requiresUniqueEmail", "false");
        ps.Parameters.Add("passwordFormat", "Hashed");
        ps.Parameters.Add("maxInvalidPasswordAttempts", "5");
        ps.Parameters.Add("minRequiredPasswordLength", "7");
        ps.Parameters.Add("minRequiredNonalphanumericCharacters", "1");
        ps.Parameters.Add("passwordAttemptWindow", "10");
        ps.Parameters.Add("passwordStrengthRegularExpression", "");
        ms.Providers.Add(ps);
      
        config.Save();
        ConfigurationManager.RefreshSection("connectionStrings");
        ConfigurationManager.RefreshSection("system.web/membership");
    }

Lines 5-11 add our connection string to the connection strings section. Note how we are using String.Format along with the base class defined statics host, user, password, and database0. This one was easy.

Lines 13-31 add our membership provider to the system.web section. The only tricky part is that you have to index into the SectionGroups array with the name "system.web" and then index into that groups Sections array with the name "membership" and then cast the return value to a MembershipSection. Once you have this you can just new up a ProviderSettings class, fill in all the values, and add it to the providers array on the membership section object. One area to note is lines 17 and 18. Remember we want this to be completely dynamic so we use Assembly.GetAssembly to get a reference to the assembly that includes our provider (not ExecutingAssembly since we are currently executing inside the testing assembly), grab it's full name, prefix on our provider class name and use that for our provider type.

Line 33 tells the configuration system to save itself. At this point you might think things should work but they won't. You've changed the values on disk but not what's cached in memory. Lines 34 & 35 take care of that. They simply instruct the configuration system that the next time values from the "connectionStrings" or "system.web/membership" sections are accessed they should be reread from disk.

That's it! Now my web testing framework will work even without a config file. All you have to do is point it at a running mysql instance.

MySQL Connector/Net 5.1.3 RC has been released

Hi,
MySQL Connector/Net 5.1.3 a new version of the all-managed .NET driver for MySQL has been released.

Connector/Net 5.1 represents a change in how we package our products. Until now, we've shipped our core provider and the Visual Studio integration bits as separate downloads. This has become a bit of a problem. Often we would fix a bug that involved changing code both in the VS package and in the core provider. This provided a versioning problem where users would need to upgrade both products to see the benefit of the bug fix. To solve this, we've decided to discontinue Tools for Visual Studio as a separate product and have, instead, integrated it into a new Connector/Net installer. We hope this provides a better "out of box" experience for our users.
All previous versions of Tools for Visual Studio should be uninstalled prior to installing this product.

Version 5.1.3 works with all versions of MySQL including MySQL-4.1,  MySQL-5.0, MySQL-5.1 beta or the MySQL-6.0 Falcon "Preview".  Please be aware that this version is beta quality software and should not be used in production environments.

It is now available in source and binary form from [http://dev.mysql.com/downloads/connector/net/5.1.html] and mirror sites (note that not all mirror sites may be up to date at this point of time - if you can't find this version on some mirror, please try again later or choose another download site.)

For a full list of changes, see the full announcement with change log here.

MySQL Conference and Expo 2008 -- Start planning now!

Yes it's September but it's not too early to start planning on attending the biggest and best conference dedicated to providing you with the very latest and greatest information about the database you either are or soon will be using.

No matter if your second language is SQL, C#, Java, PHP, Ruby, or Boo (!) we'll have something for you.  Or rather you'll have something for all of us!  That's right our conference is great mainly because of great presentations by our users and the 2008 call for proposals is now open!

If you have an interesting story, lesson learned, or are simply an expert in some aspect of MySQL, we want to hear from you.  Hurry, the deadline is Oct 30.  By the way, I'm especially interested in hearing about possible .NET related presentations.  I would love to see talks on .NET 3.0, Silverlight integration, Entity SQL integration, .NET related tools that are built around Connector/Net, and anything else CLR-based! 

So?  What are you still reading for?  Go submit a proposal today and hopefully I'll see you there!

Monday, September 17, 2007

iPods on Linux

Miguel seems to be quite perturbed that Apple would change existing iPods or new iPods in such a way as to make them not function with Linux.  As I understand it, they [Apple] are adding some type of hash generation to new and existing iPods (through a firmware upgrade) and to the latest build of the iTunes software.  Client software has to generate a matching hash before it can access the music library on the device.

Miguel calls this anti-competitive.  He's right.  He then calls it an unfair business practice.  He's wrong.  First, I seriously doubt this move by Apple has anything to do with Linux.  Apple simply cannot be worried about such a minority.  Second, let's agree that this has nothing to do with the iTunes license agreement since a user could easily purchase an iPod and plan to use it without ever installing iTunes or agreeing with their license.

Apple is free to make their iPods and their software as they see fit.  You may not like it and it may not be smart business on the part of Apple, but that's not the point.  Your only option is to either legally look for a workaround or use a different product.  It now seems that some clever hackers have discovered the hash algorithm and, once again, unlocked the iPods for use on non-iTunes clients (remember we stopped believing it's just about Linux).

Don't get me wrong.  I fully support use of the iPod on any client software you wish and hope someone out there is able to crack the hash every time it's changed.  I just needed to be the voice of reason here and remind everyone that this is not a legal matter or governmental matter.  There are lots of options out there for music players so this is a truly free market.  If the leader does something you don't like, just use a different product.

Maybe I should call my senator because my XBox media center software doesn't work with Vista (I don't remember agreeing to a license that forbid that)?

Thursday, September 13, 2007

Compiled faster than scripted? Huh. Imagine that!

Just read this article about running PHP applications on Phalanger and found it greatly interesting that PHP apps are often quite a bit faster running on Phalanger than on the Zend engine.  In fact the article states that phpBB serves up pages twice as fast from Phalanger than from Zend.

Also interesting is the existence of a managed MySQL extension for Phalanger.  This appears to be based on libmysql however.

Phalanger works great on .NET but also works on Mono.  This makes it very easy to use C# (or any other CLR language) to write some layers of your app, like data access code, while allowing you to write the UI in PHP.  With Phalanger you use the full range of managed components like Connector/Net, LinQ, generics, custom attributes, events, and others.

Friday, August 24, 2007

MySQL Connector/Net 1.0.10.1 has been released.

MySQL Connector/Net 1.0.10.1 a new version of the all-managed .NET driver for MySQL has been released.  This is a bug fix release for the current production branch of Connector/Net.  Version 1.0.10.1 is suitable for use with any MySQL version including MySQL-4.1, MySQL-5.0, MySQL-5.1 beta or the MySQL-6.0 Falcon "Preview".
It is now available in source and binary form from the Connector/Net download pages at http://dev.mysql.com/downloads/connector/net/1.0.html and mirror sites (note that not all mirror sites may be up to date at this point of time - if you can't find this version on some mirror, please try again later or choose another download site.)

You can find the release announcement in our forums with a complete change log here.

Tuesday, August 21, 2007

No half installs. Sometimes...

One of the big reasons to use MSI-based installers, as the story goes, is that the entire install is handled inside a transaction.  Either the entire install succeeds or fails as a unit.  This prevents an installer from failing halfway through and leaving the product half-installed.  Well, no.  Not quite.

Recently I was testing a small change to our WiX-authored installer.  The change caused the installer to fail and the installer dutifully rolled back and declared that no changes had been made to my system.  One of the things that the installer was supposed to do was register a .NET assembly in the GAC and then run installutil on the assembly to execute it's Installer-based classes.  It was this installutil step that failed.

I made sure that the assembly that was headed to the GAC was not already registered before running the installer.  Guess what I found after the installer failed and notified me that 'no changes had been made to my system'?  Yup.  There was my assembly registered in the GAC. 

I asked about this on some lists and found out that MSI-based GAC installation happens after the InstallFinalize option and is therefore not part of the transaction.  Hmmm.  That's all well and good but when the installer clearly tells me that my system has not been changed, I would like to trust it.

Just another example of what we want not matching what happens, here in Microsoft world.  :)

*UPDATE*

Turns out this was caused by a problem in my WiX code.  I had mistakenly scheduled my CustomAction to execute after InstallFinalize.  Anything that happens after the install is finalized will most certainly not be rolled back. 

MySQL Connector/Net 5.0.8 has been released

MySQL Connector/Net 5.0.8 a new version of the all-managed .NET driver for MySQL has been released.  This is a bug fix release for the current production branch of Connector/Net.  Version 5.0.8 is suitable for use with any MySQL version including MySQL-4.1, MySQL-5.0, MySQL-5.1 beta or the MySQL-6.0 Falcon "Preview".


It is now available in source and binary form from the Connector/Net download pages at http://dev.mysql.com/downloads/connector/net/5.0.html and mirror sites (note that not all mirror sites may be up to date at this point of time - if you can't find this version on some mirror, please try again later or choose another download site.)


We moved to a new installer technology for this release.  Please let us know what, if any, problems you have with it.

The full release announcement with change log can be seen in our .NET forum here.

Wednesday, August 15, 2007

Where did my machines go?

I have an install of Windows Server 2003 setup under Virtual Server 2005.  I use this image for continuous integration of my Connector/Net products.  The host machine is running Vista x32 Ultimate. 

I'm not sure if its because it's on Vista but any virtual machines I add would disappear following a reboot.  Not only that but attempting to re-add the machine would give an error indicating that the machines configuration was already present and could not be added again.  Fun.

There's an easy solution though.  Just move your machine images into the default search path for Virtual Server.  On my machine that's C:\Users\Public\Documents\Shared Virtual Machines.  If you've already worked around this by renaming your .vmc file a few times, you can clean out those old configurations by deleting appropriately from C:\ProgramData\Microsoft\Virtual Server\Virtual Machines.

[BTW, I'm using Virtual Server because VMWare Server doesn't support Vista.  And, yes, I know that some have got it to work but it's not supported.]

Monday, August 6, 2007

It lives! It lives!

My SMT 5600 died two week ago.  This is an awesome little phone.  Much better than the Cingular 2125, runs Windows Mobile, small and fast.  And two weeks ago mine had a lovely while LCD screen.  You could vaguely make out what was happening on screen which means the phone wasn't entirely dead.  You could still make and take phone calls.  Just don't try using the menus or looking up a contact.  And, yup, out of warranty.

So.....  off to eBay I go.  Picked up a non-working model on the hope that the LCD was still good.  Cost me $24 after shipping but turned out to be worth it.  I used these excellent directions for disassembling the phone and it took me all of about 30 minutes to swap out the screens.  Man was I happy to see color when I powered it on.

Wednesday, July 25, 2007

Migrating SQL Server 2005 with the Migration Toolkit

I have a small website that I've built for my wife who is a realtor.  It's a simple site that tracks properties, showings, etc and it was built using ASP.Net and Sql Server.  Recently I decided to move it to Connector/Net and MySQL 5.1 so I needed a way to migrate the data.  Enter the MySQL Migration Toolkit.

This is a terrific tool that can migrate data from various databases into MySQL.  My SQL Server instance was setup to support mixed mode authentication and I had enabled the SQL Server Browser service and the TCP/IP protocol so I didn't anticipate any problems.  I was almost right.

The one thing that tripped me up was that I was using a named instance with SQL Server.  My instance was named SQLExpress so the hostname of the instance was .\SQLExpress.  The problem is that the JDBC driver that the toolkit uses doesn't accept that as a hostname.  To get it to work you have to enter a custom JDBC connection string and give the instance name as a property at the end of the string.

Once that was done the migration worked reasonably well.  A couple of tables generated syntax errors but I've been told that bug has been fixed and I  had to manually migrate my single stored function and single view.  Even with that, the toolkit saved me quite a bit of time.

Tuesday, July 24, 2007

Outlook style threading in Thunderbird

Unless you are tethered to Exchange, there really is no reason to use Outlook.  It's big, bloated, and, with the 2007 release, ridiculously slow. 

Still, there's always been one aspect to how it threads email messages that I liked.  When you viewed messages by conversation, it would bubble threads to the top when new messages for that thread arrived.  This had the effect of letting me see the freshest threads at the top of the stack.

Thunderbird is a far more capable email client but I've always disliked the fact that it orders the threads by the date of the first message in each thread.  Unless you are very organized and keep your inbox clean, you can easily lose messages when they are part of a very old thread.

It turns out that Thunderbird can sort messages the same way as Outlook.  The key is to tell each view to sort by date instead of order received.  Sorting by date will sort by the date of the last message in each thread while sorting by order received will be based on the date of the first message in each thread.  You can then choose ascending or descending on that same sort menu.  Now if I can just get a stable Outlook <-> Google calendar sync program running I will have no reason to run Outlook 2007 at all.

Friday, July 20, 2007

Trust the docs, except when they are wrong

I've been getting quite a few reports that my 5.0 and 5.1 installers don't work on Vista.  The reports all say that near the end of the install, it errors out with an error code of 2869. 

As a side note, I have yet to have an MSI error code that had a description that I  understood.  The description is almost always something like 'The transaction failed to start'.  These descriptions don't tell me anything.  But I digress.

This 2869 issue was hard to reproduce and very random.  After some work I found a 32 bit Vista machine that showed the problem.  With some trial and error and installutil style debugging I discovered that the problem was in my custom installer class.  Inside the MySql.Data assembly, we have a custom installer class that does two things.  First it adds the assembly to the system's machine.config file and then it adds a couple of performance counters.  With some additional testing, I found that the performance counter code was failing. 

The code calls PerformanceCounterCategory.Exists() to determine if the category already exists.  This call was throwing a FormatException with the message 'The input string was not in the correct format'.  Now if I check the handy dandy docs for this method, it clearly tells me that this method might throw one of three exceptions (ArgumentNullException, ArgumentException, or Win32Exception).  How is anyone supposed to make sense of a FormatException that is generated deep inside the bowels of the framework? [This is the reason for the blog title, BTW]

I found a blog post that referred to using the PerformanceCounterInstaller class.  The surface area of the .NET framework never ceases to amaze me.  I've been using it now for > 4 years and I still discover new classes almost weekly.  Thinking I had solved my problem, I replaced my code with calls to this new class.  Nope.  Still the error remains.  Back to Google.

Finally I discovered others who had this problem and found out that the registry information for the performance counters can become corrupt and read about the 'lodctr' tool.  This tool has a parameter (/R) that restores the registry settings either from a file or from the system store.  Running lodctr /R on the affected systems rolls the perfmon registry settings back to the latest system store but solves the FormatException problem when trying to install new performance counters.

Who builds this stuff?

No matter what system you run there are areas that just don't make any sense.  I love Visual Studio and will argue with anyone that it's the best way to develop traditional platform applications.  That being said, it's help system is quite ridiculous.

You would think that a company that is so focused on developer productivity would make it trivial to integrate third-party documentation.  The pages of the documentation are all just HTML files.  Each documentation package might contain some indexes but on the whole it's just HTML.  Here's an idea.  Just make the help format a zip archive and inside this zip you layout the HTML in whatever tree structure you like.  Include whatever scripts, CSS, or binary content you like.  Any top level pages that should not appear in the TOC can be listed in some .exclude file.  There can be a file that lists the name to file indexes.  All of this could then be neatly compressed inside a zip archive.

Anyway, I didn't  use Robohelp or any other commercial product.  Instead I used Sandcastle and the excellent NDoc replacement Sandcastle Help File Builder.  This tool works with the latest Sandcastle bits and builds both CHM and HxS style help files.  While SHFB allows me to integrate additional HTML content, the current version (1.5.0.1) has a bug that keeps it from being able to generate a root namespace.  I wanted my namespace documentation to be listed under a node named 'Reference'.  Luckily this project is open source and Eric has already made available a patch that fixes this issue.

The next problem was that the normal VS2005 Help Merge Module project would not integrate the generated HxS correctly.  I tried other Sandcastle generated files and they worked ok but mine simply refused.  I would up using the terrific FAR tools to hand tweak the collection files to get my table of contents working right.

The next thing I have to work on is integrating the Connector/Net portions of our online manual.  I've already discussed this with our docs team and we think we have an approach.  Wish us luck.  ;)

Blog Moved!

I have officially moved my blog from www.bytefx.com/blog to www.reggieburnett.com.  Please update your links, bookmarks, readers, etc.  I have attempted to preserve as many of the old dasBlog URLs as I can but I know of at least 3 URL types that are not working currently.  I'll try to get those working over the weekend.  If you find any old URL that is not working, please drop me a line so I can fix it.

Thanks!

Oh yeah!

I had been thinking of moving my blog for some time now.  I started my blog back when I was self-employed and operating under the corporate name ByteFX.  I have been employed by MySQL now for more than 3 years and been blogging about all things .NET and MySQL at my ByteFX site.  While technically there is nothing wrong with this, it always felt wrong to me to blog about my efforts at my current employment under a different corporate website.  The domain name 'reggieburnett.com' was available so I jumped.

GoDaddy.com offers some very cheap Windows hosting so I decided to host my new site and blog there.  They offer a very professional setup and the only real hang up was that my site had to be medium trust compatible.  dasBlog, my current blog software of choice, is not.  So I made the move to Subtext, a BSD-licensed fork of .Text.  It's simple, SQL-based (soon to support MySQL), includes a photo gallery, and works under medium trust.  Sold.  Now I need to move my current blog to Subtext.  Here's where the rubber meets the road.

While Subtext can import BlogML data, dasBlog doesn't support BlogML export.  After asking on the dasBlog mailing list, I found a blog post here that includes a BlogML import/export tool.  After a few tweaks, I managed to generate a fairly large BlogML file that imported cleanly into Subtext.  I also found this page that I basically followed the rest of the way home.

A few support calls to GoDaddy.com, a few code changes to the IHttpHandler included on the referenced page, and I had my old blog moved over and most old dasBlog links working.  I still don't have CategoryView, month view, or default.aspx#{guid} style urls working but I'll hack on those tomorrow.

I'll send out a separate (and more brief) announcement but my blog has officially moved from www.bytefx.com/blog to www.reggieburnett.com.  Please update your bookmarks and reader subscriptions appropriately.  Thanks!

Saturday, June 23, 2007

KISS #5

This will be my last entry for a few days (probably more like a week).  I'm the scoutmaster of troop 440 and we're attending summer camp next week so I will not have much time available to email and blogging.  However, KISS #5 happened last night while I was activating my kids Vista computer.

The whole idea is that any message, error or otherwise, needs to be understandable by the average user.  This is the main reason why Linux will not get any serious traction on the desktop.  The gear heads that use it can't stand to dumb down the interface of their baby and the current Linux desktop experience is just to complex.  If the user has to know what a swap partition is or that a file named ifconfig even exists, then it's too complex.  But I digress.

So last night Katie (my daughter) tells me that her computer is broken.  Thinking that's odd since I just built it, I asked her what it's doing.  She says it's telling her that she needs to activate it.  No problem.  I go upstairs and activate the computer (activation might be a KISS entry at some point but not this time).  While I'm there I see an icon for Age of Mythology on her desktop.  That's a terrific game that my son plays on the same computer.  Knowing that she never plays it and the icon was placed there because the game did an 'all users' install, I drag the icon to the trash.

Bam!  Kiss, right on the mouth.  :)  Let's skip past the fact that it stupidly asked me if I really wanted to throw it away and fast forward to the next dialog which was a UAC prompt asking for my password.  Huh?  I'm logged in as Katie, looking at Katie's desktop, and throwing away an icon that is sitting on Katie's desktop.  And I'm not allowed to do it.  How in the world can my 11-year old understand this kind of crap. It's hard enough to get her to understand why I had to move Sims into her profile directory to get it to run (it was attempting to write back to the program files folder).

This utterly ridiculous.  I realize that the game ran as admin and therefore the icons created by it are owned by admin however a user should have complete and total control over their own desktop.  If I want to throw away something sitting on my own desktop, Vista should have nothing to say about that.

And that, my friends, is KISS #5.  See you next week.

Friday, June 22, 2007

KISS #4

This is really too easy.  Finding stupid and idiotic things about Vista is really just too easy.  This installment is not about any type of GUI but rather with the lack of secure inter-machine remoting capability.

Here at MySQL we have several Windows virtual machines setup to perform builds and tests of both our server code and our connectors.  Our builds are automated to be sure but our build engineers still need to "shell" into a remote box to perform some functions.  As any reasonable group would, we use ssh authentication for both our Linux and Windows boxes.  The problem, of course, is that no edition of Windows has shipped with a secure shell server or client.  Our build team is left with only a few alternatives and they have chosen to install cygwin on the Windows boxes.  Considering that cygwin has only recently become stable on 64 bit systems, this was shaky at best.

Now I realize that ssh networking is cutting edge technology <grin>, but Microsoft either doesn't realize that no one is using telnet anymore or they are delusional enough to think that no one really needs to shell to a remote command prompt.  Either way,  it's KISS #4.  Here's to you, Microsoft.  Keeping it simply stupid.

Wednesday, June 20, 2007

KISS #3

So Vista has this "great" new feature called UAC which allows a user to run as a standard user until he or she needs elevated permissions at which point the system will prompt either for an administrator's password or for your consent if you are already an administrator.  Everyone seems to generally hate it but we seem to be stuck with it.  In any case, that's not what this post is about.

Those of  you who are software developers know that we often need to set environment variables for ourselves.  We use BitKeeper for source control so I need a BK_USER environment variable.  I also often need to add things to my path.  So what could be wrong with this?  Oh, let me count the ways.

First, environment variables for the currently logged on user are not properties of the computer.  Computer properties would be computer name, description, performance settings, etc.  However, the first way you get to the place where you can set environment variables is by right clicking on the computer icon and selecting properties.  You can also get to it by going to your control panel and choosing the System and Maintenance area and then the System area. 

Second, getting to the area where I can set my environment variables requires no less than 4 mouse clicks (assuming UAC is active) and one screen flash due to UAC.  Nasty.

Third, because the area where we set environment settings is tucked inside a dialog that is also full of system wide settings, we must suffer through UAC just to set our own environment settings.  Let me say that again.  Your account must be elevated to administrator level to set your own environment settings.  Keep It Simply Stupid.

KISS #2

Well, I'm already behind but managed to find time to get KISS entry #2 out.  This is a fairly easy one and one that I've blogged about before.  Consider this screenshot of my installed programs.

image

Applying the KISS principle to software installation (as Apple generally does) would mean that a single icon would indicate that a piece of software is installed and dragging that icon to the trash would either complete the uninstall or at least start the process.  But, as we've already discovered, Microsoft believes in the secondary KISS meaning (Keep It Simply Stupid).  The installation of Visual Studio 2005 does not produce a single icon but instead we get a whole series of things that are installed.

What in the heck is 64 bit Prerequisites?  Sure, I know technically what it is but why on earth is it a separate item here (and please don't give me some lame answer as it coming from a different group and being it's own MSI).  Am I really anticipating uninstalling or upgrading that item in isolation.  I don't think so.  Microsoft treats this list as a hard list of actual components that are installed rather than a nice, user-friendly list of applications that are installed.

Microsoft could easily have made it possible to double click an application icon in this list and see a list of components that make it up.  That list for VS 2005 might have included the prereqs, the remote debugger, the J# redist package, etc, etc.  It's really quite comical to read the setup instructions for new beta builds of Visual Studio and see that you have to remove previous beta bits in precisely the right order or things might not work right.  The list of things you have to manually remove is huge.

The whole idea behind software package management is that you can at least attempt to remove any package and, if it succeeds, your system is still in a usable state.  Try removing the 64 bit Prerequisites.  It will genuinely attempt to uninstall even though doing so would leave Visual Studio still installed but crippled. 

Simply stupid.

Tuesday, June 19, 2007

Long overdue...

Way back in February I gave a webinar on using our Visual Studio integration product with MySQL.  At the time, our code did not integrate very well with the TableAdapter wizard.  To be precise, you really couldn't use stored procedures with a table adapter at all.  During the broadcast, someone asked me about using stored procedures and I told him that I would blog about it once I got it working.  Well, here we are.

Actually, we've had it working for a couple of weeks now but I'm just now getting to the blog post.  You know how it is.  There were several problems at play here but the biggest issues were the fact that we needed to provide an enumerator object for columns that would be returned by a stored procedure.  The second issue was needing to use the DbProviderSpecificTypeProperty attribute on our provider specific type property on the parameter class.  Let's look at each one of these in more detail.

During the TableAdapter wizard, there is a page where you select the procedures you want to use for each operation (select, update, insert, and delete).  Once you choose the procedure for the select operation, the wizard wants to enumerate the columns that will be returned from this procedure.  It does this because, later, it will want to map parameters to the other procedures to these columns.  To support this, we needed an enumerator object.  MySQL doesn't have the ability to execute a procedure but only return the metdata without making any other changes.  Therefore, when we execute the procedure to return the metadata, any other changes the procedure makes will happen.  So it is important to not do anything in this procedure except return the required columns.  Don't write any logs, update any counts, etc.

The second issue was the wizard was unable to properly determine the types of the parameters.  This is typical Microsoft since the provider includes a parameters schema collection that provides all this information.  That's too easy.  Instead the wonderful designers at Microsoft created a new attribute named DbProviderSpecificTypeProperty.  This allows the wizard to reflect on the parameter class, determine what property should be set with the provider specific type value, and set it.  It could have  used the generic DbType property but I guess that's just too easy.

So, to sum up, Connector/Net 5.1.2 now includes the full ability to use stored procedures to manage the data in a datatable or dataset.

Monday, June 18, 2007

VI for Visual Studio

Not sure why you would want to but I've had several people ask me about VI emulation under Visual Studio.  Yes, Virginia, it exists.  Check it out here.  Will set you back $70 but if you really need it....

Apple understands - KISS #1

This is a post I've been thinking about for nearly a week.  It started about the same time I downloaded Safari for Windows.  I've never used Mac OS X for any extended period of time but I've tried to study how they develop their features.  Coming from the Windows camp, I can tell you that neither Tiger nor Leopard really does much of anything that Vista doesn't do.  And I'm not the only one thinking this either.  However, that really is not the point.  It doesn't matter how advanced a piece of software is; it only matters that the software does what the user expects and be easy to use.  Both the designers and developers at Microsoft need to reread that last sentence again.  Want some examples?

1) Take a look at this post by Scott Hanselman.  I dare you to find any dialog box in Mac OS X that looks like this.

2) Take a look at these option pages from Safari and IE7.

image 

I realize that IE7 has more capabilities than Safari (add-ons, etc) and thus more options, however this first page of each browser's options dialog just shows the difference in thinking. The only thing I can do directly from this dialog in IE7 is set my home page.  With Safari, I can do tons of things.  I can set what browser is default, what search engine is default, what my home page is, where my downloads go, etc, etc.  Microsoft shows a complete inability to try something radically new in user interface design. 

It seems that Microsoft is just one letter away.  Instead of Keep It Simple Stupid, they must think it stands for Keep It Simply Stupid.  With that said, this post starts my 10 days of Microsoft UI stupidity.

Friday, June 15, 2007

Turning off pingback and trackbacks.

We live in a world full of truly lousy people.  I know this based on the amount of porn pingback and trackbacks I'm getting on this blog.  I don't yet know how to solve this so, for now, I'm turning those off.

Finally got the site updated to DNN 4.5.3

I've had the site turned off for sometime now.  I just redirected requests for www.bytefx.com to www.bytefx.com/blog.  However, I've been interested lately in putting up some new content so I decided to reactivate the site and thought it would be a good idea to move to the latest version of DotNetNuke.


Well, the first attempt left the side disabled giving some error in the version 4.4 db script about an integer value.  I was  unable to find the error in the log so I'm not sure what the problem was.  So, from there I manually deleted all the database tables and procedures and attempted to setup the "New Install" package of DNN.  Same problem.  Frustrated and wondering if Community Server would setup easier, I tried one last time.  This time I set the objectQualifer to 'dnn4_'.  This is the string that will be prefixed to all database objects.  And that was the magic that got  my site online.


The next step was to reenable my blog (which is powered by dasBlog and sits in a child web named 'blog') and a second child web that I built for my wife.  A few carefully added lines in the child web's web.config got that going.  I had to remove all the DNN namespaces, remove some httpModules, and remove some httpHandlers.  If anyone needs the specifics, I can email it to you.


Now all I need is some new content.....

Wednesday, June 13, 2007

MySQL Connector/Net 5.1.2 Beta has been released

MySQL Connector/Net 5.1.2 a new version of the all-managed .NET driver for MySQL has been released.

Connector/Net 5.1 represents a change in how we package our products. Until now, we've shipped our core provider and the Visual Studio integration bits as separate downloads. This has become a bit of a problem. Often we would fix a bug that involved changing code both in the VS package and in the core provider. This provided a versioning problem where users would need to upgrade both products to see the benefit of the bug fix. To solve this, we've decided to discontinue Tools for Visual Studio as a separate product and have, instead, integrated it into a new Connector/Net installer. We hope this provides a better "out of box" experience for our users.

All previous versions of Tools for Visual Studio should be uninstalled prior to installing this product.

Version 5.1.2 works with all versions of MySQL including MySQL-4.1, MySQL-5.0, MySQL-5.1 beta or the MySQL-6.0 Falcon "Preview". Please be aware that this version is beta quality software and should not be used in production environments.

It is now available in source and binary form from [http://dev.mysql.com/downloads/connector/net/5.1.html] and mirror sites (note that not all mirror sites may be up to date at this point of time - if you can't find this version on some mirror, please try again later or choose another download site.)

Issues fixed

  • Fixed integration with the Website Administration Tool.  Before this fix, the test link was visible but did not work and  user management did not work.
  • Reintroduced code to properly return field values as byte[] when the binary flag is present. (See release notes)
  • Fixed problem preventing the DataSet Designer or TableAdapter wizard from being able to generate insert, update, and delete statements. (Bug #26347)
  • Fixed problem preventing use of stored procedures for insert, update, and delete statements in a table adapter.
  • Fixed problem where text columns would not appear in the Visual Studio query builder (Bug #28437)

Bugs fixed in 5.0.8 that are now appearing in 5.1.2

  • Log messages are no longer truncated to 300 characters (Bug #28706)
  • Fixed a problem with compression over a network.  We were letting the inflate stream read directly from the network stream.  Under certain situations, two bytes were being left unread and this messed up our byte counts.  Now we are using a WeakReference to an internal buffer that we read the compressed data into before inflating. (Bug #28204)
  • Fixed problem where we were not closing prepared statement handles when commands are disposed.

Where to get information

.NET forum: [forums.mysql.com]
.NET mailing list: [lists.mysql.com]
Reggie's blog: [www.bytefx.com]
Planet MySQL: [www.planetmysql.org]

As always we thank you for your use of our products and keep those bug reports coming!

Monday, June 11, 2007

Found this great memory stress tool -- called Safari

So I was surfing around Apple's website this afternoon and found this new Windows download called Safari.  Wondering what it is I downloaded and installed it.  Turns out it's a great memory stress tool.  Check out this screenie of it using nearly 300 megs on my Vista x64 system.

image

This is great!  I was able to see how all my other apps work in low memory situations.  As useful as that is, right before I was going to write this blog entry I discovered this wonderful app also renders web pages.  Holy cow!!  This is too much.  What are those Apple guys going to think of next?

Saturday, June 9, 2007

Use String.Compare -- sometimes

I recently came across this blog post on using String.Compare instead of the tried and true method of converting one string to lowercase and comparing to a known lower case value.  It's important to remember that strings in .NET (as in Java) are immutable so the act of lower casing a string will always make a new string.  The memory subsystem for .NET is turned for  handling lots of small objects but the fewer objects you create, the fewer that have to be checked and managed by the garbage collection system.

Still I wondered what the time difference would be between the two approaches.  So I setup a very simple test where I compared the string "FooBar" to a string variable that contained the value "foobar" one million times.  The first test used the approach of lowercasing the first string and then doing a simple equality comparison.  The average time spent for the entire loop was like .12 seconds.

The second comparison was to use String.Compare("FooBar", s, true) where s had the value "foobar" and true means to do a case insensitive comparison.  The average time spent in the loop was .10 seconds.  From this we can deduce that we should always use String.Compare right?  After all it's faster and definitely consumes less memory.  Well, not always.

My next test was a common scenario where you compare a value to a series of known values.  In this test, my input was the value "FooBar2" and I compared to "foobar", "foobar1", and "foobar2".  With the first test, I converted it to lower case just once and then did the comparisons using a series of if/else statements.  Time in the loop was .19 seconds.

The second test used String.Compare for each one of the if statements.  Time in the loop was .34 seconds.  So if you are doing a single string comparison, then String.Compare is your friend.  If you are doing a series of comparisons, then use a switch statement or the lowercase approach if speed is your concern.

Friday, June 1, 2007

Looking a gift horse in the mouth

I've been following the comments to Jamie's latest post and I have to say that most of the people who left comments are not thinking logically about this.  Most (not all) are outraged that Microsoft would try to prevent Jamie from enabling his most excellent TestDriven.Net product on the Express line of products (Visual C# Express, etc).

As a consumer I would love to be able to use plugins in the Express products.  I use Visual C++ Express to code on the MySQL server frequently.  However, I'm smart enough to realize when I've been given something for free. Let me say this slowly and clearly:  Microsoft is a business, not a public service.  They didn't have to make the Express products available at all.  It takes a great deal of time and money to build something as complicated as these products.  To my way of thinking, they made a reasonable request.  Use our free products for as long as you want.  If you want to use extensions, then buy our full product.

There are many companies (including us) that look for ways to differentiate between a free product and a for-pay product.  I guess these people think that Microsoft shouldn't have any for-pay products.  Why doesn't Microsoft just give away Vista and Office too!  After all, I'm a consumer and I want that.  That's all that really matters, right?

Thursday, May 31, 2007

New version of Windows Live Writer

You can see the announcement here.  Some pretty nice new features but what I love is the very non-intrusive install experience.  This team continues to do great work and it looks like it's carried over to Windows Live Mail.

Wednesday, May 30, 2007

Interim builds available for Connector/Net 5.1

We are happy to announce that we have now enabled interim snapshots for Connector/Net 5.1.  It can be found at http://downloads.mysql.com/snapshots.php.


These will not currently update nightly.  In the future, we hope to enable nightly uploads of snapshots.  In the meantime, please take care when using these builds.  They are snapshots directly out of our development trees and are not guaranteed to function at all.  They are intended simply to give users and customers an advance look at what is coming in future released versions.
Thanks!

Can't kick the habit, huh?

Anyone else think it's funny that MS used flash for their Surface website and not Silverlight?   :)

Wednesday, May 23, 2007

MySQL Connector/Net 5.1.1 has been released

 

MySQL Connector/Net 5.1.1 a new version of the all-managed .NET driver for MySQL has been released.

This is a big release and represents a change in how we package our products. Until now, we've shipped our core provider and the Visual Studio integration bits as separate downloads. This has become a bit of a problem. Often we would fix a bug that involved changing code both in the VS package and in the core provider. This provided a versioning problem where users would need to upgrade both products to see the benefit of the bug fix. To solve this, we've decided to discontinue Tools for Visual Studio as a separate product and have, instead, integrated it into a new Connector/Net installer. We hope this provides a better "out of box" experience for our users.

All previous versions of Tools for Visual Studio should be uninstalled prior to installing this product.

Version 5.1.1 works with all versions of MySQL including MySQL-4.1, MySQL-5.0, MySQL-5.1 beta or the MySQL-6.0 Falcon "Preview". Please be aware though that this version is alpha quality software and should not be used in production environments.

It is now available in source and binary form from [dev.mysql.com] and mirror sites (note that not all mirror sites may be up to date at this point of time - if you can't find this version on some mirror, please try again later or choose another download site.)

Bugs fixed:

  • Fixed password property on MySqlConnectionStringBuilder to use PasswordPropertyText attribute. This causes dots to show instead of actual password text.
  • Fixed problem with pooling on the compact framework. It should work now.
  • Install now calls VS setup only when VS integration is selected. (bug #28260)
  • MySqlRoleProvider.GetRolesForUser now works correctly (bug #28251)
  • Installer now adds a default connection string to machine.config. This will prevent errors related to a missing connection string. You will need to override this value in your web.config files.
  • Changed installer to only give option to install Visual Studio integration if Visual Studio 8 is installed

(Bugs fixed in 5.0.7 that are now appearing in 5.1.1)

  • Bug #27765 Logging does not work
  • Bug #27679 MySqlCommandBuilder.DeriveParameters ignores UNSIGNED flag
  • Bug #27668 FillSchema and Stored Proc with an out parameter
  • Bug #28167 Poor performance building connection string (thanks Maxim!)
  • Bug #26041 Connection Protocol Property Error in PropertyGrid Control
  • Bug #26754 EnlistTransaction throws false MySqlExeption "Already enlisted"
  • Bug #23342 Incorrect parsing of Datetime object for MySQL versions below 4.1

 

Where to get information.

.NET forum: [forums.mysql.com]
.NET mailing list: [lists.mysql.com]
Reggie's blog: [www.bytefx.com]
Planet MySQL: [www.planetmysql.org]

As always we thank you for your use of our products and keep those bug reports coming!

Friday, May 18, 2007

This will be huge

It's not new (Yahoo! Pipes is already there) but the Visual Studio integration is the kicker.  Check it out:  http://www.popfly.ms/Overview/

Connector/Net 5.0.7 has been released

Hi,

MySQL Connector/Net 5.0.7 a new version of the all-managed .NET driver for MySQL has been released.

This is a bug fix release for the current production branch of Connector/Net.

Version 5.0.7 is suitable for use with any MySQL version including MySQL-4.1, MySQL-5.0, MySQL-5.1 beta or the MySQL-6.0 Falcon "Preview".

It is now available in source and binary form from the Connector/Net download pages at http://dev.mysql.com/downloads/connector/net/5.0.html and mirror sites (note that not all mirror sites may be up to date at this point of time - if you can't find this version on some mirror, please try again later or choose another download site.)

Bugs fixed

  • Bug #27269 MySqlConnection.Clone does not mimic SqlConnection.Clone behavior
  • Bug #27289 Transaction is not rolledback when connection close
  • Bug #26147 "User Id" problem during connection creation
  • Bug #27240 Property value characterset not retrieved/fetched in conn wizard
  • Bug #25947 CreateFormat/CreateParameters Column of DataTypes collection incorrect for CHAR
  • Bug #27765 Logging does not work
  • Bug #27679 MySqlCommandBuilder.DeriveParameters ignores UNSIGNED flag
  • Bug #27668 FillSchema and Stored Proc with an out parameter
  • Bug #28167 Poor performance building connection string (thanks Maxim!)
  • Bug #26041 Connection Protocol Property Error in PropertyGrid Control
  • Bug #26754 EnlistTransaction throws false MySqlExeption "Already enlisted"
  • Bug #23342 Incorrect parsing of Datetime object for MySQL versions below 4.1

Other changes

  • Installer now works if XML comments are found in machine.config
  • GetSchema will now attempt to unquote identifiers passed in as restrictions
  • The MySqlCommand object now properly clones the CommandType and CommandTimeout properties

Thanks for trying out this release.

Reggie

MySQL

Friday, May 11, 2007

DbConnectionStringBuilder and the property grid control

This may be obvious to some but it wasn't to me so I thought I'd write about it.  Recently I discovered a problem with our implementation of DbConnectionStringBuilder.  Whenever you changed a field that took a string (i.e. character set or server), the connection string property would not update.  I know the changes were applied because I developed a test application that queried the connection string.  It was correct even though the UI of the property grid was not. 

After an embarrassingly long time working on this I emailed a friend of mine who I felt would know the answer.  Turns out he didn't but he knew someone who did and not more than 30 minutes after talking with him I had my answer.  Each property of MySqlConnectionStringBuilder needs to be decorated with the RefreshPropertiesAttribute.  This causes the property grid to refresh itself when they change.

Retrieving autoincrement field values

Often people ask me how to retrieve the value of an autoincrement column when they are using the MySqlCommandBuilder object.  Generally this is done by appending something like ";SELECT last_insert_id()" onto the generated insert command text.  Command builder objects usually provide some type of syntax where a user can indicate that they want this to be done.  Connector/Net 1.0 had some syntax for this but starting with Connector/Net 5.0 that all changed. 

With the new ADO.Net 2.0 API, Microsoft did not directly provide for any type of API that users could use for selecting this.  With ADO.Net 2.0, there are two things that need to happen.  First, a SELECT statement similar to above must be attached to the INSERT command.  Second, the command object must have its UpdatedRowSource property set to Both or FirstReturnedRecord.  What this does is tell the data adapter update engine to take the first returned row and merge it's values back into the changed row.  So, if the first returned row is the result of a 'SELECT last_insert_id()', then the generated key will be returned and merged back in.  Good, huh?

Not so fast.  The UpdatedRowSource property exists on the command object.  The whole point of using MySqlCommandBuilder is to not mess with command objects.  Everything should be handled automatically with as little code as possible.  To this end, we've added a custom property to MySqlCommandBuilder called ReturnGeneratedIdentifiers.  By setting this property to true, the proper select statement will be included and the generated command object will have its UpdatedRowSource property set.

Saturday, May 5, 2007

VMWare 6 rocks

So I've been using Virtual PC 2007 since it was released but was always frustrated with its inferior Linux support.  I don't really understand why Microsoft drags their feet on this.  With more and more devs moving to vm only development, it's getting easier and easier to change your host platform and still development for Windows.  I'm sure Microsoft would much rather you run Windows as your host platform and run Linux in a vm when you need.   I've tried VMWare Server but since I run Vista x64 as my host, that's more pain than I really like.

Enter VMWare 6.  Sure it installs and runs on Vista x64 like a champ and performance seems great but what really blew me away was the multi-monitor support.  I've been using twin 19" monitors for nearly 2 years now and I simply can't imagine life without them.  Folks I kid you not.  It was easier to get Ubuntu running on two monitors using VMWare 6 than it was running on my actual hardware.  I installed Feisty Fawn and then followed that up by installing the VMWare tools  (which installed without a hitch).  At the final stage of the VMWare tools install, it asks me what resolution I want to use.  I gave it a reasonable response, finished with VMWare tools, and then logged off so I could restart X.  Bam, the screen jumped to some huge resolution.  Something like 3000x2000.  I hit the maximize button on the VMWare screen and the Ubuntu desktop neatly filled both my monitors.  No editing of any x config files.  No Windows desktop elements visible.  No Windows taskbar.  Nothing.  Sweetness.

Multi-monitor support is not supported in Windows Server 2003 but XP works like a champ.  VMWare 6 puts me a little bit closer to vm only development.

Thursday, May 3, 2007

Thanks Jeffrey!

We just finished up our 2007 Users Conference and I'd really like to thank David Sceppa and Jeffrey McManus for presenting at the conference.  David is a program manager on the ADO.Net team at Microsoft and I had more than one person come up to me and tell me that having a Microsoft rep at the sessions really indicated that we were serious about working with Microsoft tools and that Microsoft seemed very willing to help with that.  True indeed.

Also, I really appreciated Jeffrey being willing to jump in last minute and do a presentation for us.  He does alot of traveling and presenting so I know his time is precious.  Jeffrey also recently made available a tool he wrote for generating a set of classes for a given database schema.  He calls it Cgen and you can read his announcement about it here.  Keep up the good work, Jeffrey, and thanks!

MiX sessions online

Didn't make MiX '07?  Neither did I.  That's ok, though, cause the sessions are all online here.  Alot of great content here.  I'm listening to a session talking about PHP on Windows.  Gotta get back....

Wednesday, May 2, 2007

Checking out KDE4

So I decided to download the KDE4 live preview ISO and see what those guys  have been up to.  First pass was through Virtual PC 2007.  It initially seemed to boot ok but I eventually landed on a blank screen which didn't budge for nearly 45 minutes.  Either it was dead or taking an ridiculously long time.  Scratch.

Next I tried VMWare 6 RC1 and found success.  The image booted up nicely (although a bit slowly) and I was left with a very blank KDE4 desktop.  Very blank.  No demos.  Nothing to show me what is new.  Just a pretty blue screen.  Opening up the link for my home folder, I got a very bad looking type of explorer window that had tabs for history, services, network, etc.  At this point I was  unimpressed and bored. 

Is it just me or is the Linux desktop crowd still trying to reproduce what the Mac and Windows folks had about 5 years ago? 

The issue with FillSchema

Connector/Net's MySqlDataAdapter class has a method named FillSchema.  This method is intended to populate the metadata for a given query without actually returning any of the data from the query.  The only syntax that MySQL has to help with this is SQL_SELECT_LIMIT which limits the number of rows that are returned for a given select.  Indeed this is what we are using to prevent the transfer of data across the wire when we only want the metadata.

However, there is a problem.  SQL_SELECT_LIMIT does not work in stored procedures and also does not affect inserts, updates, or deletes.  So, the upshot of this is that calling FillSchema on a stored procedure will, in fact, execute the stored procedure and return all of the data to the client.  This is a waste of bandwidth but it's worse than that.  It will also execute all other DML statements in the procedure.

This is different than what happens with SQL Server and different than what people might expect.  With SQL Server, a 'SET FMTONLY ON' set statement is sent to the server prior to the command.  This prevents all DML from being executed and will return only metadata for any selects.  MySQL has no such mechanism. 

The thing to remember is that FillSchema will execute the procedure exactly the same as if Fill had been called with only one difference.  INOUT and OUT parameters will not have their values set properly on return.

Using the new Connector/Net Web providers

Yesterday I blogged about the release of our latest Connector/Net product.  Version 5.1, this release includes the addition of a new namespace MySql.Web.  This namespace includes implementations of a Membership and Role provider.  These providers work together with the membership and role systems in ASP.Net 2.0 to provide a simple mechanism for web developers to add authentication and role support to their web properties.

As we were unable to include proper documentation for these new providers before release, I thought it proper to write down a few thoughts on how these work and how to use them.

1. Provide a connection string

The Connector/Net installer will register the providers in the proper sections of the machine.config file.  When registered, they reference a connection string that is non-existent.  To use the providers, you must provide a connection string that points to the database you wish to use and must be named 'LocalMySqlServer'.   You would provide this connection string in your web.config file.  Here is an example:

<connectionStrings>

<add name="LocalMySqlServer" connectionString="data source=localhost;uid=root;pooling=false" providerName="MySql.Data.MySqlClient" />

</connectionStrings>

You can also use the Web Configuration Pages in Visual Studio to select the MySQL Membership and Role providers as defaults for your application.  Once this is done, controls such as the Login control will work with MySQL.

2. Understand how the schema is handled

We wanted the providers to work with shared hosting environments where only a single database may be available.  To do this, the providers can create or update the necessary schema at runtime.  This is handled at initialization time.  The provider checks the version of the schema in the selected database.  If non-existent, then the appropriate schema is created.  If older than current, it will be updated to match what this provider is wanting.

There is a possibility of name collision since your tables and the tables for the providers exist in the same database.  This is unlikely, though, since the names given to the provider tables are somewhat unique to their purpose.

We're working on better documentation for these providers and plan to make that available with the 5.1.1 release.  Also, we plan to create some articles for our dev zone that will demonstrate how to use these providers.

Tuesday, May 1, 2007

Where have I been?

I guess I've not been paying attention but I just learned that JetBlue is based entirely on Microsoft and .NET technologies.  You can read some about it here.  Jackie seemed to like it.  A friend of mine flew JetBlue to the MySQL users conference and had nothing but good things to say about them.  I find it interesting that we hear that companies need to move to Linux to save money and yet here we have one of the low-cost leaders offering world class service on *gasp* Microsoft software.  Maybe, just maybe, the bulk of costs incurred by a company are not related to licensing.  Nahhh......

Connector/Net 5.1.0 Alpha has been released.

Today we've announced the availability of Connector/Net 5.1.0 Alpha.  This is a very exciting release for us as it's the first time we've made available our ASP.Net 2.0 web providers and our compact framework support.  This release also folds in our Tools for Visual Studio into a single installer. 

To that end, we are dropping Tools for Visual Studio as as separate download.  Going forward, you can select Visual Studio integration as an option directly from the Connector/Net installer.  All the same functionality is there, but packaging the products in this way will simplify bug fixes to the products and give our users a better out of box experience.

We encourage anyone using our products to try out this latest release and let us know what you think.  You can read our official release announcement here.

Entity Framework cut. Positive sign?

Microsoft recently announced that they are removing the Entity Framework and tools from Visual Studio "Orcas" and will, instead, ship them as an update in the first half of 2008.  It's pretty easy to see this as YAMM (Yet Another Microsoft Miss) but I instead look at this as a very positive sign of things changing.

Microsoft is accelerating many of the development timelines and embracing the "release early, release often" methodology.  It seems that almost every Microsoft product these days comes out as a CTP about a million times even before it his beta stage.  This just means greater awareness and better adoption.  MS is even releasing alot more code as open source as they recently announced a Dynamic Language Runtime (DLR) that supports languages such as Python and Ruby.  They are releasing it under a BSD style license.

It's clear that Orcas was going to be ready long before the Entity Framework and, rather than hold it up for another 6-9 months, they decided to ship Orcas and bolt on the EF later.  This is a good move and indicates that MS is wanting to speed up release cycles all across their divisions.  Let's hope this trend continues.

Thursday, April 26, 2007

It has to be intentional

I'm sitting here at the end of the MySQL Conference 2007 waiting for "Orcas" beta 1 to uninstall.  Yes, I know I should have used a VM but that's not the issue.  The issue is that I'm missing a great closing keynote on Yahoo Pipes while I wait for setup to "generate setup script".  Folks, it's been doing that for 30 minutes!

I'm running Vista Ultimate on this Inspiron 6000 but I know these absurdities are not limited to lower end hardware.  I've got a dual-Opteron box at my house and uncompressing zip files is a joke.  Right-clicking a 30 meg zip on my home system (SATA, 2 gig RAM, dual Opteron) often takes at least 10 minutes to tell me that the rest of the uncompress will take another 20.  Enter 7-zip stage left and the same uncompress is done in about 90 seconds.  I've code for almost 20 years and I can tell you that I would have to work very hard to write code this bad.  It has to be intentional!

45 minutes - still generating setup script.

Before I left on this trip I needed to copy the Orcas ISO over to my laptop.  Both machines are on my home network but the ISO is 5.5 gigs so I knew it would take some time.  After showing me a "Calculating time required" dialog for nearly 1 hour the dialog simply vanished.  No file copied, no error, no apology, no smoke afterward.  Copying files on Vista is simply broken, whether it's across a network or local.  On many occasions I've emptied my recycle bin (that had only one item in it) and stared at a "Preparing to recycle" message for 20 minutes.  Hello!  I'm recycling a single 2k file and you have to think about it for 20 minutes.  No wonder we're the butt of the world's joke.

55 minutes - still generating setup script.

Yes, Vista does some good things.  Yes, the things I mention here can and will be fixed.  But for now, my best advice to Vista users is to not copy files.  *grin*

1 hour - finally got the script written.  Now doing the uninstall.

Friday, April 20, 2007

Outlook 2007 patch helps sluggishness -- so what.

Microsoft has released a patch that appears to help the sluggishness people have been seeing from Outlook 2007.  I installed it but I have to ask if Outlook is really relevant any more.  We're headed to an all online world but we're not quite there yet.  Even so, with all the products available that allow syncing Google calendar to your PIM do we really need Outlook any more?  Thunderbird is so much better than Outlook at handling IMAP mail accounts it's not even funny and who out there isn't actively using or looking to use an all online contact database?

So I ask you again.  Is Outlook still relevant?

Visual Studio "Orcas" Beta 1 available

This is already making the blog rounds but the next pre-release version of the best development environment on the planet is out.  VPC images out and some ISO bits are available on MSDN.  Microsoft will also be making Express versions available in the next few days.  You can find all the links here.

Wednesday, April 18, 2007

Got tired of waiting...

Our next version of Connector/Net will include support for Compact Framework 2.0.  One thing that's been challenging is how to test our provider in this environment.  We have a NUnit test suite that we use with the normal provider but so far I haven't found any good way to run it under the compact framework.  I know about CFNUnitBridge but I needed something that could also work with compact framework 1.0.

So, I decided to write my own.  After two days of hacking I now have an application that does just what I want.  It loads my test suite and implements all the NUnit framework junk that I use.  I gave it a reasonable UI similar to what is seen in NUnit's GUI runner.  You can select a single test to run and have it run all the tests.  It also keeps track of exception messages and stack traces per test failure.  Here's a shot of it.  Anyone wanting to check it out can find it in the sample applications that will be included with Connector/Net 5.1.

Thursday, March 22, 2007

MySQL Connector/Net 5.0.6 has been released.

MySQL Connector/Net 5.0.6 a new version of the all-managed .NET driver for MySQL has been released.
This is a bug fix release for the current production branch of Connector/Net.

 
Version 5.0.6 is suitable for use with any MySQL version including MySQL-4.1, MySQL-5.0, MySQL-5.1 beta or the MySQL-5.2 Falcon "Preview".
It is now available in source and binary form from the Connector/Net download pages at http://dev.mysql.com/downloads/connector/net/5.0.html and mirror sites (note that not all mirror sites may be up to date at this point of time - if you can't find this version on some mirror, please try again later or choose another download site.)

 
This release comes shortly after 5.0.5 due to an incompatibility with Tools for Visual Studio.  With 5.0.5, we changed how the connector respects binary data as reported by the server.  This resulted in some queries that now return data as byte arrays that before returned data as string. Unfortunately this is still the case with 5.0.6.  Current versions of MySQL incorrectly return some metadata as binary.  Queries such as 'SHOW CREATE TABLE' will often return data as binary.  You can work around this by using a MySqlDataReader and reading the desired columns using .GetString().

Functionality Changes or Enhancements
No functionality changes to report.

Bugs fixed:
Bug #27135 MySqlParameterCollection and parameters added with Insert Method
Bug #27253 Installer : Company info is different
Bug #27187 cmd.Parameters.RemoveAt("Id") will cause an error if the last item is requested
Bug #27093 Exception when using large values in IN UInt64 parameters
Bug #27221 describe SQL command returns all byte array on MySQL versions older than 4.1.15
Bug #26960 Connector .NET 5.0.5 / Visual Studio Plugin 1.1.2

As always we thank you for your use of our products and keep those bug reports coming!

Wednesday, March 14, 2007

Microsoft's update stupidity - SP1

I've blogged about this before but with the news of Apple's upcoming 10.4.9 release, it reminded me again of the lame way Microsoft handles updates.  Am I the only one that thinks regularly scheduled (think every 2-3 months) updates that include all hotfixes for that period along with all application updates should be bundled into a numbered update?

No more long lists of KB# patches in our Add/Remove program list.  Want to know if a particular patch has been applied?  Simply check the version of the OS.  Mac users can simply tell each other what version of the system they are running.  10.4.2 versus 10.4.5.  Windows users would have to say 'Oh, I'm running Vista with patches installed for KBxxxx and KByyyyy and KBzzzzz and the Broadcom update of 1/4/07.  And you?'

I'm on vacation so enough ranting. 

Friday, March 9, 2007

Connector/Net 5.0.5 has a problem

As many of you have already discovered, Connector/Net 5.0.5 does not work correctly with Tools for Visual Studio.  The symptom is that when the plugin tries to enumerate all the tables in the database, it reports that it gets back an improper data type.  The cause of this problem is somewhat involved so I thought I would blog on it.

Since the early days of the connector, binary data was not always handled correctly.  Specifically, columns that were reported to the connector as CHAR and VARCHAR were returned as System.String.  This is, of course, not always correct.  The case that prompted the changes was a bug report that SELECT _binary "foo" would return foo as a System.String instead of System.Byte[] as it should.

The fix is to always respect the binary markers that the server sends, which 5.0.5 does.  The problem is that MySQL incorrectly reports some columns as binary such as the name column from the output of 'SHOW TABLE STATUS'.  To work around this issue, much of my GetSchema code had to be reworked to use a datareader instead of a dataadapter.  This way I can use GetString() to get a string representation of the column even though it is binary.

All this would have been fine except I failed to test the plugin with 5.0.5 and apparently still have a case where a string column is being returned as binary.  I'm looking into it right now and we'll get a 5.0.6 out right away with this issue addressed.

Wednesday, March 7, 2007

Connector/Net 5.0.5 has been released.

MySQL Connector/Net 5.0.5 a new version of the all-managed .NET driver for MySQL has been released.


This is a bug fix release for the current production branch of Connector/Net.
Version 5.0.5 is suitable for use with any MySQL version including MySQL-4.1, MySQL-5.0, MySQL-5.1 beta or the MySQL-5.2 Falcon "Preview".


It is now available in source and binary form from the Connector/Net download pages at http://dev.mysql.com/downloads/connector/net/5.0.html and mirror sites (note that not all mirror sites may be up to date at this point of time - if you can't find this version on some mirror, please try again later or choose another download site.)

What happened to 5.0.4?
We had 5.0.4 packaged up and ready to go and then discovered that a previous bug fix was not complete.  Rather than release 5.0.4 and then follow that up with a quick release of 5.0.5, we decided to not release 5.0.4 at all.  This allowed us to roll in a couple of additional last minute bug fixes.

Functionality Changes or Enhancements
* Return parameters created with DeriveParameters now have the name
  RETURN_VALUE
* Fixed problem with parameter name hashing where the hashes were not
  getting updated when parameters were removed from the collection.
* Fixed problem with calling stored functions when a return parameter
  was not given
* Fixed problem that prevented use of SchemaOnly or SingleRow command
  behaviors with sprocs or prepared statements
* Assembly now properly appears in the Visual Studio 2005 Add/Remove
  Reference dialog
* Added MySqlParameterCollection.AddWithValue and marked the Add(name,
  value) method as obsolete
* Added "Use Procedure Bodies" connection string option to allow calling
  procedures without using procedure metadata. (see release notes)
* Reverted behavior that required parameter names to start with the
  parameter marker.  We apologize for this back and forth but we
  mistakenly changed the behavior to not match what SqlClient supports.
  We now support using either syntax for adding parameters however we
  also respond exactly like SqlClient in that if you ask for the
  index of a parameter using a syntax different than you added the
  parameter, the result will be -1.

Bugs fixed: 
  Bug #25443 ExecuteScalar() hangs when more than one bad result
  Bug #24802 Error Handling
  Bug #25614 After connection is closed, and opened again UTF-8
             characters are not read well
  Bug #25625 Crashes when calling with CommandType set to
             StoredProcedure
  Bug #25458 Opening connection hangs
  Bug #25651 SELECT does not work properly when WHERE contains UTF-8
             characters
  Bug #25726 MySqlConnection throws NullReferenceException and
             ArgumentNullException
  Bug #25609 MySqlDataAdapter.FillSchema
  Bug #25928 Invalid Registry Entries
  Bug #25912 selecting negative time values gets wrong results
  Bug #25906 Typo makes GetSchema with DataTypes collection throw an
             exception
  Bug #25907 DataType Column of DataTypes collection does'nt contain the
             correct CLR Datatype
  Bug #25950 DataSourceInformation collection contains incorrect values
  Bug #26430 Will not install under Vista
  Bug #26152 Opening a connection is really slow
  Bug #24373 High CPU utilization when no idle connection
  Bug #24957 MySql.Data.Types.MySqlConversionException is not marked as
             Serializable.
  Bug #25603 Critical ConnectionPool Error in Connector.Net 5.03
  Bug #26660 MySqlConnection.GetSchema fails with NullReferenceException
             for Foreign Keys
  Bug #25605 BINARY and VARBINARY is returned as a string
  Bug #25569 UpdateRowSource.FirstReturnedRecord does not work