2014-11-14 59 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