<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://forums.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Issue Tracker Starter Kit</title><link>http://forums.asp.net/155.aspx</link><description>Discussions about the Issue Tracker Starter Kit for ASP.NET 1.x.</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Re: Data Access</title><link>http://forums.asp.net/thread/2648684.aspx</link><pubDate>Fri, 26 Sep 2008 15:58:32 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:2648684</guid><dc:creator>marcschluper</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/2648684.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=155&amp;PostID=2648684</wfw:commentRss><description>&lt;p&gt;Why would you write&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;while&lt;/font&gt;&lt;font size="2"&gt;(returnData.Read())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#008080" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt; TempCategory = &lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#008080" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#008080" size="2"&gt;Convert&lt;/font&gt;&lt;font size="2"&gt;.ToInt16(returnData[&amp;quot;Id&amp;quot;]),&amp;nbsp;&lt;/font&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#008080" size="2"&gt;Convert&lt;/font&gt;&lt;font size="2"&gt;.ToString(returnData[&amp;quot;Title&amp;quot;]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;TempCollection.Add(TempCategory);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;if &lt;/font&gt;&lt;font size="2"&gt;you could write&lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;font size="2"&gt; ciId = returnData.GetOrdinal(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Id&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;font size="2"&gt; ciTitle = returnData.GetOrdinal(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Title&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;while&lt;/font&gt;&lt;font size="2"&gt;(returnData.Read())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Category TempCategory = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; Category(returnData.GetInt16(ciId), returnData.GetString(ciTitle));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TempCollection.Add(TempCategory);&lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size="2"&gt;This would save you needless type conversions and it would&amp;nbsp;reduce the number of string comparisons dramatically: the column index numbers are&amp;nbsp;determined only once, not for each record.&lt;br /&gt;&lt;/font&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/p&gt;&lt;/font&gt;</description></item><item><title>Re: Data Access</title><link>http://forums.asp.net/thread/879236.aspx</link><pubDate>Sat, 02 Apr 2005 22:02:28 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:879236</guid><dc:creator>mmarksbury</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/879236.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=155&amp;PostID=879236</wfw:commentRss><description>&lt;P&gt;Awesome.&amp;nbsp; I've been using Generics in some coding in ASP.NET 2.0.&amp;nbsp; Again, Awesome!&amp;nbsp; But I am having some trouble understanding&amp;nbsp;another aspect, related to the Data Access Layer.&lt;/P&gt;
&lt;P&gt;I am attempting to re-create the Data Provider model that Issue Tracker uses, in my ASP.NET 2.0 application.&amp;nbsp; I am using the abstract pass-through methods in the Data Access Layer class, and using a delegate from that class to generate collections from within the individual data classes (i.e. SqlDataAccessLayer, AccessDataAccessLayer, etc.).&amp;nbsp; &lt;/P&gt;
&lt;P&gt;My question becomes, what is&amp;nbsp;the best way to implement generics in this process, over the strong typed collections.&lt;/P&gt;
&lt;P&gt;Assuming&amp;nbsp;this is for a category, I have done this, and would like to know if I am going about it incorrectly.&lt;/P&gt;
&lt;P&gt;sample from DataAccessLayer.cs&lt;/P&gt;
&lt;P&gt;-------------------------------------------------------------------------------------&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;protected&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;delegate&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;IList&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;GenerateCollectionFromReader&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;IDataReader&lt;/FONT&gt;&lt;FONT size=2&gt; returnedCollection);&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;protected&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;List&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Category&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;gt; GenerateCategoryCollectionFromReader(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;IDataReader&lt;/FONT&gt;&lt;FONT size=2&gt; returnData)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;List&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Category&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;gt; TempCollection = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;List&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Category&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;while&lt;/FONT&gt;&lt;FONT size=2&gt;(returnData.Read())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Category&lt;/FONT&gt;&lt;FONT size=2&gt; TempCategory = &lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Category&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Convert&lt;/FONT&gt;&lt;FONT size=2&gt;.ToInt16(returnData["Id"]),&amp;nbsp;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Convert&lt;/FONT&gt;&lt;FONT size=2&gt;.ToString(returnData["Title"]))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;TempCollection.Add(TempCategory);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/FONT&gt;&lt;FONT size=2&gt; TempCollection;&lt;BR&gt;}&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;------------------------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;Am I right in assuming that when the delegate's return type is of IList, I am forcing the compiler to do type conversions?&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Any suggestions would be greatly appreciated.&amp;nbsp; Thanks.&lt;/P&gt;</description></item><item><title>Re: Data Access</title><link>http://forums.asp.net/thread/867634.aspx</link><pubDate>Wed, 23 Mar 2005 14:38:32 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:867634</guid><dc:creator>swalther</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/867634.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=155&amp;PostID=867634</wfw:commentRss><description>Yes, you are absolutely correct!  Generics in the .NET Framework 2.0 eliminate the need for all of those strongly typed collections in the .NET 1.1 version of the framework. If the Issue Tracker was rewritten for .NET 2.0, generics would be used everywhere.
&lt;br /&gt;

