如何创建通用列表并使用c#中的Select SQL Query填充

use*_*998 5 c# list

我在Visual Studio Express 2012中使用C#.我专门使用桌面应用程序.作为数据库,我使用MySQL

  数据库和MySQL之间的连接工作正常.

  我的疑问是关于搜索并返回结果.

  在我见过的所有示例中,最常见的是在我的类MySQL enter code here连接中创建一个方法,该方法将返回包含搜索结果的列表.我真的不知道这在概念上是否更正确,但似乎非常可以接受.

  我设法做了一个搜索,从我的桌子返回所有客户.但我的大问题是:如何制作这种通用方法?

  例如

  我的表单有一个触发click事件的按钮:

dbConnect = new DBConnect();
dbConnect.OpenConnection();
private List<Clients> listSQLQuery; 
listSQLQuery = dbConnect.Select("select * from  clients");
datagridview.DataSource = listSQLQuery;
Run Code Online (Sandbox Code Playgroud)

我上面使用的方法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;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我的班级客户

public class Clients
{
    public string Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这一切都有效,但非常特定于客户端的查询.

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

  我不知道我的问题是否可以清楚,但我希望我可以打电话,不用担心它会成为客户,产品还是房间.

像这样的东西:

listSQLQuery.dbConnect.Select("select * from clients");
listSQLQuery.dbConnect.Select("select * from products");
listSQLQuery.dbConnect.Select("select * from rooms");
Run Code Online (Sandbox Code Playgroud)

   有没有办法获得泛型列表返回,而不用担心listQuerySQL的类型?我只想将此列表绑定到datagridview.

我是C#的新手,所以我对LINQ,Entity Framework一无所知......

Mer*_*aya 5

您可以像下面一样更改Select方法,并提供单独的方法来从datareader解析和创建实体的实例.

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"]);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我不同意EF的建议.由于您是C#的新手,因此使用一些基本内容可以让您更轻松地理解EF和一些DAL模式.当您在项目中碰壁并且需要深入了解内部工作时,对系统的较低级别部分感到自信是非常重要的.

如果您已经对DAL技术感到满意,可以轻松跳转到EF或NHibernate.


MVC*_*arl 0

我同意其他评论者的观点,如果你学习 EF 和 LINQ 会让你的生活变得更加轻松。

实体框架视频

LINQ 简介视频
LINQ 查询简介网页
大量 LINQ 示例 C#

就您的解决方案而言,也许您可​​以制定 3 种不同的选择方法:SelectClients、SelectProduct 和 SelectRooms。您将需要更改一些代码,以便它仅打开和关闭连接一次。