2014-08-28 54 views
-2

我正在使用c#應用程序從tcp客戶端接收字符串。並存儲在數據庫(SQL Server 2005)。應用工作正常,但過一段時間它給錯誤executenonquery需要一個開放且可用的連接。連接的當前狀態正在連接

「的ExecuteNonQuery需要一個開放和可用的連接,該連接的當前狀態爲正在連接」

是天天再來重新啓動它工作正常申請後一段時間的誤差會

當我得到這個錯誤,我已經失去了它不是在我的數據庫存儲的代碼背後

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(); 
     } 

如何解決這個PROBL他們嗎?

+2

這並不是說這個答案,但頂部的教訓。沒有空的catch塊。 – doctorlove 2014-08-28 08:25:58

+0

刪除空捕獲,也使用'using'語句關閉連接。請注意,除ConnectionState.Open和ConnectionState.Closed外,還有其他狀態。 – 2014-08-28 08:28:10

+0

您需要檢查連接狀態的原因是什麼?是不是打開並在您的方法中使用另一個使用語句處理?沒有理由檢查,只需打開()... – 2014-08-28 08:29:16

回答

4

我想你應該改變你的if語句:

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

最好的方法是使用'using'語句,並且總是使用'cmd.Connection.Open();'。 – 2014-08-28 08:30:21

0
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(); 
    } 
相關問題