用户定义的 table 类型,列 ID 为 Identity(1,1)
User-defined table type with column Id as Identity(1,1)
我在过程中使用用户定义的 table 类型作为参数,并且用户定义的 table 有一列 Id
,其中设置了 identity
标志.
问题:
CREATE TYPE [dbo].[UdtTable] AS TABLE
(
[Id] [INT] IDENTITY(1, 1),
[StudentId] [INT] NOT NULL
)
直接在 SQL 服务器中执行我的过程时,它可以正常工作,但是当我从 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);
注意:根据我的程序应该return一个table.
有 3 个东西可以作为 Table 值参数传递:
- IEnumerable
- 数据Table
- DbDataReader
你可以尝试使用IEnumerable<SqlDataRecord>
关键点是为该列使用 SqlMetaData 构造函数,为 Id
参数将 useServerDefault
设置为 true
。
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));
我在过程中使用用户定义的 table 类型作为参数,并且用户定义的 table 有一列 Id
,其中设置了 identity
标志.
问题:
CREATE TYPE [dbo].[UdtTable] AS TABLE
(
[Id] [INT] IDENTITY(1, 1),
[StudentId] [INT] NOT NULL
)
直接在 SQL 服务器中执行我的过程时,它可以正常工作,但是当我从 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);
注意:根据我的程序应该return一个table.
有 3 个东西可以作为 Table 值参数传递:
- IEnumerable
- 数据Table
- DbDataReader
你可以尝试使用IEnumerable<SqlDataRecord>
关键点是为该列使用 SqlMetaData 构造函数,为 Id
参数将 useServerDefault
设置为 true
。
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));