保存数据时,前几百条数据能很快地保存,但到后一些数据保存时出现如下错误:{"超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。" }保存数据的代码如下:public byte InsLog(Alarmlog log)
{
try
{
string cmdStr = @"insert into T_StationLog( StationLogID,LogTime, LogID, StationID) values" 
+ "('" +Guid.NewGuid()+"','" +log.DataTime +"','"+ log.LogID +"','"+ log.StationId +"')";
SqlConnection cn = new SqlConnection(_cnStr);
SqlCommand cmd = new SqlCommand(cmdStr,cn); //if(cn.State = )
cn.Open();
int i = cmd.ExecuteNonQuery cn.Close();
if(i>0)
return ErrorID.DB_Success;//正确保存
else
return ErrorID.DB_SaveError;//保存时出错

}
catch(Exception )
{
return ErrorID.DB_Exception;//数据库异常
}
}请问这是怎么回事呀?原来我一直都用的好好的,现在突然出这种错误了!

解决方案 »

  1.   

    用SqlTransaction(数据多的情况下就用)
      

  2.   

    自已搞定了,执行到
    cn.Open();
    int i = cmd.ExecuteNonQuery ();
    cn.Close();
    如果执行到int i = cmd.ExecuteNonQuery(),如果异常,如插入重复的记录,代码将抛出异常,此时连接没被关闭,所以在catch中判断并关闭连接就可以.另:如果有重复值,插入之前不判断,而是直接插入,在数据库中建立唯一性约束,这样保证了不会有重复的数据插入,但C#为什么要做为一个异常来处理呢?抛出异常的效率很低吧?如果没有这个表也是异常,所以我根本不知道这个异常是重复值还是真正有异常了?注意,不用插入之前判断的方法,还有好的方法吗?
      

  3.   

    try
    {
    string cmdStr = @"insert into T_StationLog( StationLogID,LogTime, LogID, StationID) values" 
    + "('" +Guid.NewGuid()+"','" +log.DataTime +"','"+ log.LogID +"','"+ log.StationId +"')";
    SqlConnection cn = new SqlConnection(_cnStr);
    SqlCommand cmd = new SqlCommand(cmdStr,cn); //if(cn.State = )
    cn.Open();
    int i = cmd.ExecuteNonQuery cn.Close();
    if(i>0)
    return ErrorID.DB_Success;//正确保存
    else
    return ErrorID.DB_SaveError;//保存时出错

    }
    catch(Exception )
    {
    return ErrorID.DB_Exception;//数据库异常
    }
                                finally
                                {
                                     if(cn!=null)cn.Close();
                                }
      

  4.   

    up
    怎么弄都不能恢复了,该怎么reset呢