Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅选择职务为“服务员”的员工_C#_Mysql_Sql_Visual Studio 2010_Sql Server 2012 - Fatal编程技术网

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();

我使用的是sql server 2012和visual studio 2010,到目前为止,我拥有的是数据库中的一个表和一个小型c#应用程序,它将员工加载到
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();
        }
    }