从c#执行存储过程

时间:2016-04-13 14:45:18

标签: c# sql entity-framework

我的c#代码在本地计算机上正常执行但无法在服务器计算机上执行。

在我的代码中,我在c#中调用SQL存储过程,(c#code 1)

 int res = db.Database.ExecuteSqlCommand("exec UpsertUser @OrgUnitId, @ExtUserId, @IntUserId, @IsTestUser, @KronosId",
                                    new SqlParameter("@OrgUnitId", Fac),
                                    new SqlParameter("@ExtUserId", id),
                                    new SqlParameter("@IntUserId", IntUserId),
                                    new SqlParameter("@IsTestUser", DBNull.Value),
                                    new SqlParameter("@KronosId", TenetId)
                                    );
                                }

(在上面的代码中我也尝试了0而不是DBNull.value。)  SQL db中的相关存储过程参数是,

    ALTER procedure [dbo].[UpsertUser]
@OrgUnitId int = null,
@ExtUserId varchar(50) = null,
@IntUserId varchar(50) = null,
@IsTestUser int = NULL,
@KronosId VARCHAR(10) = NULL,
@MIPFlag TINYINT =NULL

AS

本地和服务器上的两个代码也相同。

但是,如果我更改SQL db中的参数序列并将kronosId放在IstestUser之前,并将c#中的存储过程更改为,

C#修改:代码2

 int res = db.Database.ExecuteSqlCommand("exec UpsertUser @OrgUnitId, @ExtUserId, @IntUserId, @KronosId",
                                new SqlParameter("@OrgUnitId", Fac),
                                new SqlParameter("@ExtUserId", id),
                                new SqlParameter("@IntUserId", IntUserId),
                                new SqlParameter("@KronosId", TenetId)
                                );

然后它也适用于服务器。

我在c#code 1中遗漏了什么?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

1)如果运行sql server profiler并将查询跟踪到数据库,则可以在服务器上获得实际错误。正如您所说,您有SSMS,请查看工具菜单以查找分析器。您可能会找到失败的语句并查看实际错误。

2)我的猜测是你有类型转换问题。 ExecuteSqlCommand基于您提供的字符串创建自己的sql语句,并在此语句中声明您提供的参数(如声明@OrgUnitId int;)。变量的类型在参数定义中明确定义或由参数值引发。但是如果提供null或DBNull.Value则不可能,因此使用默认的nvarchar类型。在你的情况下,它与@IsTestUser的类型相矛盾。

为参数使用显式类型定义:

new SqlParameter("@IsTestUser", SqlDbType.Int)
        {
            Value = YouValue
        };

附注:

最佳做法是始终定义参数的类型。

此参数可以使用Bit类型而不是Int。

最好不要为逻辑上不可归零的值允许NULL。 IsTestUser应该是true或false,可能,你不需要这里的null值,在这种情况下意味着 - 我不知道。如果您不想在插入中明确指定值,则数据库中的默认值仍可能为0。