我在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一无所知......
您可以像下面一样更改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.
我同意其他评论者的观点,如果你学习 EF 和 LINQ 会让你的生活变得更加轻松。
LINQ 简介视频
LINQ 查询简介网页
大量 LINQ 示例 C#
就您的解决方案而言,也许您可以制定 3 种不同的选择方法:SelectClients、SelectProduct 和 SelectRooms。您将需要更改一些代码,以便它仅打开和关闭连接一次。
| 归档时间: |
|
| 查看次数: |
6036 次 |
| 最近记录: |