void getMessage()
    {
         DateTime dt ;
         SqlConnection con = new SqlConnection(ConnectionString);
         con.Open();
        try
        {
            string sql = "select * from jq_it where co_id='" + co_id + "'";
            SqlCommand com = new SqlCommand(sql, con);
            SqlDataReader dr = com.ExecuteReader();
            if (dr.Read())
            {
                dr.Read();
                TextBox1.Text = co_id;
                TextBox2.Text = dr.GetString(1);
                TextBox17.Text = dr.GetString(2);
                TextBox4.Text = dr.GetString(4);
                TextBox5.Text = dr.GetString(5);
                TextBox6.Text = dr.GetString(6);
                TextBox7.Text = dr.GetString(7);
                TextBox8.Text = dr.GetString(8);
                TextBox9.Text = dr.GetString(9);
                TextBox10.Text = dr.GetString(10);
                TextBox11.Text = dr.GetString(11);
                TextBox12.Text = dr.GetString(12);
                TextBox13.Text = dr.GetString(13);
                TextBox14.Text = dr.GetString(14);
                TextBox15.Text = dr.GetString(15);
                DropDownList2.ClearSelection();
                DropDownList2.Items.FindByValue(dr.GetString(16)).Selected = true;                TextBox16.Text = dr.GetString(17);
                TextBox18.Text = dr.GetString(18);
                TextBox19.Text = dr.GetDateTime(19).ToShortDateString();                DropDownList1.ClearSelection();
                DropDownList1.Items.FindByValue(dr.GetInt32(20).ToString()).Selected = true;                dt = dr.GetDateTime(19);
                TextBox20.Text = dr.GetString(21);
                TextBox21.Text = dr.GetString(22);
            }
           
        }
        catch (Exception ex)
        {
            Response.Write("<script> alert ('" + ex.Message.ToString() + "')</script>");
        }
        finally
        {
            con.Close();
        }    }
在没有任何数据时进行无效的读取尝试,报的这个错误,我调试的时候走到dr.Read()这直接跳到catch那里了
这是为什么啊

解决方案 »

  1.   

    取值前先判断
    if(dr.HasRows)
      

  2.   

    不应该啊if (dr.Read())这里已经作判断的拉
      

  3.   

     if (dr.Read()) ---这里出错?
                { 
                    dr.Read(); ---这里出错?dr.read方法应该就可以进行判断了,假如有数据也将游标放在了第一条记录上了,下面也不应该用dr.read了吧?
      

  4.   

    你要清楚dr.Read()的含义。
     if (dr.Read()) 这里已经读取了一条数据,
                { 
                    dr.Read(); ---这个时候游标又自动读下一条数据了,所以,你是永远也取不到第一条数据的。
    .....
    }
    所以,我相信报错的情况并不是没有数据,而是有且只有一条数据的时候。
    也就是 if (dr.Read())这里已经通过,然后继续执行dr.Read()将游标指向了下一条数据,而下一条数据明显是Null,接下来的赋值产生了错误。
      

  5.   

    你要清楚dr.Read()的含义。
     if (dr.Read()) 这里已经读取了一条数据,
                { 
                    dr.Read(); ---这个时候游标又自动读下一条数据了,所以,你是永远也取不到第一条数据的。
    .....
    }
    所以,我相信报错的情况并不是没有数据,而是有且只有一条数据的时候。
    也就是 if (dr.Read())这里已经通过,然后继续执行dr.Read()将游标指向了下一条数据,而下一条数据明显是Null,接下来的赋值产生了错误。
      

  6.   

    解决方法:将第二个dr.read()删除即可。希望你自己能理解并明白。
      

  7.   


    你的意思是想在没有任何数据的时候也能取到值??
    等我想到怎么样可以拿一张没有余额的银行卡从ATM里取出钱来后再回答你这个问题。
      

  8.   

    你的数据库里就是空的吧。  最好的办法是把你的SQL语句先执行一下,看看有没有记录。
      

  9.   

    if (dr.Read()) ---这里出错? 
                { 
                    dr.Read(); ---这里出错? dr.read方法应该就可以进行判断了,假如有数据也将游标放在了第一条记录上了,下面也不应该用dr.read了吧?
    ----------------------------------------
    我这里很明确的说明了问题,其次你这个getmsg方法是放在哪里了?建议你单步跟踪下
      

  10.   

    引用 9 楼 kapapa 的回复:
    引用 8 楼 zjmotion 的回复: 
    解决方法:将第二个dr.read()删除即可。希望你自己能理解并明白。 
    删了,在没有任何数据时进行无效的读取尝试,这个错不报了,但是还是取不到里面的值 
     你的意思是想在没有任何数据的时候也能取到值?? 
    等我想到怎么样可以拿一张没有余额的银行卡从ATM里取出钱来后再回答你这个问题。
    ----------------------------
    请问lz如何取不到值?是那个co_id取不到还是后面的getstring得不到值?第一你要先确定调试的时候选用的值(co_id)是能找到相应的记录,其次字段值也是有的而不是dbnull!
      

  11.   

    知道哪错了
    DropDownList2.Items.FindByValue(dr.GetString(16)).Selected = true; 
    这里有问题
      

  12.   

    DropDownList2.Items.FindByValue(dr.GetString(16)).Selected = true; 
    --------------------------------
    通常不会这样使用
    而是先判断字段是否是为isdbnull,不过看来是你的dropdownlist没有相应字段的这个值(可能字段值为空,而你的dropdownlist的item没有空值项,所以默认选择第一个)
      

  13.   

    有这个字段的,是默认选第一项
    -------
    不是没有字段,是相应字段(datareader里面)的值可能为空。你先单步调试看看datareader取出来是什么值,然后使用dropdownlist.selectedvalue=这个值在看看
      

  14.   

    尽量不要用序号取值,因为你前面用的是select * ,以后数据结构变了,代码也得改。
    改成dr["字段名"].ToString();而且判断一个这个值在DropDownList2的item中有没有对应。
      

  15.   


     
    尽量不要用序号取值,因为你前面用的是select * ,以后数据结构变了,代码也得改。 
    改成dr["字段名"].ToString(); 而且判断一个这个值在DropDownList2的item中有没有对应。
    [/Quote]这样写不对报错
      

  16.   

    1 select a1,a2 from ...
    2 dr["a1"].ToString();
      

  17.   

    汗,我的意思和cpp一样
    首先你的sql查询语句应该改成类似我写的1那种方式!!!!!
    然后if(dr.read())
    {
      string temp=  dr["字段名"].ToString();
    }
    类似这样赋值。
      

  18.   

    string temp=  dr["字段名"].ToString(); 
    ---
    前提是你的sql语句查询字段包含了该字段名
      

  19.   

    两个 dr.read()
    明显错了不判断怎么可以 
    if(rd.read())
    {
    if(rd.read())
    {}
    }
    如果 LZ 是想获取 第2条记录 也没有必要这样吧
    int i=0;
    while(rd.Read())
    {
    if(i==1)
    {
    //处理
    }
    i++;
    }
    linq:
    (from a in list
    select a).skip(1)
      

  20.   

    如果dr[16]为空或Null,则dr.GetString(16)这样就会报错。
    建议使用Convert.ToString(dr[16])
      

  21.   

    这么个问题 一堆人解决不了,把IF 换成while 就行了!!!