{"id":7393,"date":"2004-08-05T11:24:00","date_gmt":"2004-08-05T11:24:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vbteam\/2004\/08\/05\/why-are-the-data-components-no-longer-on-the-toolbox\/"},"modified":"2024-07-05T15:03:28","modified_gmt":"2024-07-05T22:03:28","slug":"why-are-the-data-components-no-longer-on-the-toolbox","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/vbteam\/why-are-the-data-components-no-longer-on-the-toolbox\/","title":{"rendered":"Why are the Data Components no longer on the Toolbox?"},"content":{"rendered":"<p class=\"MsoNormal\"><b><span>The short answer:<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>We&rsquo;ve updated from untyped, configured DataAdapters to Typed, Code Generated classes similar to the type DataSet for DataAdapters.<span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<ul type=\"disc\">\n<li class=\"MsoNormal\"><span>Using the Data Sources Window, add a new Data Source then drag the results to your form\n<\/p>\n<p><\/span><\/li>\n<\/ul>\n<p class=\"MsoNormal\"><span>or:<\/p>\n<p><\/span><\/p>\n<ul type=\"disc\">\n<li class=\"MsoNormal\"><span>Using the DataGridView, select Choose Data Source from the Smart tag that pops up.\n<\/p>\n<p><\/span><\/li>\n<\/ul>\n<p class=\"MsoNormal\"><b><span>The reasoning:<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>With new releases of products, we work to make experiences better.<span>&nbsp; <\/span>In Whidbey (Visual Studio 2005), we were able to pick up where we left off in 2002 for generating typed classes to access data.<span>&nbsp; <\/span>In 2002, and 2003 we would generate a Typed DataSet to provide a better experience iterating through collections of data.<span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Me<\/span><span>.CustomerTextBox.Text = <span>Me<\/span>.NorthwindDataSet.Customers(0).CustomerName<\/span><span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>However, we didn&rsquo;t have the time to help with the really hard part&hellip; <i>getting the data.<\/i><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Even if you used the DataAdapter wizard to create an updatable query with parameters you still needed to write ugly code.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>For the common SELECT statement:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>SELECT CustomerID, CompanyName, AddressLine1, AddressLine2, City, State, PostalCode<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;<\/span>FROM<span>&nbsp; <\/span>Customers<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>WHERE<span>&nbsp; <\/span>Company LIKE @company<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>AND<span>&nbsp; <\/span>State = @state<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>You would have to use the following code:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Me<\/span><span>.SqlDataAdapter1.SelectCommand.Parameters(0).Value = <span>Me<\/span>.CustomerNameTextBox.Text.Trim() &amp; &#8220;&amp;&#8221;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Me<\/span><span>.SqlDataAdapter1.Fill(<span>Me<\/span>.DataSet1.Customers)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>If the developer just finished the wizard, they may remember the order of the parameters.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><i><span>&ldquo;Which parameter number represents the @companyName and which parameter represents @state&rdquo;<\/p>\n<p><\/span><\/i><\/p>\n<p class=\"MsoNormal\"><span>Sure, they could write code like the following:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Me<\/span><span>.SqlDataAdapter1.SelectCommand.Parameters(&#8220;CompanyName&#8221;).Value = <span>Me<\/span>.CustomerNameTextBox.Text.Trim() &amp; &#8220;&amp;&#8221;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Me<\/span><span>.SqlDataAdapter1.SelectCommand.Parameters(&#8220;State&#8221;).Value = <span>Me<\/span>.StateComboBox.SelectedValue.Trim()<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Me<\/span><span>.SqlDataAdapter1.Fill(<span>Me<\/span>.DataSet1.Customers)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>But if your like me, may quickly forget the names, order, or even what parameters even exists.<span>&nbsp; <\/span>You may even wish to share it with another form, or you may split who configures the DataAdapters with who consumes them.<span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>There are a host of issues that then come up:<\/p>\n<p><\/span><\/p>\n<ul type=\"disc\">\n<li class=\"MsoNormal\"><span>If I&rsquo;m on the same form, do I remember the parameter names?<span>&nbsp; <\/span>Was it &ldquo;State&rdquo;, &ldquo;StateCode&rdquo;, &ldquo;Company&rdquo; or &ldquo;CompanyName&rdquo;?<span>&nbsp; <\/span>Was it the first, second, third.. parameter?<span>&nbsp; <\/span>Do I call the name &ldquo;@company&rdquo; or &ldquo;Company&rdquo;?<span>&nbsp; <\/span>Ok, so I could use an Enum or Constant, but is that really any more intuitive when consuming the SqlDataAdapter1?<span>&nbsp; <\/span>I don&rsquo;t get auto prompted for the list, I need to remember where the enum is.<span>&nbsp; <\/span>It does give me compile time verification. (Love compile time verification by the way.<span>&nbsp; <\/span>Who goes to the airport without first checking if the flight is on time?.<span>&nbsp; <\/span>Why should I have to exercise ever code path of my app just to find out I typo&rsquo;d something?)\n<\/p>\n<p><\/span><\/li>\n<li class=\"MsoNormal\"><span>What happens when I need to use that same CustomersDataTable on Form2?<span>&nbsp; <\/span>How do I get the DataAdapter from Form1 to Form2.<span>&nbsp; <\/span>I could copy\/paste, <i>(yeah like that&rsquo;s maintainable)<\/i><span>&nbsp; <\/span>\n<\/p>\n<p><\/span><\/li>\n<li class=\"MsoNormal\"><span>Oh, and what&rsquo;s up with SqlDataAdapter1, why do I have to go back and rename it CustomerDataAdapter and CustomerSelectCommand?<span>&nbsp; <\/span>We already know it was configured for the Customer DataTable\n<\/p>\n<p><\/span><\/li>\n<\/ul>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>In comes Whidbey&hellip;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>So, now we have a recap of the story we shipped in 2002.<span>&nbsp; <\/span>Did we want to write more pages, sure.<span>&nbsp; <\/span>But we needed to ship, so that&rsquo;s where Chapter 1 of Visual Studio Data left off.<span>&nbsp; <\/span>In Chapter 2 we now fill in more details.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span>Typed DataAdapters<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>Wouldn&rsquo;t it be nice if I could just reduce the above fragile, unintelligible code to the following?<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Me<\/span><span>.CustomerTableAdapter.FillByCompanyName(<span>Me<\/span>.NorthwindDataSet.Customers, <span>Me<\/span>.CompanyNameTextBox.Text, <span>Me<\/span>.StateComboBox.SelectedValue)<\/p>\n<p><\/span><\/p>\n<ul type=\"disc\">\n<li class=\"MsoNormal\"><span>The DataAdapter is friendly named\n<\/p>\n<p><\/span><\/li>\n<li class=\"MsoNormal\"><span>The DataSet is friendly named\n<\/p>\n<p><\/span><\/li>\n<li class=\"MsoNormal\"><span>A typed, friendly named method (FillByCompanyName) exists directly on the CustomerTableAdapter\n<\/p>\n<p><\/span><\/li>\n<li class=\"MsoNormal\"><span>The parameters for FillByCompanyName are specifically typed:\n<\/p>\n<p><\/span><\/li>\n<\/ul>\n<p class=\"MsoNormal\"><span>Public<\/span><span> <span>Overridable<\/span> <span>Function<\/span> FillByCompanyName(<span>ByVal<\/span> dataTable <span>As<\/span> NorthwindDataSet.CustomersDataTable, <span>ByVal<\/span> companyName <span>As<\/span> <span>String<\/span>, <span>ByVal<\/span> state <span>As<\/span> <span>String<\/span>) <span>As<\/span> <span>Integer<\/span> <\/span><span><\/p>\n<p><\/span><\/p>\n<ul type=\"disc\">\n<li class=\"MsoNormal\"><span>The DataAdapter is a generated class\/type so it can be instanced on multiple forms components, or within your own classes.<span>&nbsp; <\/span>Change the query or interface in one place, and it available in all your forms or objects.\n<\/p>\n<p><\/span><\/li>\n<li class=\"MsoNormal\"><span>It doesn&rsquo;t expose the internal commands and connections by default.\n<\/p>\n<p><\/span><\/li>\n<\/ul>\n<p class=\"MsoNormal\"><b><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span>But what about Nulls?<span>&nbsp; <\/span>(or is it Nothing&hellip;)<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>Ahhh, let&rsquo;s consider the following query:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>SELECT OrderID, CustomerID, OrderDate, RequiredDate, ShippedDate<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>FROM<span>&nbsp;&nbsp; <\/span>Orders<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>WHERE<span>&nbsp; <\/span>(ShippedDate = @shippedDate) OR<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;<\/span>(ShippedDate IS NULL)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Wouldn&rsquo;t it be nice if this could handle a Null\/Nothing value for the ShippedDate parameter?<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>How about: <\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Public<\/span><span> <span>Overridable<\/span> <span>Function<\/span> FillByShippedDate(<span>ByVal<\/span> dataTable <span>As<\/span> NorthwindDataSet.OrdersDataTable, <span>ByVal<\/span> shippedDate <span>As<\/span> Nullable(Of <span>DateTime<\/span>)) <span>As<\/span> <span>Integer<\/span> <\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Internally, the method would convert Null\/Nothing to DBNull<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><i><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/i><\/p>\n<p class=\"MsoNormal\"><i><span>Note: This isn&rsquo;t available in Beta 1, this work was just completed and should be available in the next community technology preview and of course Beta 2<\/p>\n<p><\/span><\/i><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>Don&rsquo;t let your friends see your privates&hellip;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>Many developers have heard this term.<span>&nbsp; <\/span>We&rsquo;ve also heard that developers want to create these methods and expose them as public API&rsquo;s, however, they don&rsquo;t want someone to be able to get at or change the ConnectionString or the CommandText of the internal commands.<span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span>TableAdapter, DataAdapter, Potato Potatoe&hellip;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>To solve this, we <a href=\"http:\/\/platinum.intersystems.com\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GOBJ_oo\">encapsulate<\/a> a provider specific DataAdapter within a generated class that, by default, inherits from Component.<span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Partial<\/span><span> <span>Public<\/span> <span>Class<\/span> OrdersTableAdapter<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Inherits<\/span> System.ComponentModel.Component<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>This means we, or you the developer, can control what public API exists.<span>&nbsp; <\/span>This also means that you can&rsquo;t cast one of our generated classes to a IDBDataAdapter.<span>&nbsp; <\/span>This is why we came up with the name TableAdapter.<span>&nbsp; <\/span>Hopefully developers can recognize the name, but understand why they can&rsquo;t cast it.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>But I want more&hellip;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>Ahh, everyone has a feature request, and many of them are really, really good.<span>&nbsp; <\/span>Leveraging Nullable(Of T) was one of those requests that came from one of your fellow MVP&rsquo;s.<span>&nbsp; <\/span>(Sorry, I never got their name or I&rsquo;d give them credit&hellip;)<span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>In Whidbey we&rsquo;ve introduced the concept of Partial Classes.<span>&nbsp; <\/span>You can essentially define two portions of the class in two separate files.<span>&nbsp; <\/span>It&rsquo;s sort of akin to using #Includes in old asp.<span>&nbsp; <\/span><i>Although you can only use the include in one class.<\/i><span>&nbsp; <\/span>However, what this means is Visual Studio can generate all the code in one file, and you can contribute to the same base class, but in a different file.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><u><span>File Name: NorthwindDataSet.\ndesigner.vb<\/p>\n<p><\/span><\/u><\/p>\n<p class=\"MsoNormal\"><span>This is the file we generate.<span>&nbsp; <\/span>Note the designer within the name.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Partial<\/span><span> <span>Public<\/span> <span>Class<\/span> OrdersTableAdapter<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Inherits<\/span> System.ComponentModel.Component<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><u><span>File Name: NorthwindDataSet.vb<\/p>\n<p><\/span><\/u><\/p>\n<p class=\"MsoNormal\"><span>This is your file.<span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Partial<\/span><span> <span>Public<\/span> <span>Class<\/span> OrdersTableAdapter<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>In this file you can extend the API of the class we defined in NorthwindDataSet.designer.vb.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Partial classes are powerful, but do have some limitations:<\/p>\n<p><\/span><\/p>\n<ul type=\"disc\">\n<li class=\"MsoNormal\"><span>You can reference private variables in the other partials\n<\/p>\n<p><\/span><\/li>\n<li class=\"MsoNormal\"><span>You can&rsquo;t override a method in other partials\n<\/p>\n<p><\/span><\/li>\n<\/ul>\n<p class=\"MsoNormal\"><span>If you want to make the ConnectionString public you can simply add the following to your own partial class:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Partial<\/span><span> <span>Public<\/span> <span>Class<\/span> CustomersTableAdapter<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Public<\/span> <span>Property<\/span> ConnectionString() <span>As<\/span> <span>String<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Get<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Return<\/span> <span>Me<\/span>.Connection.ConnectionString<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>End<\/span> <span>Get<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Set<\/span>(<span>ByVal<\/span> value <span>As<\/span> <span>String<\/span>)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Me<\/span>.Connection.ConnectionString = value<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>End<\/span> <span>Set<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>End<\/span> <span>Property<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>End<\/span><span> <span>Class<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>Changes from Beta 1 to Beta 2<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>There are a few changes we&rsquo;ve made that will show up in Beta 2:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>The TableAdpater.Connection will no longer be exposes as friend, and the Transaction property will be removed.<span>&nbsp; <\/span>You can see more info at: <span>&nbsp;<\/span><a href=\"http:\/\/blogs.msdn.com\/vbteam\/archive\/2004\/07\/19\/187953.aspx\">Connection and Transaction properties exposed as Friend on TableAdapters<\/a><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>Is this VB Only is C# allowed to play?<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>These features are supported in all .NET languages.<span>&nbsp; <\/span>This includes Visual Basic 2005, C#, J# and C++.<span>&nbsp; <\/span>Other .NET languages can also integrate with these features as well.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>So, why are the Data Components removed from the ToolBox?<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>Because so many people were using the old model that we felt we needed to force people to look for the new model.<span>&nbsp; <\/span>With the new model, we don&rsquo;t believe developers really need the untyped components on the toolbox.<span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>If you don&rsquo;t want to create UI from your DataSets, or you want to work with the Component Designer and just want the DataAdapters, we still have a feature for you&hellip;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Once you add a Typed DataSet and you have TableAdapters, these typed TableAdapters will appear in the toolbox.<span>&nbsp; <\/span>Just select Rebuild All, and look in the top of the new handy, dandy toolbox.<span>&nbsp; <\/span>Just like user controls, you&rsquo;ll see your components available.<span>&nbsp; <\/span><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>But I don&rsquo;t want my cheese moved.<span>&nbsp; <\/span>I like the old model&hellip;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span>Ok.<span>&nbsp; <\/span>I&rsquo;d really, really, <\/span><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The short answer: We&rsquo;ve updated from untyped, configured DataAdapters to Typed, Code Generated classes similar to the type DataSet for DataAdapters.&nbsp; Using the Data Sources Window, add a new Data Source then drag the results to your form or: Using the DataGridView, select Choose Data Source from the Smart tag that pops up. The reasoning: [&hellip;]<\/p>\n","protected":false},"author":260,"featured_media":8818,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[192,195],"tags":[],"class_list":["post-7393","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-featured","category-visual-basic"],"acf":[],"blog_post_summary":"<p>The short answer: We&rsquo;ve updated from untyped, configured DataAdapters to Typed, Code Generated classes similar to the type DataSet for DataAdapters.&nbsp; Using the Data Sources Window, add a new Data Source then drag the results to your form or: Using the DataGridView, select Choose Data Source from the Smart tag that pops up. The reasoning: [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/7393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/users\/260"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/comments?post=7393"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/7393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media\/8818"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media?parent=7393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/categories?post=7393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/tags?post=7393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}