【问题标题】:operand type clash: int is incompatible with utblProgramAllotment[user defined table type]操作数类型冲突:int 与 utblProgramAllotment [用户定义的表类型] 不兼容
【发布时间】:2014-07-08 10:18:10
【问题描述】:

我的 C# 代码:

var Message = new SqlParameter("Message", SqlDbType.VarChar, 8000);

Message.Direction = ParameterDirection.Output;

var UserId = new SqlParameter("UserId ", SqlDbType.BigInt);
UserId.Value = Convert.ToInt64(System.Web.HttpContext.Current.Session["UserIDKey"]);

var utblProgramAllotment = new SqlParameter("utblProgramAllotment", SqlDbType.Structured);
utblProgramAllotment.Value = dtProgrammeAllotments;
utblProgramAllotment.TypeName = "dbo.utblProgramAllotment";

try
{
    db.Database.ExecuteSqlCommand(
         "exec uspInsertUpdateProgrammeAllotment    @UserId , @utblProgramAllotment, @Message OUTPUT",
         UserId, utblProgramAllotment, Message);
}
catch (Exception ex)
{
    vm.Message = ex.Message.ToString();
    Errorlog.WriteErrorlog(ex, "Programme Allotment", "");

我的程序接受:

ALTER PROCEDURE   [dbo].[uspInsertUpdateProgrammeAllotment] 
(      
    @utblProgramAllotment AS utblProgramAllotment READONLY,
    @UserId Bigint,
   @Message VARCHAR(8000) OUTPUT    
)

而用户定义的表类型是

CREATE TYPE [dbo].[utblProgramAllotment] AS TABLE(
    [ProgrammeScheduleIDKey] [bigint] NOT NULL,
    [ProposalDetailsIDKey] [bigint] NOT NULL,
    [SanctionOrderIDKey] [bigint] NOT NULL,
    [ProgrammeIDKey] [bigint] NOT NULL,
    [EmployeeIDKey] [bigint] NOT NULL,
    [DistrictIDKey] [bigint] NOT NULL,
    [TargetGroupIDKey] [bigint] NOT NULL,
    [ProgrammeTitleIDKey] [bigint] NOT NULL,
    [ProgramMode] [varchar](3) NOT NULL,
    [ProgrammeDescription] [varchar](500) NOT NULL,
    [ScheduleStartDateDt] [datetime] NULL,
    [ApprovalDt] [datetime] NOT NULL,
    [ScheduleEndDateDt] [datetime] NULL,
    [ProgrammeVenue] [varchar](250) NOT NULL,
    [NoofParticipants] [bigint] NOT NULL,
    [Remarks] [varchar](500) NOT NULL,
    [AccountsRemarks] [varchar](250) NOT NULL,
    [ExamDateDt] [datetime] NULL,
    [ProgrammeTitle] [varchar](250) NOT NULL,
    [DeletedFlg] [bit] NOT NULL
)

我正在将数据表发送到 sql 存储过程。 当我尝试从我的 c# 传递这个数据表时,它显示一个异常为 操作数类型冲突:int 与 utblProgramAllotment 不兼容,这是用户定义的表类型

【问题讨论】:

  • 请努力使您的帖子格式更简洁。修复缩进,确保非代码不被视为代码。
  • 这看起来像是一条 SQL Server 生成的错误消息。我认为解决这个问题的关键在于存储过程本身。可以发一下吗?

标签: c# sql


【解决方案1】:

如果您要将执行存储过程的请求作为临时文本而不是专门作为存储过程执行传递,那么参数顺序应该匹配:

exec uspInsertUpdateProgrammeAllotment @utblProgramAllotment, @UserId ,
                   @Message OUTPUT

或者你应该命名参数:

exec uspInsertUpdateProgrammeAllotment @UserId = @UserId ,
                   @utblProgramAllotment = @utblProgramAllotment,
                   @Message = @Message OUTPUT

EXECUTE:

@parameter_name=value form 一起使用时,参数名称和常量不必按照它们在模块中定义的顺序提供。但是,如果@parameter_name=value 形式用于任何参数,则它必须用于所有后续参数。

和,

如果未指定参数名称,则必须按照模块中定义的顺序提供参数值。

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 2013-08-08
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2019-10-31
    • 2016-07-09
    相关资源
    最近更新 更多