&lt;br /&gt;
-- best,
&lt;br /&gt;
     Stephen Walther</description></item><item><title>Re: Data Access</title><link>http://forums.asp.net/thread/863941.aspx</link><pubDate>Sun, 20 Mar 2005 07:28:47 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:863941</guid><dc:creator>mmarksbury</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/863941.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=155&amp;PostID=863941</wfw:commentRss><description>Okay, so I did some digging, and believe I found a good way to replace the collection classes for the current Issue Tracker with minimal code, for ASP.NET 2.0 using generics.  Please tell me if my solution will work, and if it is a good or bad implementation.
&lt;br /&gt;

&lt;br /&gt;
First, I would Create a new class file called &amp;quot;GenericCollections.cs&amp;quot; or variation.
&lt;br /&gt;

&lt;br /&gt;
This is the code it would contain . . . 
&lt;br /&gt;

&lt;br /&gt;
---------------------
&lt;br /&gt;

&lt;br /&gt;
using System;
&lt;br /&gt;
using System.Collections.Generic;
&lt;br /&gt;

&lt;br /&gt;
namespace SPNET.StarterKit.IssueTracker.BusinessLogicLayer
&lt;br /&gt;
{
&lt;br /&gt;
    public class CategoryCollection : List&amp;lt;Category&amp;gt;
&lt;br /&gt;
    {
&lt;br /&gt;
    }
&lt;br /&gt;

&lt;br /&gt;
    public class CustomFieldCollection : List&amp;lt;CustomField&amp;gt;
&lt;br /&gt;
    {
&lt;br /&gt;
    }
&lt;br /&gt;

&lt;br /&gt;
    ... etc. for all classes
&lt;br /&gt;

&lt;br /&gt;
}
&lt;br /&gt;

&lt;br /&gt;
---------------------------
&lt;br /&gt;

&lt;br /&gt;
If I am correct, this will allow the current code to work correctly, as the collection class names are unchanged, but, is there a better way?</description></item><item><title>Re: Data Access</title><link>http://forums.asp.net/thread/863925.aspx</link><pubDate>Sun, 20 Mar 2005 06:04:15 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:863925</guid><dc:creator>mmarksbury</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/863925.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=155&amp;PostID=863925</wfw:commentRss><description>Am I correct in my understanding that if this were written using Generics in ASP.NET 2.0, all of the collection classes would be eliminated?
&lt;br /&gt;

&lt;br /&gt;
AND
&lt;br /&gt;

&lt;br /&gt;
If so, how would the following Issue Tracker code be changed using Generics instead of string typed Collections?
&lt;br /&gt;

