如何从SQL Server数据集中提取数据到我可以使用的类中?

时间:2013-04-23 17:53:55

标签: c# sql-server datagrid datagridview

我正在努力进入我几天前开始的项目,我花了一整天时间在ADO.net上阅读,但我很难理解如何提取我的SQL服务器表数据进入一个类,我基本上可以运行一些计算,如“startTime - endTime = totalWorked”,这将允许我创建一个单独的表单,我可以显示我的摘要。

我有我在这里完成的小代码,它连接到我的数据库并在代码中创建datagridview。 http://pastebin.com/VNRDqHjM

你能给我一些关于如何实现我想做的事情的指示吗?

非常感谢, 罗斯

2 个答案:

答案 0 :(得分:0)

一种选择是将物品放入DTO。您可以遍历IDataReader(我的首选项)或DataSet。

想象一下,下面的IDataReader连接到"从dbo.Employee选择EmployeeKey,LastName,FirstName,HireDate;"

[Serializable]
public partial class Employee
{
    public int EmployeeKey { get; set; }                   
    public string LastName { get; set; }                   
    public string FirstName { get; set; }   
    public DateTime HireDate  { get; set; }  
}

[Serializable]
public class EmployeeCollection : List<Employee>
{
}   

internal static class EmployeeSearchResultsLayouts
{
    public static readonly int EMPLOYEE_KEY = 0;
    public static readonly int LAST_NAME = 1;
    public static readonly int FIRST_NAME = 2;
    public static readonly int HIRE_DATE = 3;
}


    public EmployeeCollection SerializeEmployeeSearchForCollection(IDataReader dataReader)
    {
        Employee item = new Employee();
        EmployeeCollection returnCollection = new EmployeeCollection();
        try
        {

            int fc = dataReader.FieldCount;//just an FYI value

            int counter = 0;//just an fyi of the number of rows

            while (dataReader.Read())
            {

                if (!(dataReader.IsDBNull(EmployeeSearchResultsLayouts.EMPLOYEE_KEY)))
                {
                    item = new Employee() { EmployeeKey = dataReader.GetInt32(EmployeeSearchResultsLayouts.EMPLOYEE_KEY) };

                    if (!(dataReader.IsDBNull(EmployeeSearchResultsLayouts.LAST_NAME)))
                    {
                        item.LastName = dataReader.GetString(EmployeeSearchResultsLayouts.LAST_NAME);
                    }

                    if (!(dataReader.IsDBNull(EmployeeSearchResultsLayouts.FIRST_NAME)))
                    {
                        item.FirstName = dataReader.GetString(EmployeeSearchResultsLayouts.FIRST_NAME);
                    }

                    if (!(dataReader.IsDBNull(EmployeeSearchResultsLayouts.HIRE_DATE)))
                    {
                        item.HireDate = dataReader.GetDateTime(EmployeeSearchResultsLayouts.HIRE_DATE);
                    }


                    returnCollection.Add(item);
                }

                counter++;
            }

            return returnCollection;

        }
        //no catch here... see  http://blogs.msdn.com/brada/archive/2004/12/03/274718.aspx
        finally
        {
            if (!((dataReader == null)))
            {
                try
                {
                    dataReader.Close();
                }
                catch
                {
                }
            }
        }
    }

在DTO中的值之后,您可以添加如下的只读属性:

public int DaysEmployed
{
    get
    {
        int returnValue = 0;
            returnValue = Convert.ToInt32 (DateTime.Now.Subtract(this.HireDate).TotalDays);
        return returnValue;
    }
}

这将利用您现有的属性。

请注意,如果您不向对象提供HireDate,则必须处理这种情况。 但是你明白了。

您可以在带有计算列的DataSet / DataTable中执行此操作。但那就是#2004; 2004年&#39; ish&#34;恕我直言。 DTO(或POCO,如果你添加一些基本逻辑)是经过时间测试的。

答案 1 :(得分:0)

我强烈建议您查看一些自动为您执行此操作的ORM软件。自己创建类然后用对象填充它是耗时且容易出错的。如今,有一些工具可以为您完成所有工作。

查看.NET here的不同选项列表。我建议那些已经内置到.NET框架中但不会出错的任何内容。