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