Определяемый пользователем тип таблицы с идентификатором столбца Identity (1,1) - PullRequest
1 голос
/ 20 апреля 2019

Я использую пользовательский тип таблицы в качестве параметра в процедуре, и у этой пользовательской таблицы есть столбец 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);

Примечание : в соответствии с моей процедурой должна возвращаться таблица.

1 Ответ

1 голос
/ 20 апреля 2019

В качестве параметра табличного значения можно передать 3 вещи:

  • IEnumerable
  • DataTable
  • 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));
...