为啥在集合中找不到 Mysql 存储过程参数?

Posted

技术标签:

【中文标题】为啥在集合中找不到 Mysql 存储过程参数?【英文标题】:Why Mysql Stored Procedure Parameter not found in the collection?为什么在集合中找不到 Mysql 存储过程参数? 【发布时间】:2012-01-19 09:19:32 【问题描述】:

我对实体框架和 mysql 有疑问。 我用this answer解决了实体框架函数参数问题

但是当我想用 mysql 存储过程添加一些数据时,我有

在集合中找不到参数“kick_Prod_StateID”。

C# 中的错误。

我的程序如下:

CREATE  PROCEDURE CreateState_(

    IN kick_Prod_StateID INT(11),
    IN kick_ShortName VARCHAR(3),
    IN kick_StateName VARCHAR(50)
)

BEGIN INSERT INTO State_
(
    Prod_StateID_,
    ShortName_,
    StateName_
)
VALUES 
( 
    kick_Prod_StateID ,
    kick_ShortName ,
    kick_StateName
) ; 
END$$

和实体框架创建的 C# 代码如下:

public ObjectResult<State_> AddState(Nullable<global::System.Int32> prod_StateID_, global::System.String shortName_, global::System.String stateName_)
    
        ObjectParameter prod_StateID_Parameter;
        if (prod_StateID_.HasValue)
        
            prod_StateID_Parameter = new ObjectParameter("Prod_StateID_", prod_StateID_);
        
        else
        
            prod_StateID_Parameter = new ObjectParameter("Prod_StateID_", typeof(global::System.Int32));
        

        ObjectParameter shortName_Parameter;
        if (shortName_ != null)
        
            shortName_Parameter = new ObjectParameter("ShortName_", shortName_);
        
        else
        
            shortName_Parameter = new ObjectParameter("ShortName_", typeof(global::System.String));
        

        ObjectParameter stateName_Parameter;
        if (stateName_ != null)
        
            stateName_Parameter = new ObjectParameter("StateName_", stateName_);
        
        else
        
            stateName_Parameter = new ObjectParameter("StateName_", typeof(global::System.String));
        

        return base.ExecuteFunction<State_>("AddState", prod_StateID_Parameter, shortName_Parameter, stateName_Parameter);
    

这一行有错误 ==>

return base.ExecuteFunction<State_>("AddState", prod_StateID_Parameter, shortName_Parameter, stateName_Parameter);

我该如何解决这个问题?

谢谢

【问题讨论】:

请贴出相关的C#代码,这大概就是问题所在 您是否尝试过从 INT 声明中删除显示宽度 (11) @ThomasLevesque 我已编辑 @Strillo 是的,我试过了,但结果是一样的 【参考方案1】:

我解决了这个问题。

问题在于存储过程参数。

mysql和实体框架一起使用的时候,表和值参数应该是同名的。

我的意思是存储过程应该是:

CREATE  PROCEDURE CreateState_(

IN Prod_StateID_ INT(11),
IN ShortName_ VARCHAR(3),
IN StateName_ VARCHAR(50)
)

BEGIN INSERT INTO State_
(
Prod_StateID_,
ShortName_,
StateName_
)
VALUES 
( 
Prod_StateID_ ,
ShortName_ ,
StateName_
) ; 
END$$

【讨论】:

嗨,如果我按如下方式创建表delimiter $$ CREATE TABLE tbluser ( UserID int(11) NOT NULL, FirstName varchar(45) DEFAULT NULL, Username varchar(45) DEFAULT NULL, Password varchar(45) DEFAULT NULL, Sex varchar(45) DEFAULT NULL, LastName varchar(45) DEFAULT NULL, PRIMARY KEY (UserID) ) 那么我该如何按照你所说的编写例程【参考方案2】:

在您的情况下,还有另一种解决方案 edmx 添加或删除一些内容,如“p_”或删除一些字符为“kick_”。

确保存储过程和 edmx 函数中的参数名称保持相同。如果它们不同,则使它们相同。

MySql 过程:


CREATE CommentsDelete(TCommentId int)
BEGIN

delete from SmComment where Commentid in
(
select commentid from smcomment where parentid= TCommentId or commentid=TCommentId;
);
END

第一个 Edmx 创建了这个函数:

public int CommentsDelete(Nullable<global::System.Int32> p_CommentId)
        
            ObjectParameter p_CommentIdParameter;
            if (p_CommentId.HasValue)
            
                p_CommentIdParameter = new ObjectParameter("p_CommentId", p_CommentId);
            
            else
            
                p_CommentIdParameter = new ObjectParameter("p_CommentId", typeof    (global::System.Int32));
            

            return base.ExecuteFunction("RecursiveCommentsDelete", p_CommentIdParameter);
        

我用“TCommentId”替换“p_CommentId”现在这对我来说很好

Edmx 设计器功能:

public int CommentsDelete(Nullable<global::System.Int32> p_CommentId)
        
            ObjectParameter p_CommentIdParameter;
            if (p_CommentId.HasValue)
            
                p_CommentIdParameter = new ObjectParameter("TCommentId", p_CommentId);
            
            else
            
                p_CommentIdParameter = new ObjectParameter("TCommentId", typeof    (global::System.Int32));
            

            return base.ExecuteFunction("RecursiveCommentsDelete", p_CommentIdParameter);
        

【讨论】:

以上是关于为啥在集合中找不到 Mysql 存储过程参数?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 EF4.1 - 存储过程“在容器中找不到”

sqlserver profiler为啥跟踪不到自定义的存储过程执行情况

Mysql 存储过程实例详解

mysql存储过程 怎么用like 得不到结果

使用 ssis 包在 SQL Server 代理作业中找不到存储过程错误

我在动态 sql 中找不到错误