如何使用Dapper获取存储过程的返回值?

2024-06-28

我在 asp.net mvc 4 项目 .net f/w 4.6.1 中使用 Dapper 使用 sql server 2016 Express

<packages>
  <package id="Dapper" version="1.50.2" targetFramework="net461" />
</packages> 

我有一个存储过程,它从 2 个应该是事务性的表中删除

ALTER PROCEDURE [dbo].[FeedbackDelete] @FeedbackID UNIQUEIDENTIFIER
AS 
    SET NOCOUNT OFF 
    SET XACT_ABORT ON  

BEGIN TRANSACTION
    DELETE
    FROM dbo.Document
    WHERE FeedbackId = @FeedbackID
    IF(@@ERROR != 0)
        BEGIN
            ROLLBACK TRANSACTION
            RETURN 1
        END

    DELETE
    FROM   [dbo].[Feedback]
    WHERE  [FeedbackID] = @FeedbackID
    IF(@@ERROR != 0 OR @@ROWCOUNT != 1)
        BEGIN
            ROLLBACK TRANSACTION
            RETURN 1
        END

COMMIT TRANSACTION
RETURN 0

我的回购方法使用这样的 dapper

public Response DeleteFeedback(Guid feedbackId)
        {
            string storedProcName = "FeedbackDelete";
            int returnValue = int.MinValue;
            using (var con = Connection)
            {
                con.Open();
                returnValue = con.Execute(storedProcName, new { feedbackId }, commandType: CommandType.StoredProcedure);
            }
            return Convert.ToInt32(returnValue) == 0 ? new Response(Code.Success, "Feedback successfully deleted") : new Response(Code.Failure, "There was an error deleting feedback");
        }

The 返回值我每次得到的都是 1,这是可以理解的,因为 dapper 返回受影响的行数。

不过,我想获取存储过程的 return 语句的值,以检查事务删除期间是否有错误(在我的例子中,0 表示成功,1 表示任何错误)

我该如何实现这一目标?

使用裸机 ado.net,我曾经这样做过并且有效

var returnValue = db.ExecuteScalar(storedProcName, new object[] { feedbackId });

使用 dapper 我尝试了 con.ExecuteScalar ,但它不起作用,因为 dapper 元数据显示该标量 // Returns: //The first cell selected

任何帮助将不胜感激?

这是我需要使用 Dapper 执行的下一个过程

ALTER PROCEDURE [dbo].[FeedbackUpdate] 
    @DocumentData VARBINARY(MAX),
    @DocumentName NVARCHAR(100),
    @FeedbackID UNIQUEIDENTIFIER,
    @FirstName NVARCHAR(100),
    @LastName NVARCHAR(100),
    @Notes NVARCHAR(MAX)
AS 
    SET NOCOUNT ON 
    SET XACT_ABORT ON  

    BEGIN TRAN

    UPDATE [dbo].[Feedback]
    SET    [FirstName] = @FirstName, [LastName] = @LastName, [Notes] = @Notes
    WHERE  [FeedbackID] = @FeedbackID
    IF(@@ERROR != 0 OR @@ROWCOUNT != 1)
        BEGIN
            ROLLBACK TRAN
            RETURN 1
        END

    IF DATALENGTH(@DocumentData) > 1
    BEGIN

            DELETE
            FROM   [dbo].[Document]
            WHERE  FeedbackId = @FeedbackId
            IF(@@ERROR != 0)
                BEGIN
                    ROLLBACK TRAN
                    RETURN 1
                END

            INSERT [dbo].[Document] (DocumentData,DocumentName,DocumentId,FeedbackId)
            VALUES(@DocumentData,@DocumentName,NEWID(),@FeedbackID)
            IF(@@ERROR != 0 OR @@ROWCOUNT != 1)
                BEGIN
                    ROLLBACK TRAN
                    RETURN 1
                END
        END

        COMMIT TRAN
        RETURN 0

您可以使用方向声明动态参数:ReturnValue 您还可以使用“选择”而不是“返回”并使用Query<T>扩大。

create procedure sp_foo
    as
    begin
        return 99
    end

