C# 仅选择职务为“服务员”的员工
我使用的是sql server 2012和visual studio 2010,到目前为止,我拥有的是数据库中的一个表和一个小型c#应用程序,它将员工加载到C# 仅选择职务为“服务员”的员工,c#,mysql,sql,visual-studio-2010,sql-server-2012,C#,Mysql,Sql,Visual Studio 2010,Sql Server 2012,我使用的是sql server 2012和visual studio 2010,到目前为止,我拥有的是数据库中的一个表和一个小型c#应用程序,它将员工加载到datagridview 然而,我想做的是只选择工作头衔为“服务员”的员工 到目前为止,我已经编写了关于添加记录、编辑、删除和显示整个数据的查询 到目前为止,我仅通过读取指定列来显示名称: private void LoadEmpName() { sc.Close();
datagridview
然而,我想做的是只选择工作头衔为“服务员”的员工
到目前为止,我已经编写了关于添加记录、编辑、删除和显示整个数据的查询
到目前为止,我仅通过读取指定列来显示名称:
private void LoadEmpName()
{
sc.Close();
try
{
sc.Open();
cmd.CommandText = "select * from myEmployees";
dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
lstNames.Items.Add(dr[1].ToString());
}
}
sc.Close();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
是否可以更改我的现有代码,以便只显示列为“服务员”的员工(仅显示名字),或者我必须编写完全不同的查询 如果您有一个名为“JobTitle”的列,那么您的查询将变成:
"select * from myEmployees where JobTitle like '%waiter%'";
“like”是比较运算符,“%”是任意字符数的通配符
如果您想查询不同的内容,可以使用几种方法。最简单的方法是创建一个查询字符串中包含兼职测试的新方法:
"select * from myEmployees where PartTime = 1";
但是,对于用户可以执行的每个可能的搜索,您都需要一个新的查询,这将导致维护效率低下
在填充数据网格时,应该考虑在客户机中进行过滤。您带来了所有数据(如果有大量数据,则使用分页),然后让用户通过指定自己的筛选器来决定他们感兴趣的信息。您应该在SQL查询中添加一个
where
子句。我不知道你的数据库结构,但类似于
cmd.CommandText = "select * from myEmployees where title='waiter'";
在SQL中进行过滤比在C#中进行过滤要高效得多。Discalimer:OP询问“是否可以更改我现有的代码,以便只显示列为“服务员”的员工(仅显示名字),或者我必须编写完全不同的查询?”
因此,纯粹为了回答这个问题,您不必使用新的查询。您可以在这样添加之前放置一个if(假设您的第二列是“职务”):
尽管我不建议您这样做。您必须更改查询。这是更好的方法。 我喜欢@CrisF解决方案。只需添加即可。
private void LoadEmpName()
{
try
{
sc.Open();
//it will return all employees containing word waiter in Column JobTitle.
cmd.CommandText = "select * from myEmployees where JobTitle like '%waiter%' ";
dr = cmd.ExecuteReader();
while (dr.Read())
{
lstNames.Items.Add(dr[1].ToString());
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
finally
{
sc.Close();
}
}
请注意:您不需要
if(dr.HasRows)
-如果没有行,dr.Read()
将返回false,并且while循环将不会执行。您可以详细说明为什么不推荐它吗?:)只是因为这不是正确的方法。正确的方法是修改查询,只选择您需要的行,正如其他海报所提到的那样。这样更高效、更干净。你可能想在答案中添加更多描述。比如请更改你的查询等。
while (dr.Read())
{
if(dr[2].ToString().EqualsIgnoreCase("Waiter")){
lstNames.Items.Add(dr[1].ToString());
}
}
private void LoadEmpName()
{
try
{
sc.Open();
//it will return all employees containing word waiter in Column JobTitle.
cmd.CommandText = "select * from myEmployees where JobTitle like '%waiter%' ";
dr = cmd.ExecuteReader();
while (dr.Read())
{
lstNames.Items.Add(dr[1].ToString());
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
finally
{
sc.Close();
}
}