C#中如何使用存储过程的表值参数?如何传递?

来源:这里教程网 时间:2026-02-21 17:28:12 作者:

在C#中使用存储过程的表值参数(Table-Valued Parameters, TVP),需要在数据库端定义用户自定义表类型,并在存储过程中作为参数接收。C#通过 DataTableDbDataReader 将数据传递给该参数。以下是具体步骤和示例。

1. 在SQL Server中创建用户定义表类型

首先,在数据库中定义一个表类型,作为TVP的基础。

示例:

CREATE TYPE dbo.UserListType AS TABLE
(
    Id INT,
    Name NVARCHAR(50)
);

2. 创建使用TVP的存储过程

编写存储过程,接收表值参数。

示例:

CREATE PROCEDURE dbo.InsertUsers
    @Users dbo.UserListType READONLY
AS
BEGIN
    INSERT INTO Users (Id, Name)
    SELECT Id, Name FROM @Users;
END

3. C#代码中传递DataTable作为TVP

在C#中,使用 SqlParameter 并设置其 SqlDbTypeStructured,同时指定 TypeName 为自定义表类型名。

示例代码:

    var parameter = new SqlParameter("@Users", SqlDbType.Structured)
    {
        TypeName = "dbo.UserListType",
        Value = dataTable
    };
    command.Parameters.Add(parameter);
    command.ExecuteNonQuery();
}

4. 注意事项

TVP 参数必须声明为 READONLY,不能在存储过程中修改。 C# 中只能传递 DataTableDbDataReader 或实现了 IEnumerable 的对象。 Type name 必须与数据库中定义的表类型完全一致(包括 schema)。 确保连接字符串具有执行存储过程和插入数据的权限。

基本上就这些。只要数据库类型和C#传入的数据结构匹配,TVP就能高效传递多行数据,避免多次调用。

相关推荐