C# 对用户进行身份验证并将其定向到正确的菜单时出现Switch语句问题

C# 对用户进行身份验证并将其定向到正确的菜单时出现Switch语句问题,c#,sql-server,wpf,authentication,switch-statement,C#,Sql Server,Wpf,Authentication,Switch Statement,我正在尝试实现单点登录,但在(reader.HasRows.Count==1)和(reader.HasRows[0][“CD_EMP_TYPE”]as string)上出现错误 我也使用过(Row),但它不起作用 来自: SqlDataReader提供了一种从SQLServer数据库中读取仅向前的行流的方法 这意味着您无法使用读取器确定查询返回的行数 但是你不需要。只需调用read()方法即可读取下一行: private void btnSubmitt_Click(object

我正在尝试实现单点登录,但在(reader.HasRows.Count==1)和(reader.HasRows[0][“CD_EMP_TYPE”]as string)上出现错误 我也使用过(Row),但它不起作用

来自:

SqlDataReader
提供了一种从SQLServer数据库中读取仅向前的行流的方法

这意味着您无法使用读取器确定查询返回的行数

但是你不需要。只需调用
read()
方法即可读取下一行:

        private void btnSubmitt_Click(object sender, RoutedEventArgs e)
    {
        using (var conn = new SqlConnection("Data Source=WINDOWS-B1AT5HC\\SQLEXPRESS;Initial Catalog=CustomerRelations;Integrated Security=True;"))
        using (var cmd = conn.CreateCommand())

        {
            conn.Open();
            cmd.CommandText = "SELECT * FROM [Users] WHERE [TX_EMPLOYEE] = @userName";
            cmd.Parameters.AddWithValue("@userName", Environment.UserName);
            using (var reader = cmd.ExecuteReader())

                if (reader.HasRows.Count == 1)
                {
                        switch (reader.HasRows[0]["CD_EMP_TYPE"] as string)
                        {
                            case "0":
                                {
                                    Window1 AdminMenu = new Window1();
                                    AdminMenu.Show();
                                    this.Close();
                                    break;
                                }
                            case "1":
                                {
                                    MainWindow AnalystMenu = new MainWindow();
                                    AnalystMenu.Show();
                                    this.Close();
                                    break;
                                }
                            default:
                                {
                                    label1.Content = "SSO authentication unsuccessful. Please contact your database administrator";
                                    break;
                                }

                        }

                }

        }

    }

如果查询可能返回多行,则应在循环中调用
Read()
。有关示例,请参见上面的文档链接。

为什么要调用
ExecuteScalar
?您的查询实际返回多少行?也许您应该尝试使用
从[Users]中选择TOP 1*,其中[TX_EMPLOYEE]=@userName
?通过一些研究,建议使用它。我尝试使用TOP1并删除ExecuteScaler,但没有成功。我看的是一列从单个单元格返回的信息@mm8这是否回答了你的问题@SMor谢谢,这有助于我理解何时适合使用Execute Scaler。但是,我仍然在为我的解决方案而挣扎。您之所以挣扎,是因为您误用了这些函数。使用该函数的全部目的是简化检索单个(标量)值所需编写的代码。使用executereader遍历行和列。更改您使用的函数或更改您的查询-它们需要逻辑匹配。谢谢!我在字符串CD_EMP_TYPE=reader.GetString(“CD_EMP_TYPE”)上遇到一个“无法从字符串转换为int”错误;更具体地说,“CD_EMP_TYPE”)@IanMark:这意味着
CD_EMP_TYPE
是数据库中的
int
列,您应该这样处理它。请参阅我的编辑。我尝试了这一点,但仍然得到了相同的错误,现在我得到了一个关于case(0&1)的错误,它表示“无法隐式地将类型字符串转换为int”。我试着使用GetInt64和16,但没有成功。在哪一行出现异常?在(“CD_EMP_TYPE”);现在是(案例“0”)和(案例“1”)
private void btnSubmitt_Click(object sender, RoutedEventArgs e)
{
    using (var conn = new SqlConnection("Data Source=WINDOWS-B1AT5HC\\SQLEXPRESS;Initial Catalog=CustomerRelations;Integrated Security=True;"))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "SELECT TOP 1 CD_EMP_TYPE FROM [Users] WHERE [TX_EMPLOYEE] = @userName";
        cmd.Parameters.AddWithValue("@userName", Environment.UserName);
        using (var reader = cmd.ExecuteReader())
        {
            reader.Read();
            int CD_EMP_TYPE = reader.GetInt32(0);
            switch (CD_EMP_TYPE)
            {
                case 0:
                    {
                        Window1 AdminMenu = new Window1();
                        AdminMenu.Show();
                        this.Close();
                        break;
                    }
                case 1:
                    {
                        MainWindow AnalystMenu = new MainWindow();
                        AnalystMenu.Show();
                        this.Close();
                        break;
                    }
                default:
                    {
                        label1.Content = "SSO authentication unsuccessful. Please contact your database administrator";
                        break;
                    }
            }
        }
    }
}