private void button1_Click(object sender, EventArgs e)
        {
            string  con = getconnection();
            using (SqlConnection conn = new SqlConnection(con))
            {
                conn.Open();   //连接数据库
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "select * from 道路_事故信息视图 where 道路名称 =" + textBox1.Text ;
                SqlDataReader sdr=cmd.ExecuteReader();//执行查找记录的命令
                int qdzh=(int)sdr[2];//起点桩号
                int zdzh=(int)sdr[3];//终点桩号
                int dlzh=(int)sdr[4];//事发桩号              
                int buch=Convert.ToInt32(textBox2.Text);//检测步长
                int count=0;//统计事故数量
                int biaozhun=Convert.ToInt32(textBox3.Text);//检测标准,即事故率临界值
              
                    for (int qdzhi = qdzh; qdzhi <= zdzh; qdzhi += buch)
                    {
                        while (sdr.Read())
                        {
                              if (dlzh>= qdzhi && dlzh <= qdzhi + buch)
                              {
                                    count++;                               }
                            
                            double shigurate = count / buch;//计算事故率
                            if (shigurate > biaozhun)
                            {
                                cmd.CommandText = "insert into 黑点路段统计表 (路段名称,起点桩号,终点桩号,里程事故率,检测临界值) values(@路名,@起点,@终点,@事故率,@标准)";
                                cmd.Parameters.Add("@路名", SqlDbType.NVarChar, 50).Value = textBox1.Text;
                                cmd.Parameters.Add("@起点", SqlDbType.Int).Value = qdzhi;
                                cmd.Parameters.Add("@终点", SqlDbType.NChar).Value = qdzhi + buch;
                                cmd.Parameters.Add("@事故率", SqlDbType.Decimal).Value = shigurate;
                                cmd.Parameters.Add("@标准", SqlDbType.Decimal).Value = biaozhun;
                                int i = cmd.ExecuteNonQuery();
                            }
                        }
                    }
                
                //显示检测结果
                cmd.CommandText ="select *from 黑点路段统计表 ";
                DataSet ret =new DataSet ();
                SqlDataAdapter adapter=new SqlDataAdapter ();
                adapter .SelectCommand =cmd;
                adapter.Fill (ret);
                dataGridView1.DataSource=ret.Tables [0];
 
            }
        }

解决方案 »

  1.   

    private void button1_Click(object sender, EventArgs e)
       {
       string con = getconnection();
       using (SqlConnection conn = new SqlConnection(con))
       {
       conn.Open(); //连接数据库
       SqlCommand cmd = new SqlCommand();
       cmd.Connection = conn;
       cmd.CommandType = CommandType.Text;
       cmd.CommandText = "select * from 道路_事故信息视图 where 道路名称 =" + textBox1.Text ;
       SqlDataReader sdr=cmd.ExecuteReader();//执行查找记录的命令
       int qdzh=(int)sdr[2];//起点桩号
       int zdzh=(int)sdr[3];//终点桩号
       int dlzh=(int)sdr[4];//事发桩号   
      int buch=Convert.ToInt32(textBox2.Text);//检测步长
       int count=0;//统计事故数量
       int biaozhun=Convert.ToInt32(textBox3.Text);//检测标准,即事故率临界值
         
      for (int qdzhi = qdzh; qdzhi <= zdzh; qdzhi += buch)
       {
       //在这里加个判断,if(sdr.HasRows)
       while (sdr.Read())
       {
       if (dlzh>= qdzhi && dlzh <= qdzhi + buch)
       {
       count++;   }
         
      double shigurate = count / buch;//计算事故率
       if (shigurate > biaozhun)
       {
       cmd.CommandText = "insert into 黑点路段统计表 (路段名称,起点桩号,终点桩号,里程事故率,检测临界值) values(@路名,@起点,@终点,@事故率,@标准)";
       cmd.Parameters.Add("@路名", SqlDbType.NVarChar, 50).Value = textBox1.Text;
       cmd.Parameters.Add("@起点", SqlDbType.Int).Value = qdzhi;
       cmd.Parameters.Add("@终点", SqlDbType.NChar).Value = qdzhi + buch;
       cmd.Parameters.Add("@事故率", SqlDbType.Decimal).Value = shigurate;
       cmd.Parameters.Add("@标准", SqlDbType.Decimal).Value = biaozhun;
       int i = cmd.ExecuteNonQuery();
       }
       }
       }
         
      //显示检测结果
       cmd.CommandText ="select *from 黑点路段统计表 ";
       DataSet ret =new DataSet ();
       SqlDataAdapter adapter=new SqlDataAdapter ();
       adapter .SelectCommand =cmd;
       adapter.Fill (ret);
       dataGridView1.DataSource=ret.Tables [0];
      
      }
       }
      

  2.   

    for循环中不能无条件的sdr.Read,如果没有数据就会报错
      

  3.   

    你能保证for (int qdzhi = qdzh; qdzhi <= zdzh; qdzhi += buch)
    这个循环过程中sdr.Read一直能读到值吗,比如for循环是100次,而你的数据集只有90条记录,当循环到91时,不就出错了吗
      

  4.   

    仅仅只有SqlDataReader sdr=cmd.ExecuteReader();//是不够的,你没有读数据啊
    你需要调用sdr.Read()
      

  5.   


    楼上正解,楼主为何要在for循环去执行下面的动作?
     while (sdr.Read())
      {}
    正常就在
     while (sdr.Read())
      {}
    做你要做的事情就好了。