Typed DataTable’s base class in VS008

I have a typed Dataset, generated by VS Designer. Resently I’ve added a new column to one of the tables, and suddently in different DLLs where the dataset was used, I’ve started to get

Error 22 The type ‘System.Data.TypedTableBase`1<T0>’ is defined in an assembly that is not referenced. You must add a reference to assembly ‘System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’.

 

Apparently VS 2008 changed the base class for Typed DataTables 

3.5 : public partial class SubusersDataTable : global::System.Data.TypedTableBase<SubusersRow> {

2.0: public partial class SubusersDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {

 and you need to change all dependant assemblies to

target 3.5 framework (if not done yet) and

add a reference to assembly ‘System.Data.DataSetExtensions, Version=3.5.0.0 

 

More details about the change from http://blogs.msdn.com/vbteam/archive/2008/05/14/how-linq-to-dataset-works-in-vb-jonathan-aneja.aspx

Note that for strongly-typed Datasets you don’t need to call AsEnumerable, as they inherit from TypedTableBase(Of T) which implements IEnumerable.  This is a new type in VS2008; in VS2005 the Dataset Designer would generate code that inherited from DataTable and then explicitly implemented IEnumerable itself.

 

EnitySpaces: the same Query can be used to save multiple tables

I wanted to minimize number of calls to the database, but get back results of dynamic query for small number of columns, as well as detailed data(e.g Itinerary table and Itinerary joined with Itinerary items) .In EntitySpaces
I’ve created a where condition, filled Query and loaded detailed data, then saved the returned table to DataSet.

Then  for the same query I’ve specified distinct select columns and Load it again(When LINQ will be available, it could be done in memory without extra database call).  Different table was created, that I’ve added to the same dataset. Below is code snippet:

                VwItinerariesCollection collPendingList = new VwItinerariesCollection();
                VwItinerariesQuery queryFilter = collPendingList.Query;
                queryFilter.AddWhereConditions();//custom code
                 collPendingList.Query.Load();
                 DataTable tbl= collPendingList.ConvertToDataTable();
                tbl.TableName = ListWithDetailsTable”;   
              DataSet  itineraries = new DataSet();
                itineraries.Tables.Add(tbl);
                 queryFilter.DistinctSelectForList();//custom code
                 collPendingList.Query.Load();
                 tbl = collPendingList.ConvertToDataTable();
                 tbl.TableName = ListTable”;
                 itineraries.Tables.Add(tbl);

My EntitySpaces notes

I have a few blog posts about EntitySpaces(started from this one) , as well as my posts on their forums. I want to put them together in this article as well as the links, that I consider useful.

If you need to change name of database in config, it is recommended , when generating Business Entities, in Advanced tab to set tick to Metadata Class Should  Ignore Catalog.  

To implement join for multiple tables it is suggested to create a view that brings  joined tables. They will support  joins in a future version.
There are useful EntitySpaces Query API and Query API Samples.

Filling an EsCollection out of an ordinary DataTable not supported,but you can try

    public bool CustomPopulate(DataTable dt )
{

this.Table = dt;
this.PopulateCollection();//protected method
}
}
To Clone EntitySpaces entities - the thread suggests binary serialisation(seems not always working?) and column by column copy.
Paging and Sorting on Sql 2000 using esDataSource
The ASP.NET demo source can be downloaded using Trial version and solution GridLoader.sln located under GridLoadersASP.NETC#GridLoader folder
See also EntitySpaces DotNetNuke ASCX Admin Grid Template Suite Released
  EntitySpaces and LINQ and LINQ to SQL-Aug 2007 thread .

ASP.NET MVC Northwind Demo using Entity Spaces 


NullReferenceException in EntitySpaces_C#_ASPX.csgen template after copy template instance

I am using MyGeneration Project  to generate admin web pages using EntitySpaces Templates for ASP.NET  . Filling templates is  very time consuming, and I decided to copy  template instance for one table as a start point for other table. It didn’t save much , because it require you to do everything differently for each table anyway. And it also causes an errors.
I’ve done selections im multiple tabs, but when I Executed template instances, I’ve got errors
**ERROR*** [NullReferenceException] Object reference not set to an instance of an object.
Canceled Template execution: EntitySpaces C# ASPX Page.
 
I would prefer to see mote detailed(with full call stack) message from MyGeneration.
 Fortunately, templates are relatively  easy to Debug  , and I found that when I’ve copied template instance, foreign keys from one table were copied to another, even if they are not applicable.
Debugger showed  lookupColumns={|CountryCode|FK_tblCarHireCompanyCountries_tblRefCountryName|CountryName^|HireCompanyCode|FK_tblCarHireCompanyCountries_tblRefCarHireCompanies|ShortName}

During execution code reads the foreign key name for a table and tryes to foreign key. If the name is wrong, it returns null, which causes the NullReferenceException in the call to

 Dnp.Utils.TableRelation(table, fk);
It is relatively easy to fix code by adding not null check.but there are a few places in the code where it should be done.
For example see my changes  in bold:
 
 // Lookups section
                              IForeignKey fk = table.ForeignKeys[fkName];    
                              if(fk!=null) //mnf
                              {//mnf
                                    Dnp.Utils.TableRelation tr = new Dnp.Utils.TableRelation(table, fk);
                        %>
            this.vlnk<%=esPlugIn.PropertyName(col)%>.Text = <%=tr.LookupName%>(entity.<%=esPlugIn.PropertyName(tr.PrimaryColumns[0])%>);
            this.vlnk<%=esPlugIn.PropertyName(col)%>.NavigateUrl = Globals.ApplicationPath + “/tabid/” + TabId + “/pagename/<%=esPlugIn.Entity(tr.ForeignTable)%>/<%=esPlugIn.PropertyName(tr.ForeignColumns[0])%>/” + entity.str.<%=esPlugIn.PropertyName(tr.PrimaryColumns[0])%> + “/default.aspx”;<%
                              }//mnf
  Mike.Griffin promises  that the ASP.NET templates will be completely fixed in EntitySpaces 2008.
I’ve reported the problem on EntitySpaces forum in
 
NullReferenceException in EntitySpaces_C#_ASPX.csgen template whe…

 Related link:My notes about MyGeneration Templates.

Don’t forget add EntitySpaces operands to Where method.

In EntitySpaces  you can specify filter to load data. I’ve wrote the following code



EmployeesCollection collection = new EmployeesCollection();   
Collection.Query.LastName.Like(“A%”)   
collection.Query.Load();   


and couldn’t understand why the filter doesn’t work.


The reason is that functions similat to Like, LessThan return esWhereItem that will work only after they passed to esDynamicQuery.Where(Object[]()) method.
So the correct code must be


Dim collection As EmployeesCollection = New EmployeesCollection()  
collection.Query.Where(collection.Query.LastName.Like(“A%”))
collection.Query.Load()     

Exclude non-stringable columns in EntitySpaces templates.

In MyGeneration template for EntitySpaces (see Template: Ajax Auto Complete WebServices using EntitySpaces) I wanted to loop through all columns of the table but exclude those that can not be converted to string(e.g TimeStamp).
It’s can be done by calling EntitySpaces esPlugIn methods IsObjectType and IsArrayType

  foreach(IColumn col in cols)
  {
    if(!esPlugIn.IsArrayType(col) && !esPlugIn.IsObjectType(col))
    {//exclude fields like TimeStamps
         //put your code here
    }
  
  }

My notes about MyGeneration Templates

I’ve started to use MyGeneration  templates. They are very powerful and easy to customize. However I feel it is not always easy to find documentation.It is split between different sites and also not searchable by Google(see discussions here and here).So I decided to put  here the links that are useful for me .

The introductiontoMyGeneration can be found in articles on CodeProject and dotnet.sys-con.com.

MyGeneration allows to write scripts in VBScript,JScript, C# and VB.Net. In DotNetScript UI can be written using use the standard .Net windows forms and propriatory Zeus input form. I prefer to use C# DotNetScript with using WinForms -and the authors of EntitySpaces use the same in their ASP.NET templates. However many of the old templates in the Template Library are written using other languages, which makes it a little bit harder to copy and paste code snippets. 

There is set of articles in TemplateLibrary.
For me the most useful are Developing DotNetScript Templates – MyGeneration  and MyGeneration Project Files.
(don’t waste your time to open articles, authored by lmterra  – they currently refer to dead links).

In forums site there is Tips and Tricks forum with Include Files in MyGeneration, , Your First MyGeneration Plug-In and SubTemplate Execution  tips.

The procedure of debugging is described here and in the help  . However I found it is required some tricks to show source – see Debug in VS2005 thread.

To  create easier UI for templates see MyGeneration.zip in dOOdads ASP.NET Inline Grid archive and in particular comment at the end of the post from  my.generation :

I added the project that I used to create the UI to the archive. It’s called MyGeneration.zip. MyMeta wont run unless you call the application MyGeneration, thus the name. Anyway, notice the use of the variable “input” which is a hash table, when I copy this code in the UI I only copy the code from MyForm_Load() on down. It makes for an extremely fast way to write/debug full winform UI’s. Just change the connection string in the Main() function where it creates and initializes a MyMeta object.

See also discussion Creating the GUI part of the template in Visual Studio

Alternative approach to creating UI in searate DLL shown in archive:Embedding Windows Forms in the Template UI .
Not sure, does Syntax-colouring plug-in for MyGeneration UI add any value,or current implementation sufficient.

Environment variables for template from Zeus API Reference Zeus.ZeusInput . The current template script metadata are accessible through  IZeusTemplateStub class.The sample to get them (e.g. Template Title) is shown here

To output ASP.NET dynamic tags <% and %> from templates see post .

I’ve posted template: Ajax Auto Complete WebServices using EntitySpaces