关闭Adomd连接后借助原有会话执行命令的实现方案咨询
问题原因
- 你创建的
AdomdCommand实例未关联到保存了目标会话的AdomdConnection对象,命令执行时找不到可用连接上下文 - 调用
Close(false)仅会保留服务端的会话资源,本地连接对象本身仍处于关闭状态,不能直接用来执行命令,需要重新打开连接,只要会话ID未变更,就会复用之前的服务端会话,而不是新建会话
正确实现方案
你需要先给命令绑定连接对象,且执行命令前重新打开连接,修正后的可运行代码如下:
try { using (AdomdConnection adomdConnection = new AdomdConnection("MY Connection String")) { adomdConnection.Open(); // 可将会话ID保存到其他位置,供其他连接对象复用 string savedSessionId = adomdConnection.SessionID; // 传false关闭本地连接,保留服务端会话 adomdConnection.Close(false); while (true) { // 重新打开连接,自动关联原有服务端会话 adomdConnection.Open(); String query = @"EVALUATE { BLANK()}"; // 给命令绑定对应连接对象 AdomdCommand adomdCommand = new AdomdCommand(query, adomdConnection); Console.WriteLine(adomdConnection.SessionID.ToString() + " " + DateTime.Now.ToString()); AdomdDataReader reader = adomdCommand.ExecuteReader(); reader.Close(); // 执行完成后关闭本地连接,继续保留服务端会话 adomdConnection.Close(false); System.Threading.Thread.Sleep(30000); } } } catch(AdomdConnectionException ex) { Console.WriteLine(ex.Message.ToString()); }
注意事项
- 服务端会话存在超时阈值,若两次操作的间隔超过服务端配置的会话超时时间,会话会被自动回收,需要重新创建会话
- 如果你需要用全新的连接对象复用已有会话,只需在连接字符串中添加
Session Id=你之前保存的会话ID,打开新连接后就会自动关联到已有的服务端会话
内容的提问来源于stack exchange,提问作者Kaja
相关产品推荐
相关产品推荐

