首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataReader异常

DataReader异常
EN

Stack Overflow用户
提问于 2016-02-16 13:48:07
回答 1查看 628关注 0票数 0

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

代码语言:javascript
复制
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();

如果在UserID中输入数字3041234567,一切都工作得很好,但是如果输入数字1,就会得到一个异常,即“nvarchar值'3041234567‘的转换溢出了一个int列。”

如果我设置了一个断点,并观察了while(reader.read())循环,则循环会遍历精细,并设置user.UserID =1和user.IsAdmin = false。当循环开始第二次迭代时,会引发异常。我想我有几个问题:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-16 14:04:32

嗯,既然

代码语言:javascript
复制
  3041234567 > int.MaxValue ( == 2147483647)

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

代码语言:javascript
复制
  long value = Convert.ToInt64(reader["UserID"]);

就像这样:

代码语言:javascript
复制
 // 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"]);
       } 
     }
   }
 } 
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35434343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档