过程中表值参数中的标识列,如何定义DataTable

jat*_*tto 3 ado.net sql-server-2008 table-valued-parameters

是否可以将类型为"[int] IDENTITY(1,1)"的列的"table"类型的参数传递给过程,并使用作为输入参数传递的DataTable对象执行此存储过程?

我收到以下错误:"INSERT到表变量上不允许的标识列.表值参数\"@ xxxxx \"的数据不符合参数的表类型."

我能找到的唯一相关注释是"如果在表值参数中为标识列提供值,则必须为会话发出SET IDENTITY_INSERT语句."

似乎即使没有在表参数中设置PK,它也会在某个时刻自动设置.这种情况发生在哪里,如何避免?

Bra*_*rad 7

我有同样的问题,我们想要一个类型的标识,但不想提供一个值.关键是使用SqlMetaData该列的构造函数设置useServerDefaulttrue:

根据Tim Van Wassenhove 在ado net中使用用户定义的表类型和识别列的这篇文章

SQL:

CREATE TYPE [Star].[example] AS TABLE(  
  [Ordinal] [int] IDENTITY(1,1) NOT NULL,  
  [Name] [nvarchar](200) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

C#:

var sqlMetaData = new[] 
{  
  new SqlMetaData("Ordinal", SqlDbType.Int, true, false, SortOrder.Unspecified, -1),   
  new SqlMetaData("Name", SqlDbType.NVarChar, 200)
};

sqlRecords = new HashSet<SqlDataRecord>(usersToInclude.Select(user =>
{   
  var record = new SqlDataRecord(sqlMetaData);   
  record.SetString(1, user.Name);   
  return record; 
}));

new SqlMetaData("IdentityField", SqlDbType.Int, true, false, SortOrder.Unspecified, -1)
Run Code Online (Sandbox Code Playgroud)

  • 你是如何实际实现的? (5认同)