用户定义的表类型,其Id为Identity(1,1)

问题描述 投票:1回答:1

我在过程中使用用户定义的表类型作为参数,并且用户定义的表有一个Id列,其中设置了identity标志。

问题:

CREATE TYPE [dbo].[UdtTable] AS TABLE
                                (
                                    [Id] [INT] IDENTITY(1, 1),
                                    [StudentId] [INT] NOT NULL
                                )

在SQL Server中直接执行我的过程时,它正在工作,但是当我从C#代码调用此过程时,它不起作用,但它也没有显示任何错误。

此查询运行正常:

DECLARE @TableUDT [UdtTable];

INSERT INTO @TableUDT 
    SELECT 201;

INSERT INTO @TableUDT 
    SELECT 202;

EXEC MYProcName @TableUDT

但这不起作用:

DataTable udtDataTable = new DataTable();
udtDataTable.Columns.Add("StudentId");


DataRow dRow = udtDataTable.NewRow();
dRow["StudentId"] = 201
udtDataTable.Rows.Add(dRow)

DataRow dRow2 = udtDataTable.NewRow();
dRow2["StudentId"] = 201
udtDataTable.Rows.Add(dRow2)

List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@TableLeaveID", udtDataTable));

DataTable = new DML.RunProcedure("MyProcName",parameters);

注意:根据我的程序,它应该返回一个表。

c# sql-server ado.net user-defined-types
1个回答
1
投票

有三件事可以作为表值参数传递:

  • IEnumerable的
  • 数据表
  • DbDataReader

你可以尝试使用IEnumerable<SqlDataRecord>

关键点是为该列使用SqlMetaData构造函数,将useServerDefault设置为true以获取Id参数。

var sqlMetaData = new[] 
{  
  new SqlMetaData("Id", SqlDbType.Int, true, false, SortOrder.Unspecified, -1),   
  new SqlMetaData("StudentId", SqlDbType.Int)
};

var record = new SqlDataRecord(sqlMetaData);   
record.SetInt32(1, 201);   
List<SqlDataRecord> sqlRecords = new List<SqlDataRecord>();
sqlRecords.Add(record);

parameters.Add(new SqlParameter("@TableLeaveID", sqlRecords));
© www.soinside.com 2019 - 2024. All rights reserved.