写了一段统计代码,主要是用于统计提交月份的每天6:00-:23:00的分类消费数据,可但循环第一运行到22点时就提示出错,捕获异常后运行到每天的23点就出错!出错提示如下图:主要程序代码如下:/// <summary>
        /// 统计分析消费数据
        /// </summary>
        private void DataAnalysis()
        {
            string date;
            string k = " "; 
            int cct1=0, cct2=0, cct3=0, cct4=0, ccs=0;
            float cbs=0;
            DateTime dt1, dt2;
                        
            //MessageBox.Show(date);
            SqlConnection conn = new SqlConnection("server = .;User id=sa;Pwd=chris;Database=KCBusMag");
            try
            {
                //打开数据库
                conn.Open();
                labConn.Text = "连接数据库成功";
            }
            catch
            {
                labConn.Text = "连接数据库失败,请检查远程数据库连接字段";
            }            switch (cobMonth.Text)
            {
                case "01":
                case "03":
                case "05":
                case "07":
                case "08":
                case "10":
                case "12":
                    for (int d = 1; d <= 31; d++)
                    {
                        date = txtyear.Text + "-" + cobMonth.Text + "-" + d.ToString();
                        //MessageBox.Show(d.ToString());
                        for (int t = 6; t <= 23; t++)
                        {                            string h;
                            if (t <= 9)
                            {
                                h = date + k + "0" + t.ToString();
                                dt1 = Convert.ToDateTime(h + ":00:00");
                                dt2 = Convert.ToDateTime(h + ":59:59");
                                MessageBox.Show(dt1.ToString());
                            }
                            else
                            {
                                h = date + k + t.ToString();
                                dt1 = Convert.ToDateTime(h + ":00:00");
                                dt2 = Convert.ToDateTime(h + ":59:59");
                                MessageBox.Show(dt1.ToString());
                            }                            string QueryTJ = "SELECT  SUM(CASE WHEN rectype=1 THEN 1 ELSE 0 END) as cct1,SUM(CASE WHEN rectype=2 THEN 1 ELSE 0 END) as cct2,SUM(CASE WHEN rectype=3 THEN 1 ELSE 0 END) as cct3,SUM(CASE WHEN rectype=4 THEN 1 ELSE 0 END) as cct4, SUM(balance) as sb FROM EM_RecBuf WHERE Tdatetime BETWEEN '" + dt1 +"' AND '"+ dt2 + "'";
                            //MessageBox.Show(date + k + h + ":00:00");                            SqlCommand sqlcmd = new SqlCommand(QueryTJ,conn);
                            SqlDataReader ResultRead = sqlcmd.ExecuteReader();                            if (ResultRead.Read())
                            {
                                //try
                                //{
                                cct1 = int.Parse(ResultRead["cct1"].ToString());
                                cct2 = int.Parse(ResultRead["cct2"].ToString());
                                cct3 = int.Parse(ResultRead["cct3"].ToString());
                                cct4 = int.Parse(ResultRead["cct4"].ToString());
                                //cbs = float.Parse( ResultRead["sb"].ToString());
                                //}
                                //catch (Exception e)
                                //{
                                //    MessageBox.Show(e.ToString());
                                //}                            }
                            else 
                            {
                                MessageBox.Show("统计出错", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                this.Close();
                            }                            ccs = cct1 + cct2 + cct3 + cct4;                            MessageBox.Show(cct1.ToString() + " " + cct2.ToString() + " " + cct3.ToString() + " " + cct4.ToString() + " " + cbs.ToString());
                            //写入本地数据库
                            //SaveTolocal(date,h,cct1,cct2,cct3,cct4,ccs,cbs);
                            ResultRead.Close();
                        }
                    };
                    break;
                case "02":
           //………………同第一段,只是喜欢次数不同
           break;
                case "04":
                case "06":
                case "09":
                case "11":
                   // ……………………同第一段,只是喜欢次数不同
                    break;            }
            conn.Close();            MessageBox.Show("数据分析已完成,现在可以查看流量报表!","恭喜",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
            
        }请各位前辈指点,本人在这里拜谢了!

解决方案 »

  1.   

    一定要学会跟踪,代码可能本身没有毛病,应该是数据格式出现了问题;
    ││博客空间:http://blog.csdn.net/lovingkiss
    ││资源下载:http://download.csdn.net/user/lovingkiss
    ││Email:loving-kiss@163.com [MSN也是这个]
    ││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
    ╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤ 
      

  2.   

    cct1是个int,如果你读出来一个非整形数据——自然也就无法转换了;你断点后,看看
    ResultRead["cct1"]里面的信息到底是什么,才好判断问题所在;
      

  3.   

    恩,看看ResultRead["cct1"]里面的信息到底是什么。
      

  4.   

    回楼上的兄弟:
    cct1是次数统计,用COUNT统计的结果,统计的结果不超过1万!
      

  5.   

    我怀疑错误是在执行sqlcmd时发生的,另外,虽然出错,但是执行捕获异常后messagebox仍然会给出统计结果!
      

  6.   

    既然6-22点都没问题,程序的代码段应该问题不太大,错误出现在DB中,先去数据库中看看每天22-23点的数据记录是不是和别的时间段不一样.
    然后跟踪代码断点看看 ResultRead["cct1"]里面的信息到底是什么,才好判断问题所在;
      

  7.   

    差了一下数据库,好像有些是22点以后没有数据,有些事23点以后没有数据,估计应该是的查询时(WHERE Tdatetime BETWEEN)没有这个时间段的数据就出错了,如果是这样,应该怎么修改呢?
      

  8.   

    ISNULL(Tdatetime , 'sometime')
    替换下?
      

  9.   

    建议使用ResultRead.GetInt32(int)这个方法。
      

  10.   


    那怎么将这句
    string QueryTJ = "SELECT  SUM(CASE WHEN rectype=1 THEN 1 ELSE 0 END) as cct1,SUM(CASE WHEN rectype=2 THEN 1 ELSE 0 END) as cct2,SUM(CASE WHEN rectype=3 THEN 1 ELSE 0 END) as cct3,SUM(CASE WHEN rectype=4 THEN 1 ELSE 0 END) as cct4, SUM(balance) as sb FROM EM_RecBuf WHERE Tdatetime BETWEEN '" + dt1 +"' AND '"+ dt2 + "'";当Tdatetime时段不存在时,将返回值替换成0呢!
      

  11.   

    cct1 = ResultRead["cct1"] == DBNull.Value ? 0 : Convert.ToInt32(ResultRead["cct1"]);
      

  12.   


    谢谢,这样就没有出错了,只是我还不太理解DBNull.Value,先去百度补习下!
    谢谢各位兄弟的指点!
      

  13.   

    cct1 = ResultRead["cct1"] == DBNull.Value ? 0 : Convert.ToInt32(ResultRead["cct1"]);//ResultRead["cct1"]为DBNULL(查询结果为SQLTypes的空值)
      

  14.   

    额!!cbs = ResultRead["sb"] == DBNull.Value ? 0: Convert.      ???
    cbs是float类型,但是好像没有办法写成Convent.的这种强制转换,可以写成float.Parse(ResultRead["sb"])吗?
      

  15.   

    float型可以这样写:Convert.ToSingle(
      

  16.   

    ResultRead.GetInt(0)...
    用这种吧,要不就用int.TryParse