问题描述:
扫描枪通过Wifi连接于数据库建立连接,关闭扫描枪电源使之处于待机状态,等待一段时间后,打开扫描枪于数据库通讯,发生异常。
异常原因:
数据库访问使用的是Ado.net ,而微软的数据库连接SqlConnection,使用的了Pooling连接池技术。
使用 SqlConnection.Status == Open 判断数据库的连接状态是不可以得到当前的实际状态的,也就是说即使使用SqlConnection.Open()打开数据库没有异常,而且判断Status == Open,也不能保证实际物理连接是Open的。当程序使用到了,已经关闭的数据库链接时,就会抛处异常。
解决方法:
每次获取书库库链接的时候,即使Open状态,也要先访问数据库一次确保当前的链接状态是最新的。
列入:
if (con !=null && con.State == System.Data.ConnectionState.Open)
{
while(true)
{
SqlDataReader dr = null;
try
{
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = "select 1";
dr = cmd.ExecuteReader();
dr.Close();
dr = null;
break;
}
catch (SqlException e)
{
System.Threading.Thread.Sleep(500);
con.Dispose();
con = null;
}
con.open();
}
}