如何在异常发生之前检测到导致异常的情况?

2023-12-25

我没有运气这个问题 https://stackoverflow.com/questions/553331/detecting-unusable-pooled-sqlconnections所以我制作了这个尽可能简单的测试用例来演示这个问题。

在下面的代码中,是否可以在尝试使用连接之前检测到连接不可用?

    SqlConnection c = new SqlConnection(myConnString);

    c.Open();  // creates pool

    setAppRole(c);  // OK

    c.Close(); // returns connection to pool

    c = new SqlConnection(myConnString); // gets connection from pool

    c.Open(); // ok... but wait for it...

    // ??? How to detect KABOOM before it happens?

    setAppRole(c); // KABOOM

KABOOM 在 Windows 事件日志中表现为错误;

连接已被删除,因为打开它的主体随后采用了新的安全上下文,然后尝试在其模拟的安全上下文下重置连接。不支持这种情况。请参阅联机丛书中的“模拟概述”。

...加上代码中的异常。

setAppRole 是在连接上设置应用程序角色的简单方法。与此类似...

static void setAppRole(SqlConnection conn) {

    using (IDbCommand cmd = conn.CreateCommand())
        {
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "exec sp_setapprole ";
            cmd.CommandText += string.Format("@rolename='{0}'",myUser);
            cmd.CommandText += string.Format(",@password='{0}'",myPassword);
            cmd.ExecuteNonQuery();
        }
    }

在真实的代码中尝试使用sp_unsetapprole在关闭连接之前,但不能总是保证(继承了有缺陷的多线程应用程序)。无论如何,期望能够在引起爆炸之前检测到爆炸似乎仍然是合理的。


简而言之,您似乎无法以任何简单的方式做到这一点。

我的第一个想法是运行这个 SQL:

SELECT CASE WHEN USER = 'MyAppRole' THEN 1 ELSE 0 END

如果您使用 SQL Server Management Studio,则此方法有效,但当您从 C# 代码运行它时,此方法会失败。问题是,当调用 sp_setapprole 时,您遇到的错误不会发生,它实际上是在连接池调用 sp_reset_connection 时发生的。当您第一次使用连接并且之前无法进入时,连接池会调用此方法。

所以我想你有四个选择:

  1. 通过添加“Pooling=false;”关闭连接池到你的连接字符串。
  2. 使用其他方式连接到 SQL Server。有比 ADO.Net 级别更低的 API,但坦率地说,这可能不值得这么麻烦。
  3. 正如 casperOne 所说,您可以修复代码以正确关闭连接。
  4. 捕获异常并重置连接池。我不确定这会对其他开放连接产生什么影响。示例代码如下:
class Program
{
    static void Main(string[] args)
    {
        SqlConnection conn = new SqlConnection("Server=(local);Database=Test;UID=Scrap;PWD=password;");

        setAppRole(conn);
        conn.Close();

        setAppRole(conn);
        conn.Close();
    }

