【问题标题】:Using same stored procedure across MVC controllers跨 MVC 控制器使用相同的存储过程
【发布时间】:2014-07-25 12:22:42
【问题描述】:

我正在开发一个 MVC 应用程序,请告诉我选择存储过程的最佳方法。

  1. 在页面加载时加载剑道网格 AutoBind(True)
  2. 从网格中选择一条记录并在另一个视图中显示详细信息 在网格下方。(这也可以正常工作)
  3. 现在我正在编辑下面视图中的信息并保存 信息返回到网格(我在这里调用 SP)
  4. 在保存时使用更新的日期详细信息加载网格。

现在我的问题是我是否可以共享相同的存储过程来保存并将记录加载回网格。我是在关注关注点分离还是遗漏了一些东西。请建议最好的方法来做到这一点。

【问题讨论】:

    标签: asp.net-mvc-4 stored-procedures


    【解决方案1】:

    不,您应该使用单独的存储过程来执行此操作。存储过程(无论如何我认为)应该做最少的工作来完成他们的工作。当您谈论一个同时负责 UPDATESELECT 操作的存储过程时,您会引入非常奇怪的行为。

    但是从技术上讲,你可以这样做

    CREATE PROCEDURE dbo.myobject_update_and_retrieve
    ( @UdpateParam1 varchar(25), @UpdateParam2 int, @UpdatedItemId int )
    AS 
    BEGIN
    
    UPDATE Items
    SET UpdateParam1 = @UpdateParam1,
        UpdateParam2 = @UpdateParam2
    WHERE UpdatedItemId = @UpdatedItemId
    
    SELECT UpdateParam1,UpdateParam2
    FROM   Items
    
    END
    

    这是不可取的,因为您需要在这里调用ExecuteReader 而不是预期的ExecuteNonQuery。通过调用 ExecuteNonQuery 运行基于 INSERT,UPDATE,DELETE 的存储过程,您会丢失一些为您提供的东西。

    这也创建了更容易测试的单元

    我会推荐两个单独的程序,如下所示

    CREATE PROCEDURE dbo.myobject_update
    ( @UdpateParam1 varchar(25), @UpdateParam2 int, @UpdatedItemId int )
    AS 
    BEGIN
    
    UPDATE myobjects
    SET Col1 = @UpdateParam1,
        Col2 = @UpdateParam2
    WHERE Id = @UpdatedItemId
    
    END
    

    CREATE PROCEDURE dbo.myobject_retrieve
    AS
    BEGIN
    SELECT Col1,Col2,Id FROM myobjects
    END  
    

    【讨论】:

    • np 希望对您有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多