我的C#应用程序使用 Sql Server Compact Edition ,我在这里与数据库建立了连接。我使用这种方法来运行ExecuteScalar
,并且在某些时候我会重复使用它。
这是班级:
//_cnt & _cmd are private variables
public static object Run_ExecuteScaler(string query)
{
object objResult;
_cnt = new SqlCeConnection {ConnectionString = ConnectionString};
_cmd = new SqlCeCommand
{
Connection = _cnt,
CommandType = System.Data.CommandType.Text,
CommandText = query
};
if (_cnt.State != System.Data.ConnectionState.Open)
_cnt.Open();
objResult = _cmd.ExecuteScalar();
_cmd.Dispose();
if (_cnt.State != System.Data.ConnectionState.Closed)
_cnt.Close();
_cnt.Dispose();
return objResult;
}
我在foreach
循环中使用此行,该循环使用上述方法来创建与数据库的连接并运行命令。然后关闭连接,然后处理。
var middleCat = RSSql.Run_ExecuteScaler(string.Format(
"SELECT Implication FROM tblMiddleCategory where IDMiddleCategory='{0}'",someInt));
但是我在第二次循环后遇到了这个错误:
开放的会话太多
我意识到这通常发生在没有处理连接时。但我用我的方法做到了。我是以错误的方式做到了吗?
更新
我将方法改为使用using
语句作为@Damien_The_Unbeliever提供:
public static object Run_ExecuteScaler(string query)
{
object objResult = null;
using (_cnt = new SqlCeConnection( ConnectionString))
{
_cmd = new SqlCeCommand
{
Connection = _cnt,
CommandType = System.Data.CommandType.Text,
CommandText = query
};
if (_cnt.State != System.Data.ConnectionState.Open)
_cnt.Open();
objResult = _cmd.ExecuteScalar();
}
return objResult;
}
但我仍然遇到同样的错误。