0

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

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

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

非常感谢,罗斯

4

2 回答 2

0

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

在此处查看 .NET 的不同选项列表。我会推荐那些已经内置到 .NET 框架中的那些,但你不会出错。

于 2013-04-24T09:55:21.930 回答
0

一种选择是将项目放入 DTO。您可以遍历 IDataReader(我的偏好)或 DataSet。

想象一下,下面的 IDataReader 连接到“Select EmployeeKey, LastName, FirstName, HireDate from dbo.Employee;”

[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 年的”恕我直言。DTO(或 POCO,如果您添加一些基本逻辑)经过了非常长时间的测试。

于 2013-04-23T18:34:40.760 回答