Most likely, you are not just reading a single row of data all the time, but instead are retrieving many rows of data. You can use LINQ to SQL or the Entity Framework to generate code that creates these collections of objects for you. I think it is important to understand what these code generators do becausethe more you know, the better programmer you are.
I you know how to build your own object collections using tried and true technology, you don't have to rely on Microsoft. Using ADO.NET for data access and building classes with properties and methods has not changed since .NET 1.0, so that is always a stable choice. In this article, you learned how to create an entity class and a collection of entity classes using DataTables and data readers. You can use collections of entity classes in your programming instead of data tables. Entity collections give you more flexibility with classes than you get with loosely-typed objects contained in data tables and data readers.
You can create your own DataConvert class to be used to help you convert null data into a useable default value. Take advantage of the Field extension method on the DataRow class if you are working with nullable types. Reflection can be used to cut down the amount of code you write, but at the expense of a little speed. If you do use reflection, use the SetValue method instead of the InvokeMember method. You should also look at using code generation to generate much of this code. Aggregation - A function that accepts an array of all values of this column in this row group and returns a single value to display in the result row.
The return value must be of the type specified by the object's type property. Details on creating your own aggregation function are given below. You must know what data types this method accepts and only call it on columns of the appropriate type. The API provides several useful aggregation functions. See Provided Aggregation Functions below for a list, or Creating an aggregation function to learn how to write your own aggregation function. Listing 7 uses LINQ with a DataTable to create a collection of Product objects where the properties are nullable types.
Instead of using the DataConvert class, you use the Field extension method specifying the nullable data type to use for that property. If the data coming from the data row is null, a null is put into the property, otherwise the actual value is placed into the property. Notice that the ProductName property is only a string because there is no nullable string type. Because Field is an extension method, you need to add a reference to the System.Data.DataSetExtensions.dll in your project in order to use the Field method. Now that you have a table and a class in which to put each row of data from the table, let's look at various ways to load up the collection of objects.
To start, you will learn to use a SqlDataAdapter and a DataTable object. In Listing 2 you create a SqlDataAdapter to fill a DataTable object. Loop through each row of data in the DataTable and create a new instance of a Product class. Retrieve each individual column, convert the value into the appropriate data type and set the property of the Product object. We can programmatically copy rows and columns from one Excel document to another. We can also copy rows and columns within the same worksheet or across different worksheets in an Excel document.
Aspose.Cells provides the following methods to copy rows and columns. The following code snippet illustrates how to import data directly from nested collection objects with default layout option. The input XML file used in the code can be downloaded here. Listing 4 is fairly straightforward and very similar to the code you used to load the collection using a DataTable.
After building a data reader object, loop through each row and retrieve each column of data. Convert the data coming from the column into an appropriate value based on the data type. Remember when reading from a DataRow or from a column in the SqlDataReader that the data comes in as an "object" data type. So you must convert it in order to put it into a strongly typed property in your Product object.
Of course, you must still handle null values when using a data reader, so you use the DataConvert class just like before. The Product class, shown in Listing 1, is an example of creating a class that matches each column in the Product table. In this first sample, you use public properties instead of a full property definition. Feel free to add a private variable and then use a complete property get/set to return and set the value of the private variable, if you want. You might also notice that I marked this class as partial. Marking a class as partial gives you the flexibility to use a code generator to create this class and if you change the schema of your table, you can regenerate the class.
You can create another file with the other part of the Product class and add any additional properties or methods you want there. That way, you won't have to worry about overwriting these additional elements if you regenerate the code. Method Return Value Description createQueryFromPrefs google.visualization.Query Static. Create a new instance of google.visualization.Query and set its properties according to values from the gadget preferences.
Preference _table_query_url is used to set the Query data source URL. Now, as I mentioned, I also support loading typed data so lets say we wanted the ID column in our data to be an integer data type. We'll need to change our array from string[][] to object[][], define a row of types, and then our data.
The methods on the DataFactory class take a parameter that defines what row the types are located on. This defaults to -1, which signifies that types are not defined and that column data is strings. For each row of data, you will loop through the PropertyInfo array and use the property name to retrieve the corresponding column in the data reader. You then use that property name in the call to the SetValue method to set the property from the column in the data reader. Notice that you have to first check to see if the column data is a null.
If the data is null, set the property to a null value. This works because you are using the Product class with the nullable data types. We all retrieve data from a table at some time or another. There are many ways of getting this data, but how you work with the data within your program should be done with a class. For instance, when using a DataRow, you must remember the column name; in your class, you get IntelliSense on the property name. If you mistype the column name when using a DataRow, you get a runtime error, unlike mistyping a property name on a class, which earns you a compile-time error.
With a class, you get strong typing of data values where all values coming from a DataRow or a data reader are exposed as the object data type. Using a class makes it easy to control the serialization of the class data because you can add attributes to each column. This is just not possible with a DataRow or with a data reader. When you use a class, you can inherit from a base class to add extra properties and functionality to each class.
TwoDArray A two-dimensional array, where each row represents a row in the data table. If opt_firstRowIsData is false , the first row will be interpreted as header labels. The data types of each column are interpreted automatically from the data given. If a cell has no value, specify a null or empty value as appropriate. Opt_firstRowIsData Whether the first row defines a header row or not.
If false, the first row is assumed to be a header row, and the values are assigned as column labels. Selection_arrayAn array of selected objects, each one describing a data element in the underlying table used to create the visualization . Each object has properties row and/or column, with the index of the row and/or column of the selected item in the underlying DataTable. If the row property is null, then the selection is a column; if the column property is null, then the selection is a row; if both are non-null, then it is a specific data item.
You can call the DataTable.getValue() method to get the value of the selected item. The retrieved array can be passed into setSelection(). To add an array of objects into a DataTable (in this example called 'dt'). You first have to make sure your DataTable has at least as many columns as your array has fields. Optionally selects a data entry in the visualization—for example, a point in an area chart, or a bar in a bar chart.
When this method is called, the visualization should visually indicate what the new selection is. The implementation of setSelection() should not fire a "select" event. For example, a table that can show only selected rows may ignore cell or column elements in its setSelection() implementation, or it can select the entire row.
A ChartWrapper class is used to wrap your chart and handle all loading, drawing, and Datasource querying for your chart. The class exposes convenience methods for setting values on the chart and drawing it. This class simplifies reading from a data source, because you do not have to create a query callback handler.
You can also use it to save a chart easily for reuse. Properties is an Object (a name/value map) with additional properties for this cell. To avoid overwriting this value, set this parameter to undefined; to clear this value, set it to null. Some visualizations support row, column, or cell properties to modify their display or behavior; see the visualization documentation to see what properties are supported.
GetNumberOfColumns() Number Returns the number of columns in the table. GetNumberOfRows() Number Returns the number of rows in the table. GetProperties Object Returns a map of all the properties for the specified cell. Note that the properties object is returned by reference, so changing values in the retrieved object changes them in the DataTable. The DataTable object is used to hold the data passed into a visualization. All data in each column must have the same data type.
Each column has a descriptor that includes its data type, a label for that column , and an ID, which can be used to refer to a specific column . The DataTable object also supports a map of arbitrary properties assigned to a specific value, a row, a column, or the whole DataTable. Must be calldatatable.load() to load new modified datasource and rerender table. The code in Listing 8 uses a data reader, but you could just as well have used a DataTable. Let's use a LINQ query to iterate over the collection of DataRow objects within a DataTable.
After building your DataTable using a SqlDataAdapter, use the AsEnumerable method on the DataTable to turn the collection of DataRow objects into an enumerable list. Pattern String pattern that was used by a data source to format numeric, date, or time column values. This is for reference only; you probably won't need to read the pattern, and it isn't required to exist.
The Google Visualization client does not use this value (it reads the cell's formatted value). If the DataTable has come from a data source in response to a query with a format clause, the pattern you specified in that clause will probably be returned in this value. The recommended pattern standards are the ICU DecimalFormat and SimpleDateFormat .
Some visualizations support table, row, column, or cell properties to modify their display or behavior; see the visualization documentation to see what properties are supported. GetFilteredRows Array of objects Returns the row indexes for rows that match all of the given filters. The output of this method can be used as input to DataView.setRows() to change the displayed set of rows in a visualization. Cells can have a null value, or a value of the type specified by its column. Cells optionally can take a "formatted" version of the data; this is a string version of the data, formatted for display by a visualization. A visualization can use the formatted version for display, but will always use the data itself for any sorting or calculations that it makes .
An example might be assigning the values "low" "medium", and "high" as formatted values to numeric cell values of 1, 2, and 3. The best way I find to use this is, in my project, to create a new class called SampleData. In this class I provide a static method that returns all the data I want to load. I'll create this for every solution I need a data set in to customize the data I get back.
I define it as a two dimension array and this lets me set it up to look like, making it easy to read. As I mentioned previously, the utility supports loading two kinds of data, string data and typed data, so lets look at an example using string data. @jono - the main reason I'd guess is because there wouldn't be two way converters. Since a serialized data table doesn't include data information and a generic data table doesn't have type information the parsing process would have to guess types based on values . In the following example, we are exporting data from a collection of objects to a worksheet containing merged cells. We are setting the value of ImportTableOptions.CheckMergedCells property to true as the Excel document contains merged cells.
The following code snippet illustrates how to import data directly from nested collection objects with collapse group option. Let's now use the SetValue method to load collections of objects. For this sample, you will use the Product class that uses nullable types, as shown in Listing 6.
In order for this reflection code to work, you need to make sure that your property names are exactly the same name as the column names in your table. Listing 8 shows you how to rewrite the code to use reflection and the SetValue method to load your collection of Product objects. You pass five parameters to the InvokeMember method. The first parameter is the name of the property you wish to set. The second parameter is the name of the property or method you wish to invoke; in this case, the Set property.
The third parameter tells InvokeMember that you are using the default binder. The fourth parameter is the variable that contains a reference to an instance of the class specified by the type . The last parameter is an object array of whatever you need to pass to the method or property that you are invoking. In the last two examples, you use a DataConvert class to convert data from an object data type to either an actual value or a default value if the column data was a null. But, sometimes you wish to know that the data was null and show a blank value instead of DateTime.MinValue or a Zero . In order to accomplish this, you can do two things; change your Product class to use nullable types or use the Field extension method on the DataRow class.
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.