【问题标题】:Call stored procedure with optional parameters using OrmLite使用 OrmLite 调用带有可选参数的存储过程
【发布时间】:2013-03-18 20:26:56
【问题描述】:

我正在使用 OrmLite 调用具有可选参数的存储过程。

_dbConnection.SqlList<CustomerDTO>("sp_getcustomers @name", new { name = request.Name });

此语句正在生成以@name 作为参数的动态sql 语句。但我不知道如何将 null 传递给这个参数,我尝试使用 DBNull.Value 但它不起作用。 例外:字典中不存在给定的键

_dbConnection.SqlList<CustomerDTO>("sp_getcustomers @name", new { name = request.Name ??  System.Data.SqlTypes.SqlString.Null});

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

    有关如何有效利用 OrmLite 的 Sql* api 的示例,请参阅这些 SqlProviderTests

    正确的称呼方式是:

    Db.SqlList<CustomerDTO>("EXEC sp_getcustomers @Name", new { request.Name });
    

    【讨论】:

    • 对不起,这是我写的伪代码,已纠正。这里的问题是如果我传递一些值或空白名称参数,我可以调用 SP。但是我在 DB 中有检查 name =null 的逻辑,因此通过使用上述语法,我无法传递 null 或完全避免传递 name 参数(在 ADO.NET 中完成)
    • “必须声明标量变量@Name”当我尝试传递 null 时引发异常。
    • 生成的 SQL : exec sp_executesql N'EXEC dbo.sp_getcustomers @name',N'@name nvarchar(20)' 。 name 参数没有声明。使用 Dapper,生成的 sql 是 exec dbo.sp_getcustomers @name=NULL
    • 我也有同样的问题。我不知道如何将参数设置为 NULL。你有没有找到解决这个问题的方法?
    • 我在这里创建了一个更具体的问题(非可选参数):stackoverflow.com/questions/17432909/…
    【解决方案2】:

    Ormlite 有一个T4 file 来为 SP(用于 SqlServer)生成 C# 函数等价物;生成的文件允许您传递空值。

    【讨论】:

      【解决方案3】:

      commit e6ef83a 中添加了对存储过程中空参数的支持,并与ServiceStack.OrmLite 的version 3.9.56 一起发布。

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 2018-11-08
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-03
        • 1970-01-01
        相关资源
        最近更新 更多