【问题标题】:Passing parameter issue from Entity Framework to store procedure将参数问题从实体框架传递到存储过程
【发布时间】:2015-01-13 16:16:28
【问题描述】:

我有在 MVC 中运行的应用程序,我打算将数据从 MVC 应用程序 C# 发送到存储过程。我已经测试了我的存储过程,如果我从 SQL Server Management Studio 执行它就可以工作,并且在 C# 中我从网页(视图)获取所有值以在它期望调用存储过程的地方运行,所以我猜我是参数传递做错了!!!

它没有将数据存储在数据库中

在此先感谢

存储过程

USE [MySolution01_DB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[CreateNewFunctionsNavigation]
 @FunctionName nvarchar(250),
 @Hierarchy_Level INT,
 @Function_identity INT OUTPUT, 
 @ControllerName nvarchar(250), 
 @Controller_identity INT OUTPUT,
 @ControllerInFunction_identity INT OUTPUT,
 @ActionName nvarchar(250),
 @Action_identity INT OUTPUT,
 @ActionInFunction_identity INT OUTPUT,
 @Function_ParentsFunctionID INT,
 @Function_ParentsFunction_identity INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO [dbo].[Navigation_Functions] ([FunctionName],[Hierarchy_Level] ) 
VALUES(@FunctionName, @Hierarchy_Level)
SET @Function_identity=SCOPE_IDENTITY()


INSERT INTO [dbo].[Navigation_FunctionController] ([ControllerName])
VALUES(@ControllerName)
SET @Controller_identity = SCOPE_IDENTITY()


INSERT INTO [dbo].[Navigation_FunctionInController] ([Function_ID], [ControllerID])
VALUES (@Function_identity, @Controller_identity)
SET @ControllerInFunction_identity = SCOPE_IDENTITY()

INSERT INTO [dbo].[Navigation_FunctionAction] ([ActionName], [ControllerID])
VALUES (@ActionName, @Controller_identity)
SET @Action_identity = SCOPE_IDENTITY()

INSERT INTO [dbo].[Navigation_FunctionInAction] ([ActionID], [Function_ID])
VALUES (@Action_identity, @Function_identity)
SET @ActionInFunction_identity = SCOPE_IDENTITY()

INSERT INTO [dbo].[Navigation_FunctionHierarchy] ([Function_IDs], [Parent_Function_ID])
VALUES (@Function_identity, @Function_ParentsFunctionID)
SET @Function_ParentsFunction_identity = SCOPE_IDENTITY()

RETURN
END

模型类

  public class CreateFunctionNavigation_SP_Map
{
    public CreateFunctionNavigation_SP_Map()
    {

    }

    [StringLength(250)]
    [Required(ErrorMessage = "Required Function Title")]
    [Display(Name = "Function Title")]
    public string FunctionName { get; set; }

    [Required(ErrorMessage = "Required Function Hierarchy; i.e Where Function Exists In Hierarchy Tree \n Top-Level Start From 1 ")]
    [Display(Name = "Function Hierarchy Level")]
    public int FunctionHierarchy_Level { get; set; }

    [StringLength(250)]
    [Required(ErrorMessage = "Required Controller Title")]
    [Display(Name = "Controller Title")]
    public string ControllerName { get; set; }

    [StringLength(250)]
    [Required(ErrorMessage = "Required Action Title")]
    [Display(Name = "Action Title")]
    public string ActionName { get; set; }

    [Required(ErrorMessage = "Required Function Parent - Child Relation ID \n Put 0 In Case Given Function doesn't Have Any Parent Function ")]
    [Display(Name = "Function Parent's FunctionID")]
    public int Function_ParentsFunctionID { get; set; }    

}

调用存储过程的类

public void CreateFunctionNavigation(CreateFunctionNavigation_SP_Map _entity)
    {

        using(var dbContext = new FunctionContext())
        {
            CreateFunctionNavigation_SP_Map modelObj = new CreateFunctionNavigation_SP_Map();

            var parameters = new[] { 
                new SqlParameter("@FunctionName" , _entity.FunctionName ),
                new SqlParameter("@FunctionHierarchy_Level" , _entity.FunctionHierarchy_Level ),
                new SqlParameter("@ControllerName" , _entity.ControllerName ),
                new SqlParameter("@ActionName" , _entity.ActionName ),
                new SqlParameter("@Function_ParentsFunctionID" , _entity.Function_ParentsFunctionID )
            };


             dbContext.Database.SqlQuery<CreateFunctionNavigation_SP_Map>("exec CreateNewFunctionsNavigation", parameters);
        }


    }

新的更新

我更改了 C# 代码,但仍然无法存储数据

dbContext.Database.SqlQuery<CreateFunctionNavigation_SP_Map>("EXEC CreateNewFunctionsNavigation @FunctionName, @FunctionHierarchy_Level, @ControllerName, @ActionName, @Function_ParentsFunctionID",
       new SqlParameter("FunctionName", _entity.FunctionName),
       new SqlParameter("FunctionHierarchy_Level", _entity.FunctionHierarchy_Level),
       new SqlParameter("ControllerName", _entity.ControllerName),
       new SqlParameter("ActionName", _entity.ActionName),
       new SqlParameter("Function_ParentsFunctionID", _entity.Function_ParentsFunctionID)
   );

【问题讨论】:

标签: c# asp.net-mvc linq entity-framework stored-procedures


【解决方案1】:

您可以使用 SQL 事件探查器对此进行调试,该分析器显示针对服务器执行的命令。无论如何,请尝试以下

dbContext.Database.SqlQuery("CreateNewFunctionsNavigation @FunctionName、@FunctionHierarchy_Level、@ControllerName、@ActionName、 @Function_ParentsFunctionID", 参数);

更新

由于上面的答案对您不起作用,您可以尝试像这样手动创建查询字符串..

        var query = string.Format("EXEC CreateNewFunctionsNavigation " +
                                  "@FunctionName = {0}, " +
                                  "@FunctionHierarchy_Level = {1}, " +
                                  "@ControllerName = {2}, " +
                                  "@ActionName = {3}, " +
                                  "@Function_ParentsFunctionID = {4}",
                                  _entity.FunctionName,
                                  _entity.FunctionHierarchy_Level, 
                                  entity.ControllerName,
                                  _entity.ActionName,
                                  _entity.Function_ParentsFunctionID);


        dbContext.Database.SqlQuery<CreateFunctionNavigation_SP_Map>(query);

【讨论】:

  • 我在我的问题的最后一个会话中做了上述操作,但没有数据输入....我使用的是 SQL Server Management Studio 2012,但我没有 SQL Profiler ???我可以下载那个吗!
  • 转到工具>SQL Server Profiler。如果它不存在,那么您可能在安装 MSSQL 时没有安装管理工具。如果您再次运行安装,您可以添加此功能。关于问题,我将用您可以尝试的另一种方法更新我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多