操作数类型冲突:varchar 不兼容

Posted

技术标签:

【中文标题】操作数类型冲突:varchar 不兼容【英文标题】:Operand type ***: varchar is incompatible 【发布时间】:2015-07-29 12:16:24 【问题描述】:

我创建了一个用户数据表类型如下:

CREATE TYPE [dbo].[UDTPASpecMYTest] AS TABLE(
    [EmpName] [varchar](max) NULL,
    [Empaddress] [varchar](max) NOT NULL,
    [EmpCarname] [varchar](max) NULL     
)
GO

并声明如下过程:

CREATE procedure [dbo].[test]
(
      @tblPASpecs UDTPASpecMYTest  READONLY    
)
AS
BEGIN
select 1
END

当我通过传递数据表从应用程序调用过程时,它显示错误:

“操作数类型冲突:nvarchar 与 UDTPASpecMYTest 不兼容”。

应用代码:

DataColumn workCol = dtbl.Columns.Add("EmpName", typeof(String));   
dtbl.Columns.Add("Empaddress", typeof(String));
dtbl.Columns.Add("EmpCarname", typeof(String));
dtbl.Rows.Add("Test", "Test", "Test");
strQuery = "EXEC dbo.test @tblPASpecs=" + dtbl + "";

//call the procedure
CMASConnectionProvider.DMLService.ExecSqlReturnDataSet(strQuery); 

【问题讨论】:

你必须将它作为参数传递,你不能在这里使用字符串连接。 ...参数数据类型应为SqlDbType.Structured 这应该对你有帮助:msdn.microsoft.com/en-us/library/bb675163.aspx 要在 C# 中使用 SQL 用户类型,您必须告知其类型。如果您使用 ADO.Net 并且正在执行存储过程,则在定义参数时,您必须将类型指定为 SqlDbType.Structured 并且类型名称与您的类型名称一样,= "dbo.UDTPASpecMYTest"; 这个question 展示了如何使用 ADO.Net。 【参考方案1】:

您只是将类型名称(作为字符串)传递给您的存储过程。 相反,您必须使用 SqlParameter 对象传递表实例。

类似这样的:

var connection = CMASConnectionProvider.Connection;
var command = new SqlCommand("dbo.test", connection);
command.CommandType = CommandType.StoredProcedure;

// Next 2 lines are the point:
var parameter = command.Parameters.AddWithValue("@tblPASpecs", dtbl); 
parameter.SqlDbType = SqlDbType.Structured; 

// Execute the command according your needs and existing helper classes
// var result = command.Execute();

这篇文章准确地解释了你想做什么,请read here

【讨论】:

您确实应该在答案中包含链接的相关部分,以防止链接失效的可能性。

以上是关于操作数类型冲突:varchar 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Always Encrypted:操作数类型冲突:varchar 与 varchar(max) 不兼容

操作数类型冲突:uniqueidentifier 与 float 不兼容

操作数类型冲突:int 与 uniqueidentifier 不兼容

如何解决操作数类型冲突:日期与 int 不兼容

SQL Server - 操作数类型冲突:数字与 datetimeoffset 不兼容

当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 int 不兼容”错误?