16

我有一个用 C# 创建的数据表。

using (DataTable dt = new DataTable())
{
    dt.Columns.Add("MetricId", typeof(int));
    dt.Columns.Add("Descr", typeof(string));
    dt.Columns.Add("EntryDE", typeof(int));
    foreach (DataGridViewRow row in dgv.Rows)
    {
        dt.Rows.Add(row.Cells[1].Value, row.Cells[2].Value, row.Cells[0].Value);
    }

    // TODO: pass dt
}

我有一个存储过程

CREATE PROCEDURE [dbo].[Admin_Fill] 
-- Add the parameters for the stored procedure here
@MetricId INT,
@Descr VARCHAR(100),
@EntryDE VARCHAR(20)

我想要的是将数据表传递给这个存储过程,如何?

4

3 回答 3

17

从 SQL Server 2008 / .NET 3.5 开始,您可以使用表值参数......

查看MSDN 上的指南

此外,由于还有其他可用选项,我比较了将多个值(单个字段)传递给存储过程的 3 种方法(TVP vs XML vs CSV

于 2012-09-07T15:00:52.183 回答
9
  1. 您需要定义要在数据库中传递用户定义的表类型的表类型。

  2. 然后你需要在你的存储过程中添加参数来传递它,如下所示:

    @YourCustomTable AS [dbo].YourCustomTable Readonly,
    
  3. 然后,当您设置好行时,像这样调用它:

    // Setup SP and Parameters
    command.CommandText = "YOUR STORED PROC NAME";
    command.Parameters.Clear();
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@someIdForParameter", someId);
    command.Parameters.AddWithValue("@YourCustomTable",dtCustomerFields).SqlDbType = SqlDbType.Structured;
    
    //Execute
    command.ExecuteNonQuery();
    

这应该可以解决您的问题

于 2012-09-07T15:15:12.783 回答
-2

我们一般将数据喷射到 XML 文档中,并将数据作为 NTEXT 参数传递给数据库。

于 2012-09-07T15:04:23.407 回答