如何在C#中创建一个通用列表,并通过Select SQL查询填充

5
我正在使用Visual Studio Express 2012中的C#进行工作,我只与桌面应用程序一起工作。 我使用MySQL作为数据库。
数据库与MySQL之间的连接完全正常。
我的疑问是关于搜索和返回结果的制作。
在我看过的所有示例中,最常见的是在我的MySQL类中创建一个方法,该方法将返回具有搜索结果的列表。 我真的不知道这是否在概念上更正确,但它似乎非常可接受。
我成功地执行了搜索以返回我的表中的所有客户端。 但是我最大的问题是:如何制作此通用方法?
例如:
我的表单有一个按钮,触发点击事件:
dbConnect = new DBConnect();
dbConnect.OpenConnection();
private List<Clients> listSQLQuery; 
listSQLQuery = dbConnect.Select("select * from  clients");
datagridview.DataSource = listSQLQuery;

我使用的dboConnect.Select()方法如下:

public List<Clients> Select(string query)
{        


    //Create a list to store the result
    List<Clients> list = new List<Clients>();
   Clients clients = new Clients();


    //Open connection
    if (this.OpenConnection() == true)
    {
        //Create Command
        MySqlCommand cmd = new MySqlCommand(query, connection);
        //Create a data reader and Execute the command
        MySqlDataReader dataReader = cmd.ExecuteReader();

        //Read the data and store them in the list
        while (dataReader.Read())
        {
            clients.Id = dataReader["Id"].ToString();
            clients.Name = dataReader["Name"].ToString();
            list.Add(cliente);
        }

        //close Data Reader
        dataReader.Close();

        //close Connection
        this.CloseConnection();

        //return list to be displayed
        return list;
    }
    else
    {
        return list;
    }
}

最后,我的客户类Clients。
public class Clients
{
    public string Id { get; set; }
    public string Name { get; set; }
}

这一切都是有效的,但非常特定于与客户端相关的查询。

如果现在我调用listSQLQuery=dbConnect.Select("select * from products"),这个方法将不起作用,因为它是使用返回客户列表而不是产品列表构建的。

我不知道我的问题是否清楚,但我希望能够像这样调用而不必担心是客户、产品还是房间。

类似这样:

listSQLQuery.dbConnect.Select("select * from clients");
listSQLQuery.dbConnect.Select("select * from products");
listSQLQuery.dbConnect.Select("select * from rooms");

有没有一种方法可以获得通用列表返回,而不用担心listQuerySQL的类型?我只想将此列表绑定到DataGridView。

我在C#方面很新手,所以我对LINQ、Entity Framework等一无所知...


是的,Linq和EF将是一个不错的选择!花些时间学习它,你绝对不会后悔选择它。 - Kath
如果您想将表列用作对象,您应该学习Linq和EF。这对您的情况非常有帮助。 - WooCaSh
可能是C# - 使用泛型将IDataReader映射到对象的重复问题。 - nawfal
2个回答

5
你可以像下面这样改变你的Select方法,并提供单独的方法来解析和创建实体实例从一个数据读取器。
public List<T> Select(string query)
{
...
while(dataReader.Read())
{
     list.Add(CreateInstance<T>(dataReader)):
}
...
}

private T CreateInstance<T>(DataReader dataReader)
[
     if(T is Client)
          return CreateClient(dataReader);
     else if(T is Manager)
          return CreateManager(dataReader);
...
}

private Client CreateClient(DataReader dataReader)
{
     return new Client(dataReader["id"], dataReader["name"]);
}

编辑:我不同意EF的建议。如果你是C#的新手,玩一些基础的东西会让你更容易理解EF和一些数据访问层模式。当你在项目中遇到问题并需要深入了解内部工作时,对系统的底层部分有信心非常重要。

如果你已经对数据访问层技术感到舒适,那么你可以轻松地转向EF或NHibernate。


0

我非常感谢你们所有人的帮助。 我曾考虑过创建一个用于搜索客户、一个用于产品和一个用于房间的方法......但我认为创建许多类似的方法是错误的。但从我所看到的情况来看,这不是一个坏选择。 - user1848998

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接