gpt4 book ai didi

c# - 奇怪的 SQL 错误 int 参数转换为 nvarchar

转载 作者:行者123 更新时间:2023-11-30 22:06:30 25 4
gpt4 key购买 nike

错误:

The parameterized query '(@TeacherID nvarchar(9),@LeaderID nvarchar(9),@Status int,' expects the parameter '@ORatingID', which was not supplied.

存储过程参数:

@TeacherID varchar(9),
@LeaderID varchar(9),
@Status int,
@SharedDraft bit,
@SGrowthRatingID int,
@ORatingID int,
@Q1Text varchar(max),
@Q2Text varchar(max),
@Q3Text varchar(max),
@Q4Text varchar(max)

SQL Server Profiler 显示:

exec sp_executesql N'usp_EOYASave @TeacherID, @LeaderID, @Status, 
@SharedDraft, @SGrowthRatingID, @ORatingID, @Q1Text, @Q2Text, @Q3Text,
@Q4Text',N'@TeacherID nvarchar(9),@LeaderID nvarchar(9),@Status int,
@SharedDraft bit,@SGrowthRatingID int,@ORatingID nvarchar(4000),
@Q1Text nvarchar(11),@Q2Text nvarchar(4),@Q3Text nvarchar(4000),
@Q4Textnvarchar(4)',@TeacherID=N'100',@LeaderID=N'1002',@Status=7,
@SharedDraft=0,@SGrowthRatingID=1,@ORatingID=default,
@Q1Text=N'test 123 bc',@Q2Text=N'test',@Q3Text=N'',@Q4Text=N'test'

注意:

@ORatingID nvarchar(4000) 
@ORatingID=default

C# 中的调用代码:

db.Database.ExecuteSqlCommand("usp_EOYASave @TeacherID, @LeaderID, @Status,
@SharedDraft, @SGrowthRatingID, @ORatingID,
@Q1Text, @Q2Text, @Q3Text, @Q4Text",
new SqlParameter("TeacherID", EOYRating.CurrentTeacher.ID),
new SqlParameter("LeaderID", EOYRating.IsLeader == true ?
EOYRating.CurrentLeader.LeaderID : null),
new SqlParameter("Status", EOYRating.IsLeader == false ?
EOYRating.TeacherStatus : EOYRating.LeaderStatus),
new SqlParameter("SharedDraft", sharedDraft),
new SqlParameter("ORatingID", EOYRating.IsLeader == true ?
(Int32?)EOYRating.OverallRatingValue : null),
new SqlParameter("SGrowthRatingID", EOYRating.IsLeader == true ?
(Int32?)EOYRating.StudentGrowthRatingValue : null),
new SqlParameter("Q1Text", q1Text != null ? q1Text : ""),
new SqlParameter("Q2Text", q2Text != null ? q2Text : ""),
new SqlParameter("Q3Text", q3Text != null ? q3Text : ""),
new SqlParameter("Q4Text", q4Text != null ? q4Text : ""));

问题:

当我运行此代码(在 SQL Server 中)并将“默认值”更改为 0 或 null 时,它起作用了。

为什么将其转换(或识别)为 nvarchar(4000)

更新:

我根据建议尝试了这个:

new SqlParameter("ORatingID", SqlDbType.Int, 4, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Current , EOYRating.IsLeader == true ? (Int32?)EOYRating.OverallRatingValue : null),

我收到了同样的错误信息。

最佳答案

可能此构造函数正在使用反射来检查参数的数据类型,并且由于值为 null,因此它假定它是一个字符串。您可以使用备用构造函数仅指定 sql 数据类型。

var param = new SqlParameter("ORatingID", 
SqlDbType.Int)

param.Value = EOYRating.IsLeader == true ? (Int32?)EOYRating.OverallRatingValue : (Int32?)null;

关于c# - 奇怪的 SQL 错误 int 参数转换为 nvarchar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23639734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com