【问题标题】:Table Value Parameter from c#来自 c# 的表值参数
【发布时间】:2014-11-14 21:00:55
【问题描述】:

我已经阅读了许多文章,它们都如下所示。当我从 SSMS 执行时,一切都很好。当我从 c# 执行时,我没有任何异常。当我检查表格时,c# 没有插入。

CREATE TABLE dbo.Rates
    (Id BIGINT PRIMARY KEY IDENTITY, 
    LocationName NVARCHAR(50) NOT NULL, 
    CostRate INT NOT NULL);
GO

/* Create a table type. */
CREATE TYPE dbo.RatesType AS TABLE 
    ( LocationName NVARCHAR(50)
    , CostRate INT );
GO

/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE dbo.usp_InsertLocationRates
    @TVP RatesType READONLY
    AS 
    SET NOCOUNT ON
    INSERT INTO Rates
            (LocationName
            , CostRate)
        SELECT LocationName, CostRate
        FROM  @TVP;
GO

INSERT INTO dbo.Rates
        (LocationName
        , CostRate)
VALUES ( N'Costa Rica', 38)

DECLARE @T as dbo.RatesType
INSERT INTO @T(LocationName, CostRate)
VALUES('Equador', 24)
EXEC usp_InsertLocationRates @T;

SELECT * FROM DBO.Rates

这是没有错误也没有结果的c#。

try
{
    DataTable table = new DataTable("Items");
    table.Columns.Add("LocationName", typeof(string));
    table.Columns.Add("CostRate", typeof(int));    
    table.Rows.Add("Bali, Indonesia", 43);        

    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SampleDB"].ConnectionString))
    {
        connection.Open();

        var insertCommand = new SqlCommand("usp_InsertLocationRates", connection);
        var tableValueParameter = insertCommand.Parameters.AddWithValue("@TVP", table);
        tableValueParameter.SqlDbType = SqlDbType.Structured;
        tableValueParameter.TypeName = "RatesType";

        insertCommand.ExecuteNonQuery();
        connection.Close();
    }
}
catch (Exception e)
{
    // No error exists!
}

运行SQL再c#后的结果:

Id  | LocationName  | CostRate
1   | Costa Rica    | 38
2   | Equador       | 24

【问题讨论】:

    标签: sql-server ado.net table-valued-parameters


    【解决方案1】:

    默认CommandTypeText;您需要指定该命令用于存储过程:

    insertCommand.CommandType = CommandType.StoredProcedure;
    

    添加此代码后,您的代码对我有用。

    【讨论】:

      【解决方案2】:

      问题在于您使用的是 AddWithValue。

      试试这个。

      insertCommand.Parameters.Add("@TVP", SqlDbType.Udt).Value = table;
      

      您可能还想看看这篇文章。 http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/

      【讨论】:

      • 感谢您的回答,但您的回答存在一些问题。首先是您提供的链接与此示例无关,因为我没有推断类型,我已将其设置为“结构化”。第二个问题是即使我们确实按照规定指定了类型,我们仍然需要指定“TypeName”。您回答的第三个问题是,当我们需要使用“结构化”时,您正在使用“Udt”。
      猜你喜欢
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2012-12-20
      相关资源
      最近更新 更多