【问题标题】:Subsonic 3 - Passing null value to stored procedure parameterSubsonic 3 - 将空值传递给存储过程参数
【发布时间】:2010-02-11 17:53:46
【问题描述】:

使用 Subsonic 3.0.0.3 是否可以将空值传递给存储过程参数?如果可以,合适的方式是什么?

详情
假设我有一个 sp,其中一个参数具有默认值,例如:

 CREATE Procedure Test_SPWithNullParams( @p1 int=null, @p2 varchar(50) ) 
  AS
   SELECT 1 as Stuff

然后在我的代码中我想要执行以下操作:

 var db = new Sandbox.DB();  
 StoredProcedure sproc = db.Test_SPWithNullParams( null , "test");
 //alternately --> db.Test_SPWithNullParams("test");

对应函数在StoredProcedures.cs中生成的方式,但是@p1的参数不能为空。那么我的替代方案是什么?我遇到了这篇文章 (http://brianmrush.wordpress.com/2010/01/19/subsonic-t4-templates-stored-procedures-nullable-parameters),但它似乎是一项繁琐的工作,有效地分支了代码库。

另外,我考虑过手动覆盖命令对象。类似的东西:

int dummyInt = -1;
StoredProcedure sproc = db.Test_SPWithNullParams( dummyInt , "test");
sproc.Command.Parameters[0].ParameterValue = DBNull.Value;

想法?

【问题讨论】:

    标签: sql-server stored-procedures subsonic subsonic3


    【解决方案1】:

    我手头没有 Subsonic,但也许你可以使用可为空的 int。

    int? dummyInt = null;
    StoredProcedure sproc = db.Test_SPWithNullParams( dummyInt , "test");
    

    【讨论】:

    • 抱歉,但定义可为空的 dummyInt 参数会阻止编译。 Subsonic 写入“db.Test_SPWithNullParams”,没有可为空的参数。这意味着我要么需要做一个 (int.hasvalue? int: 0) 要么定义一个不可为空的参数。也不允许我将空值传递给我的 SP。
    【解决方案2】:

    没办法。存储过程仅生成没有可为空的类型。为什么不尝试这样的事情呢?:

    StoredProcedure sproc = db.Test_SPWithNullParams( someNullableInt.HasValue ? someNullableInt.Value: 0, "test");
    

    【讨论】:

    • 我了解 Subsonic 生成不可为空的函数参数。但是,我的数据模型在某些情况下需要空值。上述建议发送非空值或零而不是我需要的空值。
    • 对不起,忘了问.. 是什么让这成为“不可能”?我的数据模型需要空值。
    • 您需要修改 Subsonic 模板 StoredProcedures.tt 并查看 Subsonic 核心是否识别程序何时具有空参数。否则你实际上需要分支 Subsonic。
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多