我已經閱讀了大量的文章,他們都看起來像下面這樣。當我從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
謝謝您的回答,但您的答案有幾個問題。首先,您提供的鏈接與此示例無關,因爲我不推斷該類型,所以我已將其設置爲「結構化」。第二個問題是,即使我們按照規定指定了類型,我們仍然需要指定「TypeName」。答案的第三個問題是,當我們需要使用「結構化」時,您正在使用「Udt」。 – 2014-11-14 22:30:01