数据读取器异常

DataReader Exception

我有一个正在使用的简单数据库。它包含两个用户条目,一个是用户 ID 为 1 且 IsAdmin 为 0 的用户,另一个是用户 ID 为 3041234567 且 IsAdmin 为 1 的用户。数据库中唯一的字段是一个字符串 UserID 和一个位 IsAdmin。我正在使用以下代码从数据库中读取:

SqlConnection conn = new SqlConnection(Properties.Settings.Default.Conn);
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE UserID = " + t.Text.ToString(), conn);
SqlDataReader reader = cmd.ExecuteReader();

if (reader.HasRows)
{

    while (reader.Read())
         {
                user.UserID = reader["UserID"].ToString();
                user.IsAdmin = Convert.ToBoolean(reader["IsAdmin"]);
         }
}

conn.Close();

如果我输入数字 3041234567 作为用户 ID,一切正常,但如果我输入数字 1,我会得到一个异常提示 "The conversion of the nvarchar value '3041234567' overflowed an int column."

如果我设置一个断点并观察 while(reader.read()) 循环,循环会很好地迭代并设置 user.UserID = 1 和 user.IsAdmin = false。当循环开始第二次迭代时抛出异常。我想我有几个问题:

  1. 为什么循环迭代了第二次?
  2. 如何使用 sql 命令返回 ID 3041234567 "SELECT * FROM Users WHERE UserID = 1"
  3. 溢出的 int 列是什么?

嗯,自从

  3041234567 > int.MaxValue ( == 2147483647)

溢出;但是,如果您想要某种整数值,请尝试 long(64 位长):

  long value = Convert.ToInt64(reader["UserID"]);

像这样:

 // Wrap IDisposable into using 
 using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.Conn)) {
   conn.Open();

   // Make sql 
   //  1. Readable 
   //  2. Parametrized
   //  3. Avoid * in select
   String sql = 
     @"select UserID,
              IsAdmin
         from Users
        where UserID = @prm_UserId";

   // Wrap IDisposable into using 
   using (SqlCommand cmd = new SqlCommand(sql, conn)) {
     // Explicit data type will be better here (Add Parameter with type)
     // but I don't know it
     cmd.Parameters.AddWidthValue("prm_UserId", t.Text);  

     // Wrap IDisposable into using 
     using (SqlDataReader reader = cmd.ExecuteReader()) {
       // You don't want to iterate the whole cursor, but the first record 
       if (reader.Read()) {
         //TODO: Make UserID being "long"
         user.UserID = Convert.ToInt64(reader["UserID"]);
         user.IsAdmin = Convert.ToBoolean(reader["IsAdmin"]);
       } 
     }
   }
 }