我的一个读取远程服务器数据的程序,在出现网络错误的时候,下面的函数会挂掉
public static IList loadByTop(int n)
{
SqlConnection conn = null;
SqlCommand cmd = null;
SqlDataReader reader = null;
ArrayList list = new ArrayList();
try
{
conn = new SqlConnection("Data Source=; Max Pool Size = 5; Min Pool Size = 3; Initial Catalog=;User ID =;;Password=;");
conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = String.Format("select * from phs_deliver");
reader = cmd.ExecuteReader();
while (reader.Read())
{
PhsDeliverDb obj = new PhsDeliverDb();
obj.ID = int.Parse(reader.GetValue(0).ToString());
list.Add(obj);
}
}
catch(SqlException ep)
{
//show message
}
finally
{
if (reader != null) { cmd.Cancel(); cmd.Parameters.Clear();        
                   reader.Close(); 
          }
if (conn != null) { conn.Close(); }
}
return list;
}

解决方案 »

  1.   

    reader = cmd.ExecuteReader();
    while (reader.Read())
    ...得到reader对象后,要检验是否为null,否则执行Read()方法会导致异常。
      

  2.   

    还有conn对象,不判断是否为null,就直接调用Open方法,也可能异常
      

  3.   

    晕死...楼上的,请问在楼主贴的代码中,什么情况下Open和Read的时候conn或reader 会为null ????即使万一哪种没有意料的情况使他null了,外面不是捕捉了么?不过楼主的写法确实是有些郁闷.....
    SqlConnection conn = new SqlConnection("...");
    SqlCommand cmd = new SqlCommand("...",conn);
    try{
    conn.Open();
    }
    catch
    {
    //连接都打不开...处理完就 return 了...下面也不需要走了...
    }
    using(SqlDataReader reader =cmd.ExecuteReader(CommandBehavior.CloseConnection))
    {
    while (reader.Read())
    {
    //.....do sth...
    }
    }
    }这么写也省得你去关这个关那个的...
      

  4.   

    嘿嘿,楼上的,我的写法主要是为了偷懒,让代码看起来没有那么多try,catch.如果要改成每个有可能出错的地方都try的话,哪个 reader.GetValue(0).ToString()(虽然我只写了一行取值,实际上有很多条,这种取值如果取到空就会在付值得时候出现异常(付值前判断是否为dbnull可避免这样的问题,但是写起来就太多重复代码)都有可能出现异常.而且那要是把所有地方都加上try,这个代码就难看了。所以干脆在外面来个滚包。这个函数的问题是为什么已经用try包完了,还会出现异常。就是说网络异常抓不下来