2012-10-05 28 views
0

同时传递TVP到一个存储过程,我得到错误表值参数

我的代码是

SqlConnection con=new SqlConnection(); 
con.Open(); 

SqlCommand cmd=new SqlCommand("SPName",con); 

DataTable dataTable = new DataTable("vpTableGuid"); 

dataTable.Columns.Add("id1", typeof(Guid)); 
dataTable.Columns.Add("rowNum", typeof(Int32)); 

dataTable.Rows.Add(Guid.NewGuid(),1); 
dataTable.Rows.Add(Guid.NewGuid(),2); 
dataTable.Rows.Add(Guid.NewGuid(),3); 

SqlParameter param = new SqlParameter("@evaluatorList", dataTable);       
param.SqlDbType = SqlDbType.Structured; 
param.TypeName = "dbo.vpTableGuid"; 

command.Parameters.Add(param); 

command.ExecuteNonQuery(); 

上面的代码抛出一个错误:

INSERT into an identity column not allowed on table variables.
The data for table-valued parameter "@evaluatorList" doesn't conform to the table type of the parameter.

+2

你能告诉我们你的存储过程的定义吗?很显然,存储过程期望的内容与您如何从C#调用它之间存在差异...... –

+1

看起来您正试图在作为标识的列中插入值。什么类型的专栏是你的“id1”? – Romo

+0

如果您也可以显示'vpTableGuid'的定义,这将有所帮助。 –

回答

0

您不能设置在SQL中手动标识列。

定义SQL中的主键列,例如:

id1 UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY 

删除此行的代码:

dataTable.Columns.Add("id1", typeof(Guid)); 

,改变你的vpTableGuid定义不包括ID1列。

+1

这是抱怨'IDENTITY'列。根据定义,因为不能是“uniqueidentifier”列,所以不能抱怨'id1'。 –

+0

啊好。这很愚蠢。我想我们需要看看他的TVP定义以及可能存储的proc。 –