[Test]
public void TestStoredProcedure()
{
    using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo"))
    {
        var p = new DynamicParameters();
        p.Add("@foo", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

        conn.Execute("sp_foo", p, commandType: CommandType.StoredProcedure);

        var b = p.Get<int>("@foo");

        Assert.That(b, Is.EqualTo(99));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Dapper获取存储过程的返回值? 的相关文章

  • 信用卡号应该存储为字符串还是整数?

    是啊 只是想想而已 我应该将在我的网站上输入的信用卡号存储为字符串还是整数 我的意思是 它们由数字组成 这让我认为它是一个整数 但我不对它们进行数学运算 所以也许字符串更合适 编辑 所以我必须在加密之前存储在某个时刻输入的数字 我可能应该更
  • 替换大字符串中的多个字符串的最快方法

    我正在寻找替换大 1mb 字符串的多个 500 子字符串的最快方法 无论我尝试过什么 String Replace 似乎都是最快的方法 我只关心最快的方式 不是代码的可读性 可维护性等 我不在乎是否需要使用不安全的代码或预处理原始字符串 每
  • 我想要 Linux 上的 C 函数来收集核心转储而不终止进程

    abort 确实收集核心转储 但我不希望进程终止 dump core 收集核心转储 但在内核空间中 用户空间中是否有与 dump core 等效的函数 自己做的一个简单方法是fork进程 创建父进程的完整副本 并调用abort来自子进程 子
  • 如何使用 lstat() 确定是否为硬链接

    我的操作系统是linux 我用 C 编程 我知道我可以使用 lstat 来识别软链接 即使用 S ISLNK st st mode 但我如何识别该链接是硬链接呢 如果链接是硬链接 它将被视为常规文件 但是 我还想区分常规文件和硬链接 有什么
  • main() 是用户定义函数吗? [复制]

    这个问题在这里已经有答案了 程序员does定义内部发生的事情main 毕竟 那么 它应该被视为用户定义的函数吗 C 标准没有用户定义函数的概念 相反 它有一个概念库函数 main 不是库函数 但是 该标准还对其签名提出了一些要求 并且不得重
  • 创建一个从用户机密获取连接字符串的 DbContextFactory

    使用 DotNetCore 解决方案WebApi项目和一个单独的Data包含实体框架实现的项目 我们一直在升级库 因此我们使用所有最新的核心内容 In the Data项目 我们创建了一个ApplicationDbContextFactor
  • 处理可选依赖项 (C#)

    我们有一个可以选择与 TFS 集成的应用程序 但是由于集成是可选的 所以我显然不希望所有机器都需要 TFS 程序集作为要求 我应该怎么办 我是否可以在主程序集中引用 TFS 库 并确保在使用 TFS 集成时仅引用 TFS 相关对象 或者 更
  • 无符号长十六进制表示

    include
  • 在 UserControl C# .NET 中添加/停靠控件

    我正在编写一个 UserControl 它以编程方式添加子控件 目前我正在添加新的控件 如下所示 this Controls Add new Control Height 16 Dock DockStyle Top 我遇到的问题是新控件添加
  • CMake include_directories 和 add_subdirectories 之间的区别?

    我正在学习 CMake 来构建 C 代码 并努力解决以下概念 在我的根级目录中 我有一些 cpp 文件和 CMakeLists txt 它们在 gen cpp 目录中成功生成了一些 thrift 代码 我的根级别 CMakeLists tx
  • 来自“void *”的dynamic_cast

    根据this https stackoverflow com questions 3155277 cannot dynamic cast void to templated class void 没有 RTTI 信息 因此从void 不合法
  • 像 MS Excel 一样在 C++ 中舍入双精度值

    我在网上进行了搜索 但找不到解决我的问题的方法 我只是想要一个像 MS Excel 那样对双精度值进行舍入的函数 这是我的代码 include
  • 查询 XmlDocument 而不会出现“命名空间前缀未定义”问题

    我有一个 Xml 文档 它定义并引用了一些命名空间 我将其加载到 XmlDocument 对象中 据我所知 我创建了一个 XmlNamespaceManager 对象 用于查询 Xpath 问题是我收到命名空间 my 未定义的 XPath
  • 检测非 DPI 感知应用程序是否已扩展/虚拟化

    我正在尝试在 WinForms 应用程序中检测它是否由于操作系统具有高 DPI 而以缩放 虚拟化模式启动 目前 在以 3840x2400 缩放 200 缩放运行的系统中 应用程序将分辨率视为 1920x1200 DPI 为 96 缩放因子为
  • Docker 在 VS 中运行,但发布到 AWS 时出错?错误 CS5001:程序不包含适合入口点的静态“Main”方法

    我安装了适用于 Visual Studio 2017 V15 7 3 的 AWS 工具包 并使用 API 模板和 Linux docker 支持创建了一个新的空 Asp Net core 2 1 项目 我可以在 Visual Studio
  • 如何在 JSON 输出上强制采用 ISO 格式“YYYY-MM-DDThh:mm:ss.sss”?

    我有一个 ASP NET WebApi2 api 它返回一些 JSON 格式的时间戳 时间戳具有毫秒分辨率 通常我会得到这种格式的时间戳 这很好 YYYY MM DDThh mm ss sss 不幸的是 如果时间戳恰好用整秒对日期进行编码
  • 如何隐藏鼠标光标?

    我想问是否有人可以为我提供一个 C 代码 在其中我可以在按下特定键时隐藏 显示鼠标指针 我发现一些只为 TURBO C 编写的代码 它们都不能使用 dev c 甚至 Visual c 编译和运行 我尝试运行在 Dev C 中找到的代码 但我
  • .NET Compact Framework 上的 DateTime.Now 中的毫秒始终为零?

    我想要一个时间戳对于日志Windows 移动项目 精度必须至少在一百毫秒范围内 然而我打电话给DateTime Now返回一个DateTime对象与Millisecond属性设置为零 还有Ticks属性相应地进行四舍五入 如何获得更好的时间
  • C# 固定长度的字符串对象

    我有一堂课 我想使用固定大小的字符串 固定大小的原因是该类 序列化 为文本文件 具有固定长度的值 我想避免为每个值编写一个保护子句 而是让类处理它 所以我有大约 30 个属性 看起来像这样 public String CompanyNumb
  • Xamarin - iOS 地图上的多个多边形

    我目前正在关注this https developer xamarin com guides xamarin forms application fundamentals custom renderer map polygon map ov

随机推荐

  • 在 joomla 中设置前端会话超时限制

    如何在 joomla 2 5 中设置前端用户的会话超时限制 我在全局配置中设置了会话生命周期选项 但它仅在后端设置了限制 你可以评论该行JHtml behavior keepalive 在文件顶部 模块 mod login tmpl def
  • PYTHON:如何将星号 (*) 作为命令行参数传递

    我正在尝试制作一个 python 脚本来搜索文件中的单词 如果我通过了txt它只会在文件中查找 txt扩展名 但我想通过 作为搜索参数every files if sys argv 4 不工作 如果我尝试 print sys argv 4
  • MATCH_PARENT 如果同级视图较大,则 WRAP_CONTENT 如果同级视图较小

    我在布局中有两个视图 我会打电话给他们View A and View B分别 A B 父布局的高度 包括View A and View B is WRAP CONTENT 这里 高度为View B is WRAP CONTENT 也就是说
  • 当c的控制台使用c或c++运行时禁用键盘按键

    我想在程序运行时禁用键盘 这意味着没有人可以使用 alt F4 等 我如何在 Windows 操作系统中使用 c 使其成为可能 Handle WM SYSKEYUP WM SYSKEYDOWN并返回0 这是处理这些消息的 WndProc L
  • Android 点击列表视图

    我有一个包含 15 个项目的列表视图 当我单击任何项 目时 我想更改屏幕 意图 如何更改 Android 中所选项目的活动 有教程或者源码吗 您可以使用ListView s setOnItemClickListener 并在此方法的实现中启
  • 在 Zend Framework 中设置视图缩进

    在 Zend Framework 中 可以为 headMeta headLink 等设置缩进 我喜欢这个 我喜欢东西整齐 所以 现在我想在布局 phtml文件 导致视图脚本中的每个新行都用 X 制表符缩进 这是行不通的 有没有办法在 Zen
  • 如何在 Linux 上取消焦点(模糊)Python-gi GTK+3 窗口

    我想做什么以及为什么 我希望我的窗口取消聚焦 因此选择了上一个聚焦的窗口 为什么 我想与先前选择的窗口 来自其他程序 进行交互 我当前的计划是 取消窗口焦点 使用libxdo模拟击键 然后再次聚焦我的窗口 我的窗口可以设置在顶部 以帮助避免
  • 收集实时 GC 指标 - Golang

    Go 中是否有一种简单的方法来获取有关 GC 和堆大小的信息 以便将它们公开给监控仪表板 我查看了运行时包 但似乎没有任何东西可以做到这一点 理想情况下 这不需要任何开销 例如在分析模式下运行应用程序等 但应该做好生产准备 您可以使用GOD
  • 从多个表插入表

    嘿 我有一个连接表 连接两个不相关的表 两个表都有ID的 我需要选择ID从每个表中使用WHERE具有不同的值 例如这就是我的看法 INSERT INTO c aID bID VALUES SELECT a ID WHERE a Name M
  • MacOS 上的 Java 安装:Apt Commando 不起作用 [重复]

    这个问题在这里已经有答案了 我已经在MacBook Catalina 10 15 7 上安装了最新版本的JAVA jdk 15 0 1 osx x64 bin dmg 当我尝试使用 JAVA 使用以下命令安装 PUPPET MASTER 时
  • 使用列命令时出现 Bash 错误:“列:行太长”

    当我使用输入文件键入此列命令时 出现以下错误 column t text txt gt output column line too long column line too long column line too long column
  • Bootstrap 下拉按钮名称在单击时发生变化

    我正在使用下拉按钮 4 个按钮 来过滤项目中的内容 并且我希望按钮名称更改为选定的 这样用户就不会忘记他 她在哪里 见图 这怎么可能 提前谢谢 这是pen http codepen io aktuna pen FqKjb 您可以使用 jQu
  • 将 Assembla 托管的 SVN 存储库备份到 Windows

    现在我的所有文件都使用 Assembla com 的免费托管 svn 存储库进行托管 我想将所有存储库下载到本地计算机以将它们存储为备份 是否有任何为 Windows 构建的应用程序可以让我指向 svn 存储库并下载文件来备份它们 或者有更
  • 从 Bash 中的字符串中删除固定前缀/后缀

    我想从字符串中删除前缀 后缀 例如 给定 string hello world prefix hell suffix ld 我如何得到以下结果 o wor prefix hell suffix ld string hello world f
  • 颤动 NO_RENEGOTIATION(ssl_lib.cc:1725)错误 268435638

    我不确定为什么我请求的这个 API 仅针对 dart 抛出此错误 由于某种原因 当我尝试发出 POST 请求时 dart 会抛出此错误 未处理的异常 NO RENEGOTIATION ssl lib cc 1725 错误268435638
  • 升级pip有什么用?

    虽然 pip 用于从 PyPI 安装和升级其他 Python 包 但您能帮我理解为什么需要升级 pip 本身吗 我正在开发一个新的 python 项目 并将使用 pip 来安装依赖项 但是 我不确定在安装其他软件包之前是否需要将 pip 升
  • 为什么安装成功后无法导入pandas?

    我已经使用命令 pip3 4 install pandas 安装了 pandas Successfully installed pandas python dateutil pytz numpy six Cleaning up root h
  • 来自 CPU/内存使用百分比的 Grafana 警报

    我想通过 Grafana 发出警报 定义 CPU 或内存使用率是否高于阈值 比方说 85 它将触发警报 我现在拥有的是时间序列限制CPU 内存 kube pod container resource limits namespace nam
  • Tweepy 为什么我收到搜索 AttributeError [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 当我运行代码时 我收到以下错误消息 该代码应返回与指定查询匹配的推文 Twitter 屏蔽了搜索属性吗 错误信息 for twee
  • 如何使用Dapper获取存储过程的返回值?

    我在 asp net mvc 4 项目 net f w 4 6 1 中使用 Dapper 使用 sql server 2016 Express