- Posted by reggie on March 14, 2008
When we last left our hero he had just got the global data menu working under '05 and '08. Next step was use of the table browser. Here's a shot of it working with SQL Server data. Now there is no particular reason to use this data browser instead of writing our own other than it's just less work and it has a nice look and feel.
On the surface this looks pretty easy. After a little digging I discovered that this command binding will add a "Show Table Data" menu option and bring up a nice OleDB-based data browser under VS 2005.
<CommandBinding name="Browse_Data" guid="501822E1-B5AF-11d0-B4DC-00A0C91506EF" cmdid="12384"
handler="Microsoft.VisualStudio.DataTools.DBPackage.VDT_OLEDB_CommandHandler_TableTools">
<Parameter value="Open"/>
</CommandBinding>
The problem, of course, is that this doesn't work under VS 2008. The handler under VS 2008 is implemented by an object with the guid of 884DD964-5327-461f-9F06-6484DD540F8F. My first approach was to define two of these bindings and no matter which version of VS ran one of them would fail (and not add any menu item) while the other would succeed. VS doesn't like that. Apparently the guid and cmdId together form a key and you get a key added twice error. Hmmm
My good buddy Stephen at Microsoft offered up the solution of overriding the GetDataViews method of DataViewSupport and tweaking the XML that is returned. It turns out that he was spot on. I set all the handlers in the XML file to be proper for VS 2005, changed my DataViewSupport derived class to now use the no parameter constructor base, and then overrode the GetDataViews method like so.
public override Stream GetDataViews()
{
string xmlName = "MySql.Data.VisualStudio.DDEX.MySqlDataViewSupport.xml";
Assembly executingAssembly = Assembly.GetExecutingAssembly();
Stream stream = executingAssembly.GetManifestResourceStream(xmlName);
StreamReader reader = new StreamReader(stream);
string xml = reader.ReadToEnd();
reader.Close();
// if we are running under VS 2008 then we need to switch out a couple
// of command handlers
DTE dte = Package.GetGlobalService(typeof(DTE)) as DTE;
if (dte.Version.StartsWith("9"))
xml = xml.Replace
("Microsoft.VisualStudio.DataTools.DBPackage.VDT_OLEDB_CommandHandler_TableTools",
"884DD964-5327-461f-9F06-6484DD540F8F");
MemoryStream ms = new MemoryStream(xml.Length);
StreamWriter writer = new StreamWriter(ms);
writer.Write(xml);
writer.Flush();
ms.Position = 0;
return ms;
}
I won't bother with showing you a pic of it working in MySQL because it looks just like the other pic. But, then again, that's the point. :)