C# 对用户进行身份验证并将其定向到正确的菜单时出现Switch语句问题
我正在尝试实现单点登录,但在(reader.HasRows.Count==1)和(reader.HasRows[0][“CD_EMP_TYPE”]as string)上出现错误 我也使用过(Row),但它不起作用 来自: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
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;
}
}
}
}
}