我如何从我的SQL Server数据集提取数据到一个类,我可以使用

本文关键字:一个 可以使 我可以 我的 SQL Server 数据 提取 数据集 | 更新日期: 2023-09-27 18:10:27

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

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

你能给我一些建议,告诉我如何实现我想做的事吗?

谢谢,罗斯

我如何从我的SQL Server数据集提取数据到一个类,我可以使用

一种选择是将项放入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,如果你添加一些基本的逻辑)是非常考验时间的。

我强烈建议您检查一些ORM软件,它们可以自动为您完成这些工作。自己创建类,然后用对象填充它们,既耗时又容易出错。现在有很多工具可以帮你做所有的工作。

在这里查看。net的不同选项列表。我推荐那些已经内建在。net框架中的工具,但这些都不会出错。