5

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

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

  我的疑问是关于进行搜索并返回结果。

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

  我设法进行搜索,从我的桌子上返回所有客户。但我的大问题是:如何制作这种通用方法?

  例如

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

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;
    }
}

最后,我的班级客户

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 的类型?我只想将此列表绑定到数据网格视图。

我是 C# 的新手,所以我对 LINQ、实体框架一无所知...

4

2 回答 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 和一些 DAL 模式。当您在项目中遇到困难并且需要更深入地了解内部工作时,对系统的较低级别部分充满信心非常重要。

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

于 2012-11-24T07:08:40.753 回答
0

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

实体框架视频

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

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

于 2012-11-24T07:04:26.953 回答