C# ExecuteOnQuery需要打开且可用的连接。连接';的当前状态正在连接

C# ExecuteOnQuery需要打开且可用的连接。连接';的当前状态正在连接,c#,C#,我正在使用c#应用程序从tcp客户端接收字符串。并存储在数据库中(SQLServer2005)。应用程序工作正常,但有时会出错 “ExecuteOnQuery需要一个打开且可用的连接。该连接的当前状态为正在连接” 它每天都会出现。重新启动应用程序。它工作正常。过一段时间错误就会出现 当我得到这个错误时,我的代码已经丢失,它并没有在数据库中存储我的代码 try { if (Latitude != 0 && Longitude != 0) {

我正在使用c#应用程序从tcp客户端接收字符串。并存储在数据库中(SQLServer2005)。应用程序工作正常,但有时会出错

“ExecuteOnQuery需要一个打开且可用的连接。该连接的当前状态为正在连接”

它每天都会出现。重新启动应用程序。它工作正常。过一段时间错误就会出现

当我得到这个错误时,我的代码已经丢失,它并没有在数据库中存储我的代码

 try
 {
      if (Latitude != 0 && Longitude != 0)
      {                               
           SqlCommand cmd = new SqlCommand("Insert_Mapapp", con);
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.Parameters.Add(new SqlParameter("@Latitude", Latitude));
           cmd.Parameters.Add(new SqlParameter("@Longitude ", Longitude));
           cmd.Parameters.Add(new SqlParameter("@Speed", Speed));
           cmd.Parameters.Add(new SqlParameter("@Battery_ADC ", Battery_ADC));
           cmd.Parameters.Add(new SqlParameter("@sDateTime ", sDateTime));
           cmd.Parameters.Add(new SqlParameter("@Main_Backup_Battery ", Main_Backup_Battery));
           cmd.Parameters.Add(new SqlParameter("@Pulse_Counter ", Pulse_Counter));
           cmd.Parameters.Add(new SqlParameter("@Number_of_Satellites ", Number_of_Satellites));
           cmd.Parameters.Add(new SqlParameter("@IgnitionStatus ", IgnitionStatus));
           cmd.Parameters.Add(new SqlParameter("@Condition_Inputs ", Condition_Inputs));
           cmd.Parameters.Add(new SqlParameter("@FuelADC ", FuelADC));
           cmd.Parameters.Add(new SqlParameter("@UID ", UnitID));
           cmd.Parameters.Add(new SqlParameter("@Device_IP", remoteIP));
           cmd.Parameters.Add(new SqlParameter("@Device_Port", remotePort));
           cmd.Parameters.Add(new SqlParameter("@String_Count", UIDCounter));
           cmd.Parameters.Add(new SqlParameter("@Stored", Stored));
           // cmd.Parameters.Add("@Nofrec", SqlDbType.Int).Direction = ParameterDirection.Output;
           if (cmd.Connection.State == ConnectionState.Closed)
               cmd.Connection.Open();
           cmd.ExecuteNonQuery();

       }
       catch (Exception ex)
       {
         AddTextToListBox(ex.Message);
          AddTextToListBox(tmp);        

       }
       finally
       {
           if (con.State == ConnectionState.Open)
           con.Close();
       }

如何解决此问题?

我认为您应该将if语句更改为:

if(cmd.Connection.State != ConnectionState.Open)

这并不是问题的答案,而是最重要的一课。没有空catch块。请删除空catch,并使用关闭连接的
using
-语句。请注意,除了
ConnectionState.Open
ConnectionState.Closed
之外,还有其他状态。出于何种原因,您需要检查连接状态?在您的方法中没有使用另一个using语句打开和释放吗?没有理由检查,只需调用Open()…显示
con
的声明,它是静态的吗?最好的方法是使用
using
-语句并始终使用
cmd.Connection.Open()
try
 {
   if (Latitude != 0 && Longitude != 0)
   {                               

        SqlCommand cmd = new SqlCommand("Insert_Mapapp", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@Latitude", Latitude));
        cmd.Parameters.Add(new SqlParameter("@Longitude ", Longitude));
        cmd.Parameters.Add(new SqlParameter("@Speed", Speed));
        cmd.Parameters.Add(new SqlParameter("@Battery_ADC ", Battery_ADC));
        cmd.Parameters.Add(new SqlParameter("@sDateTime ", sDateTime));
        cmd.Parameters.Add(new SqlParameter("@Main_Backup_Battery ", Main_Backup_Battery));
        cmd.Parameters.Add(new SqlParameter("@Pulse_Counter ", Pulse_Counter));
        cmd.Parameters.Add(new SqlParameter("@Number_of_Satellites ", Number_of_Satellites));
        cmd.Parameters.Add(new SqlParameter("@IgnitionStatus ", IgnitionStatus));
        cmd.Parameters.Add(new SqlParameter("@Condition_Inputs ", Condition_Inputs));
        cmd.Parameters.Add(new SqlParameter("@FuelADC ", FuelADC));
        cmd.Parameters.Add(new SqlParameter("@UID ", UnitID));
        cmd.Parameters.Add(new SqlParameter("@Device_IP", remoteIP));
        cmd.Parameters.Add(new SqlParameter("@Device_Port", remotePort));
        cmd.Parameters.Add(new SqlParameter("@String_Count", UIDCounter));
        cmd.Parameters.Add(new SqlParameter("@Stored", Stored));
        // cmd.Parameters.Add("@Nofrec", SqlDbType.Int).Direction = ParameterDirection.Output;
        if (cmd.Connection != ConnectionState.Open)
            {
                cmd.Connection.Open();
            }
        cmd.ExecuteNonQuery();


  }
 catch (Exception ex)
  {
      throw;
  }
finally
     {
       if (cmd.Connection.ToString() != String.Empty && cmd.Connection.State != ConnectionState.Closed)
                CONN.Close();
     }