&lt;br /&gt;
public static IssueCollection GetIssuesByProjectId (int projectId) {
&lt;br /&gt;
            if (projectId &amp;lt;= DefaultValues.GetProjectIdMinValue())
&lt;br /&gt;
                throw (new ArgumentOutOfRangeException(&amp;quot;projectId&amp;quot;));
&lt;br /&gt;

&lt;br /&gt;
            DataAccessLayerBaseClass DBLayer = DataAccessLayerBaseClassHelper.GetDataAccessLayer();
&lt;br /&gt;
            return (DBLayer.GetIssuesByProjectId(projectId));
&lt;br /&gt;
        }</description></item><item><title>Re: Data Access</title><link>http://forums.asp.net/thread/778782.aspx</link><pubDate>Mon, 20 Dec 2004 23:01:47 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:778782</guid><dc:creator>marcschluper</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/778782.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=155&amp;PostID=778782</wfw:commentRss><description>Thank you Stephen, for taking the time to anwer.
&lt;br /&gt;

&lt;br /&gt;
The example shown on page &lt;a target="_new" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatasqlclientsqldatareaderclassgetordinaltopic.asp"&gt;MSDN&lt;/a&gt; does not make any assumption about the column number; it retrieves that number (once) by means of GetOrdinal and then uses the number to retrieve the cell value, for each row. So it does not use a fixed ordinal position.
&lt;br /&gt;

&lt;br /&gt;
I use strongly typed collections myself. They do not enforce me to construct the kind of code Issue Tracker uses:
&lt;br /&gt;
&lt;pre&gt;SqlDataReader myReader = null;
&lt;br /&gt;
try
&lt;br /&gt;
{
&lt;br /&gt;
    myConnection.Open();
&lt;br /&gt;
    myReader = myCommand.ExecuteReader();
&lt;br /&gt;
    int ciInstanceID = myReader.GetOrdinal(&amp;quot;instanceID&amp;quot;);
&lt;br /&gt;
    int ciInstanceName = myReader.GetOrdinal(&amp;quot;instanceName&amp;quot;);
&lt;br /&gt;

&lt;br /&gt;
    while (myReader.Read()) 
&lt;br /&gt;
    {
&lt;br /&gt;
        MyClass myInstance = new MyClass();
&lt;br /&gt;
        if (!myReader.IsDBNull(ciInstanceID))
&lt;br /&gt;
        {
&lt;br /&gt;
	myInstance.InstanceID = myReader.GetInt32(ciInstanceID);
&lt;br /&gt;
        }
&lt;br /&gt;
        if (!myReader.IsDBNull(ciInstanceName))
&lt;br /&gt;
        {
&lt;br /&gt;
	myInstance.InstanceName = myReader.GetString(ciInstanceName);
&lt;br /&gt;
        }
&lt;br /&gt;
        List.Add(myInstance);
&lt;br /&gt;
    }
&lt;br /&gt;
    finally
&lt;br /&gt;
    {
&lt;br /&gt;
        // etc
&lt;br /&gt;
    }
&lt;br /&gt;
}&lt;/pre&gt;
&lt;br /&gt;
Easy to read, simple, fast, standard ADO.NET.
&lt;br /&gt;

&lt;br /&gt;
So the question remains: why do it differently, as in Issue Tracker?
&lt;br /&gt;
Why invent something new if it is not better?
&lt;br /&gt;</description></item><item><title>Re: Data Access</title><link>http://forums.asp.net/thread/773773.aspx</link><pubDate>Tue, 14 Dec 2004 23:52:18 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:773773</guid><dc:creator>swalther</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/773773.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=155&amp;PostID=773773</wfw:commentRss><description>Hi Marc,
&lt;br /&gt;

&lt;br /&gt;
Thanks for using the Issue Tracker!
&lt;br /&gt;

&lt;br /&gt;
The Issue Tracker uses strongly typed collections to represent database data. For example, comments on issues are represented by the IssueCommentCollection class. A normal collection, such as an ArrayList, represents everything as an object. The advantage of strongly typed collections is that they represent their elements as the right data type (in this case, as IssueComment classes).
&lt;br /&gt;

