我的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中遗漏了什么?
感谢您的帮助。
答案 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。