Параметр значения таблицы из c #

Я прочитал несколько статей, и все они выглядят следующим образом. Когда я выполняю из 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

person Phillip Scott Givens    schedule 14.11.2014    source источник


Ответы (2)


По умолчанию CommandType - Text; вам нужно указать, что команда предназначена для хранимой процедуры:

insertCommand.CommandType = CommandType.StoredProcedure;

После добавления этого кода у меня работает.

person Slippery Pete    schedule 14.11.2014

Проблема в том, что вы используете AddWithValue.

Попробуйте вместо этого.

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

Вы также можете взглянуть на эту статью. http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/

person Sean Lange    schedule 14.11.2014
comment
Спасибо за ответ, но с вашим ответом возникли некоторые проблемы. Во-первых, предоставленная вами ссылка не имеет отношения к этому примеру, потому что я не предполагаю тип, я установил для него значение «Структурированный». Вторая проблема заключается в том, что даже если мы укажем тип, как предписано, нам все равно нужно указать TypeName. Третья проблема с вашим ответом заключается в том, что вы используете Udt, когда нам нужно использовать Structured. - person Phillip Scott Givens; 15.11.2014