    static void setAppRole(SqlConnection conn) 
    {
        for (int i = 0; i < 2; i++)
        {
            conn.Open();
            try
            {
                using (IDbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "exec sp_setapprole ";
                    cmd.CommandText += string.Format("@rolename='{0}'", "MyAppRole");
                    cmd.CommandText += string.Format(",@password='{0}'", "password1");
                    cmd.ExecuteNonQuery();
                }
            }
            catch (SqlException ex)
            {
                if (i == 0 && ex.Number == 0)
                {
                    conn.Close();
                    SqlConnection.ClearPool(conn);
                    continue;
                }
                else
                {
                    throw;
                }
            }
            return;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在异常发生之前检测到导致异常的情况? 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 在存储过程结束时显式删除本地临时表有什么好处?

    考虑以下伪 T SQL 代码 由存储过程执行 CREATE TABLE localTable
  • SQL Server 2000 中是否提供公用表表达式 (CTE)

    我最近发现了以下文章 http www tsqltutorials com with common table expressions php http www tsqltutorials com with common table exp
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • google.visualization.ChartWrapper 组列视图

    我是 Google 可视化 API 的新手 而且我对 JavaScript 不太熟悉 我希望输出按第 2 列中的标签进行分组 请注意 纽约在图表上重复出现 我只想让图表按标签对第 2 列进行分组 并对第 3 列中的数值进行求和 有人知道怎么
  • Haskell 中的实例是什么意思?

    在面向对象的语言 例如 Java 和 Python 中 我们可以从类创建对象 实例 在 Haskell 中 我们可以从类型类创建实例 例如 data ShirtSize S M L Here ShirtSize is a enum data
  • 如何在 Inno Setup 安装程序中捆绑来自 NuGet 包的仅运行时依赖项?

    我正在为一个具有几个运行时 dll 依赖项的程序创建一个安装程序 这些依赖项以 NuGet 包的形式提供 我想知道是否可以以某种方式向 Inno Setup 指定 NuGet 包列表 以便它下载这些包并将相应的 dll 捆绑到我的安装程序中
  • ActiveRecord::HasManyThroughOrderError:不能有 has_many :through 关联

    在我的 Rails 应用程序中 我试图创建一个系统 为用户提供各种成就的徽章奖励 创建了一个表 user badges 移民 class CreateUserBadges lt ActiveRecord Migration 5 1 def
  • 线程安全是原子的还是非原子的?

    我搜索并发现不可变是线程安全的 而可变则不是 这可以 但我得到了误导性的笔记 博客 有关线程安全的原子与非原子的答案 请对答案进行解释 假设有一个名为 name 的原子字符串属性 如果您调用 self setName A 从线程 A 调用
  • 通过 iPhone 的 IP 地址进行地理定位

    我喜欢追踪用户 location 通过使用设备的 IP 地址 我已经寻找过一些 API 服务 例如 自由地理网 api petabyet com ip api com 但我不知道如何使用此服务来获取用户设备的位置 实际上我已经寻找了一些 S
  • HTML CSS自动调整高度

    我试图通过使用 CSS LESS 可视化来显示出港和入境航班 问题是 当出境航班比入境航班有更多的机场变更时 线路将保持在第一个航班的水平 我希望根据最长的路线动态调整线路高度 您能帮我弄清楚如何达到所需的结果吗 UPDATE 准备好了Pl
  • 如何创建可重定位的应用程序

    希望可以有人帮帮我 我有一些用 python 编写的东西 这使用了很多库 因此 我使用 virtualenv 创建了一个虚拟环境 并复制了该环境中需要的每个文件 然后我使用 Platypus 创建了一个 app 当然 该应用程序无法正常工作
  • 网络浏览器搜索是如何实现的?

    我想在桌面应用程序中实现java搜索和突出显示multiple中的短语html文件 就像在网络浏览器中完成的那样 所以html 标签 内 lt and gt 被忽略但有些标签像 b 没有被忽视 搜索示例时each table在文本中 eac
  • 引用 unique_ptr 的向量

    我有一个收藏unique ptrs 在这里 我想取出其中一些并将它们返回给调用者 调用者只需要读取内容 所以我想使用常量引用 但我不知道如何做到这一点unique ptrs 这是我用来使用原始指针执行此操作的一些代码 class entry
  • 从用户处获取字符输入时出现 IndexOutOfBoundsException

    在第15行ch s1 charAt 0 为什么 ch 没有得到 s1 的第 0 个字 即运算符 我尝试过不使用 try catch 方法 但错误与异常有关 现在没有例外 没有错误 但程序不要求操作员并在输入后直接 第一个和第二个值 它显示异
  • PostgreSQL 将列从 inet 转换为文本

    我想更改列的类型inet to text 所以 我执行 ALTER TABLE table ALTER COLUMN col TYPE text 但后来我发现所有值都添加了掩码 例如 192 168 100 141 gt 192 168 1
  • GCM BroadcastReceiver setResultCode 使用

    我正在使用 Android 开发人员提供的 GCM 示例 但无法理解其用途 setResultCode Activity Result OK 哪个组件接收此消息 谁在调用它并接收它 这是例子 public class GcmBroadcas
  • XAML Horizo​​ntalAlignment 属性没有执行我想要的操作

    xaml 代码 在网格内
  • 为遮罩层添加边框

    我正在尝试制作自定义形状UIButton使用遮罩层 我成功了 extension UIButton func mask withImage image UIImage frame CGRect let maskingLayer CAShap
  • Microsoft.Owin.StaticFiles 在控制台主机中工作,但我在文件请求的 IIS 中收到 404

    我在 Owin 管道中设置了 Microsoft Owin FileServer v2 1 0 并且使用 EnableDirectoryBrowsing true 设置 FileServerOptions 非常适合在我的控制台主机和 iis
  • 两个类互相引用

    假设有两个类 它们相互需要 容器 and item 班上容器创建类的实例item 类的每个实例item持有类的一个实例容器并且只需要调用该方法按项目调用的方法班级的容器 Class 容器需要查看类的所有字段item 问题是前向声明 我想在其
  • 为什么定义数组之外的第一个元素默认为零?

    我正在准备 C 入门课程的期末考试 我们的教授给了我们这个问题来练习 解释为什么代码会产生以下输出 120 200 16 0 using namespace std int main int x 120 200 16 for int i 0
  • 如何使 Bootstrap 工具提示在 SVG 上居中?

    我想将工具提示向右移动几个像素 因此箭头位于光标所在单元格的中心 当前 它位于 0 0 即左上角 这是我的代码 rect cell tooltip title hola placement top and an image 理想情况下 我想
  • 如何在异常发生之前检测到导致异常的情况?

    我没有运气这个问题 https stackoverflow com questions 553331 detecting unusable pooled sqlconnections所以我制作了这个尽可能简单的测试用例来演示这个问题 在下面