我有在本地计算机上正确执行但无法在服务器计算机上执行的c#代码。
在我的代码中,我正在c#中调用SQL存储过程,(c#代码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#代码1中缺少什么吗?
感谢帮助。
最佳答案
1)如果您运行sql server profiler并将查询跟踪到数据库,则可能会在服务器上收到实际错误。如您所说的拥有SSMS,请查看“工具”菜单以找到分析器。您可能会找到失败的语句并查看实际错误是什么。
2)我的猜测是您遇到类型转换问题。 ExecuteSqlCommand根据您提供的字符串创建自己的sql语句,并在此语句中声明您提供的参数(例如,声明@OrgUnitId int;)。变量的类型在参数定义中明确定义或从参数值中导出。但是如果提供null或DBNull.Value是不可能的,所以使用默认的nvarchar类型。在您的情况下,它与@IsTestUser的类型矛盾。
对参数使用显式类型定义:
new SqlParameter("@IsTestUser", SqlDbType.Int)
{
Value = YouValue
};
旁注:
最佳做法是始终定义参数的类型。
您可以使用位类型代替Int作为此参数。
对于逻辑上不可为空的值,最好不要允许为NULL。
IsTestUser应该为true或false,可能是因为在这种情况下,您不需要null值-我不知道。如果不想在插入中显式指定值,则数据库中的默认值仍可能为0。