Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列Id为标识(1,1)的用户定义表类型_C#_Sql Server_Ado.net_User Defined Types - Fatal编程技术网

C# 列Id为标识(1,1)的用户定义表类型

C# 列Id为标识(1,1)的用户定义表类型,c#,sql-server,ado.net,user-defined-types,C#,Sql Server,Ado.net,User Defined Types,我使用用户定义的表类型作为过程中的参数,该用户定义的表有一列Id,该列设置了identity标志 问题: CREATE TYPE [dbo].[UdtTable] AS TABLE ( [Id] [INT] IDENTITY(1, 1), [StudentId] [INT] NOT NULL

我使用用户定义的表类型作为过程中的参数,该用户定义的表有一列
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);
DataTable udtDataTable=newdatatable();
udtDataTable.Columns.Add(“StudentId”);
DataRow dRow=udtDataTable.NewRow();
卓尔[“学生ID”]=201
udtDataTable.Rows.Add(dRow)
DataRow dRow2=udtDataTable.NewRow();
dRow2[“学生ID”]=201
udtDataTable.Rows.Add(dRow2)
列表参数=新列表();
Add(新的SqlParameter(“@TableLeaveID”,udtDataTable));
DataTable=新的DML.RunProcedure(“MyProcName”,参数);

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

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

  • 数不清
  • 数据表
  • DbDataReader
您可以尝试使用
IEnumerable

关键点是为该列使用构造函数,该构造函数将
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));
var sqlMetaData=new[]
{  
新的SqlMetaData(“Id”,SqlDbType.Int,true,false,SortOrder.Unspecified,-1),
新的SqlMetaData(“StudentId”,SqlDbType.Int)
};
var记录=新的SqlDataRecord(sqlMetaData);
SetInt32(1201);
List sqlRecords=new List();
添加(记录);
添加(新的SqlParameter(“@TableLeaveID”,sqlRecords));

您需要调用
udtDataTable.Rows.Add(dRow)
将这些新闻行实际添加到
DataTable
!!现在,您只需要创建两个“自由浮动”的
DataRow
实例,但它们没有添加到
DataTable
!很抱歉我没提到那句话。我已经在使用udtDataTable.Rows.Add(dRow)进行添加。