如何修复C#中的"Specified cast is not valid"错误?

21 浏览
0 Comments

如何修复C#中的"Specified cast is not valid"错误?

问题是,我需要在我的应用程序中显示一个列表。\n我按照要求为IsAdmin创建了一个SQL的int类型,并且在学校里他们告诉我在应用程序中将这个int显示为bool,更确切地说是显示IsAdmin = TrueFalse?\n但是当我启动应用程序并通过登录界面时,异常显示了以下消息:\n

\n\"指定的强制转换无效!\"\n

\n我应该怎么做?\n

    \n

  • 我尝试将其转换为(bool)reader[\"IsAdmin\"].ToInt32,但是显示错误。
  • \n

  • 我尝试将其更改为整数,但是它显示为1和0。
  • \n

\n

        public static List GetAllUsers() {
            List korisnici = new List();
            Korisnik korisnik = null;
            using (SqlConnection conn = new SqlConnection()) {
                conn.ConnectionString = ConfigurationManager.ConnectionStrings["ConnString"].ToString();
                conn.Open();
                SqlCommand command = new SqlCommand("SELECT ID, UserName, UserPass, IsAdmin FROM Users01", conn);
                using (SqlDataReader reader = command.ExecuteReader()) {
                    while (reader.Read()){
                        korisnik = new Korisnik((int)reader["ID"], (string)reader["UserName"], (string)reader["UserPass"], (bool)reader["IsAdmin"]);
                        korisnici.Add(korisnik);
                    }
                }
            }
            return korisnici;
        }

0
0 Comments

问题出现的原因是尝试将一个整数类型的值赋给一个布尔类型的变量,这是不允许的。解决方法是将整数类型的值转换为布尔类型的值。

具体地,将下面的代码:

korisnik = new Korisnik((int)reader["ID"], 
                        (string)reader["UserName"], 
                        (string)reader["UserPass"], 
                        (bool)reader["IsAdmin"]);

修改为:

korisnik = new Korisnik((int)reader["ID"], (string)reader["UserName"], 
                        (string)reader["UserPass"], 
                        ((int)reader["IsAdmin"]) > 0 ? true : false ); // convert from int to bool

这里的转换是必要的,因为不能直接将一个整数类型的值赋给一个布尔类型的变量。我假设在数据库中,大于0的值表示用户是管理员。

虽然这是一个作业问题,但是从长远来看,最好在数据库中使用布尔类型(在这种情况下是BIT),因为:

  1. 它们在数据库中占用的空间更少(更有效率)
  2. 更明显地表明了列的用途
  3. 消除了转换问题,如问题中所述

需要在> 0之前是否仍然需要进行int类型的转换吗?

0