&lt;br /&gt;
The next version of the .NET Framework -- .NET Framework 2.0 -- has strongly typed collections built into it through a new feature named Generic Types. Using Generic Types, you can simply create a strongly typed collection of IssueComment objects like this:
&lt;br /&gt;

&lt;br /&gt;
List&amp;lt;IssueComment&amp;gt; colIssueComments = new List&amp;lt;IssueComment&amp;gt;();
&lt;br /&gt;

&lt;br /&gt;
I love generics! Unfortunately, with the current version of the .NET Framework (and ADO.NET), you must resort to building strongly typed collections yourself. And yes, that does add some ugly class bloat to the Business Logic Layer in the Issue Tracker. 
&lt;br /&gt;

&lt;br /&gt;
You also asked why the Issue Tracker does not use the GetOrdinal methods of the DataReader class when retrieving column values. You are correct that refering to a column in a DataReader by its ordinal position and not by name is faster. 
&lt;br /&gt;

&lt;br /&gt;
The downside of using ordinal references is that they make your code both more fragile and harder to read. Refering to a column by its ordinal position makes your code more fragile since, if you ever change the columns in your database table, your code will no longer work. Using numbers to refer to columns also makes your code much harder for humans to read and maintain. There are always tradeoffs... :)
&lt;br /&gt;

&lt;br /&gt;
  -- best,
&lt;br /&gt;
       Stephen Walther</description></item><item><title>Re: Data Access</title><link>http://forums.asp.net/thread/769699.aspx</link><pubDate>Fri, 10 Dec 2004 07:34:04 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:769699</guid><dc:creator>kevinlkk</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/769699.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=155&amp;PostID=769699</wfw:commentRss><description>Moreover, is there any benefit to use collection class for each business function instead of using DTO?  If the application is so large that there are many business function classes, it will be a nightmare of maintaining this &amp;quot;class boom&amp;quot;.</description></item><item><title>Data Access</title><link>http://forums.asp.net/thread/769638.aspx</link><pubDate>Fri, 10 Dec 2004 05:45:54 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:769638</guid><dc:creator>marcschluper</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/769638.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=155&amp;PostID=769638</wfw:commentRss><description>Can anyone explain to me why IssueTracker uses such an awkward way of accessing data? Why not simply use ADO.NET? There are tons of books about it and if everyone uses the same methods for accessing data we can all learn from each other and quickly start at a new job.
&lt;br /&gt;
IssueTracker uses code like this:
&lt;br /&gt;

&lt;br /&gt;
protected CollectionBase  GenerateIssueCommentCollectionFromReader(IDataReader returnData) 
&lt;br /&gt;
		{
&lt;br /&gt;
			IssueCommentCollection cmtCollection = new IssueCommentCollection();
&lt;br /&gt;
			while (returnData.Read()) 
&lt;br /&gt;
			{
&lt;br /&gt;
				IssueComment newComment=new IssueComment((int)returnData[&amp;quot;CommentId&amp;quot;], (int)returnData[&amp;quot;IssueId&amp;quot;], (string)returnData[&amp;quot;Comment&amp;quot;], (string)returnData[&amp;quot;CreatorUsername&amp;quot;], (string)returnData[&amp;quot;CreatorDisplayName&amp;quot;], (DateTime)returnData[&amp;quot;DateCreated&amp;quot;] );
&lt;br /&gt;
				cmtCollection.Add(newComment);
&lt;br /&gt;
			}
&lt;br /&gt;
			return (cmtCollection);
&lt;br /&gt;
		}
&lt;br /&gt;

&lt;br /&gt;
Do you see any benefits over regular ADO.NET? Besides, the IssueTracker data access way is not even the fastest: for each row of the result table it again determines which column has name &amp;quot;CommentId&amp;quot;, &amp;quot;IssueId&amp;quot;, etc. Using GetOrdinal (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatasqlclientsqldatareaderclassgetordinaltopic.asp) you get better performance.</description></item></channel></rss>