【问题标题】:Can't get the return of this stored procedure in Entity Framework无法在实体框架中获取此存储过程的返回
【发布时间】:2016-09-09 15:23:08
【问题描述】:

我不知道为什么这次它不起作用,我已经这样做了几次,但这一次给我带来了麻烦。

这是我的 C# 代码:

RT_TYPE_STRING query = dba.Database.SqlQuery<RT_TYPE_STRING>("EXEC dbo.CSDN_CreateDemandeAppro @sp1, @sp2, @sp3, @sp4", new SqlParameter("sp1", "20162017"), new SqlParameter("sp2", "590"), new SqlParameter("sp3", "430614451421"), new SqlParameter("sp4", 22.18m)).First();

if (query.NO_DA == "")
{
}

不知何故,查询为空。我尝试直接在 Management Studio 中执行存储过程,它正确返回了 nvarchar

这是我的 RT_TYPE_STRING

CREATE TABLE [dbo].[RT_TYPE_STRING]
(
    [NO_DA] [nvarchar](8) NOT NULL,

    CONSTRAINT [PK_RT_TYPE_STRING] 
        PRIMARY KEY CLUSTERED ([NO_DA] ASC)
                WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                      IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                      ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

这是我的存储过程,如果你想看的话:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[CSDN_CreateDemandeAppro]
    @EXER_FIN   nvarchar(8),
    @UNIT_ADM   nvarchar(6),
    @NOM_CONT   nvarchar(30),
    @MNT_TOTAL  numeric(15, 2)
AS
    DECLARE
            @NO_DA  nvarchar(8),
            @TYPE   nchar(1),
            @STAT   nchar(1),
            @ETAT   nchar(1),
            @IND_ENG    nchar(1),
            @IND_APPR   nchar(1),
            @TYPE_TRAIT nchar(1),
            @TEL    nvarchar(11),
            @POSTE  nvarchar(5),
            @NOM_ACHET  nvarchar(30),
            @COMMENT_ACHET  nvarchar(255),
            @DATE_CREAT smalldatetime,
            @DATE_MAJ   smalldatetime,
            @DATE_APPR  smalldatetime,
            @CODE_FOND  tinyint,
            @NO_COMM_DOFIN  nvarchar(9),
            @NO_MAG nvarchar(6),
            @NO_SEQ int,
            @NO_DA_OUT int

    BEGIN TRAN
        SELECT @NO_DA = PROC_NO_DA FROM ACH_UNIT_ADM_NUM WHERE UNIT_ADM = @UNIT_ADM and EXER_FIN = @EXER_FIN ;
        UPDATE ACH_UNIT_ADM_NUM SET PROC_NO_DA = @NO_DA + 1 WHERE UNIT_ADM = @UNIT_ADM and EXER_FIN = @EXER_FIN ;
    COMMIT;

    SET @TYPE = '0';
    SET @STAT = '3';
    SET @ETAT = 'C';
    SET @IND_ENG = '0';
    SET @IND_APPR = '0';
    SET @TYPE_TRAIT = '1';
    SET @TEL = NULL;
    SET @POSTE = NULL;
    SET @NOM_ACHET = NULL;
    SET @COMMENT_ACHET = 'APPROVISIONNEMENT.CSDN.QC.CA';
    SET @DATE_CREAT = GETDATE();
    SET @DATE_MAJ = GETDATE();
    SET @DATE_APPR = NULL;
    SET @CODE_FOND = '1';
    SET @NO_COMM_DOFIN = NULL;
    SET @NO_MAG = NULL;
    SET @NO_SEQ = 1;
    SET @NO_DA_OUT = 0;





    INSERT INTO DBO.ACH_DA 
    VALUES (
        @EXER_FIN,
        @NO_DA,
        @UNIT_ADM,
        @TYPE,
        @STAT,
        @ETAT,
        @IND_ENG,
        @IND_APPR,
        @TYPE_TRAIT,
        @NOM_CONT,
        @TEL,
        @POSTE,
        @NOM_ACHET,
        @COMMENT_ACHET,
        @DATE_CREAT,
        @DATE_MAJ,
        @DATE_APPR,
        @MNT_TOTAL,
        @NO_SEQ,
        @CODE_FOND,
        @NO_COMM_DOFIN,
        @NO_MAG);

    Select @NO_DA;

SSMS 跟踪:

exec sp_executesql N'EXEC dbo.CSDN_CreateDemandeAppro @sp1, @sp2, @sp3, @sp4',N'@sp1 nvarchar(8),@sp2 nvarchar(3),@sp3 nvarchar(12),@sp4 decimal(4,2)',@sp1=N'20162017',@sp2=N'590',@sp3=N'430614451421',@sp4=22.18

【问题讨论】:

  • 添加 SET NOCOUNT ON?
  • 我希望它是那么简单
  • 运行 SQL Profiler 并验证查询实际上是否按照您认为的方式运行?将 Profiler 中的查询复制/粘贴到 SSMS 中并完全按原样运行?
  • EF 是否需要您在选择中命名列? "选择@NO_DA AS NO_DA;"?
  • SSMS,在工具下

标签: c# sql-server entity-framework stored-procedures


【解决方案1】:

哈哈哈......在我的存储过程结束时替换:

Select @NO_DA;

Select @NO_DA NO_DA;

所以列实际上得到了一个名字...NO_DA...

一个未命名的列不能在实体中返回,原因很明显......这是phatetic

【讨论】:

  • (评论#4,布鲁斯提到了这一点)
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多