2014-11-14 55 views
1

我已经阅读了大量的文章,他们都看起来像下面这样。当我从SSMS执行时,一切都很好。当我从c#执行时,我没有任何例外。当我检查表格时,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 

回答

2

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

insertCommand.CommandType = CommandType.StoredProcedure; 

添加此代码后,您的代码适用于我。

0

的问题是,你正在使用AddWithValue。

试试这个。

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

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

+0

谢谢您的回答,但您的答案有几个问题。首先,您提供的链接与此示例无关,因为我不推断该类型,所以我已将其设置为“结构化”。第二个问题是,即使我们按照规定指定了类型,我们仍然需要指定“TypeName”。答案的第三个问题是,当我们需要使用“结构化”时,您正在使用“Udt”。 – 2014-11-14 22:30:01