我已經閱讀了很多文章並認爲理解了這些概念,但是我的小整數整數未能從C#/ EF模塊傳遞到SQL Server存儲過程。希望其他人能夠發現問題。通過實體框架將整數的數組傳遞給T-SQL存儲過程
我使用EF6,4.5 .Net框架下,SQL Server 2014
在數據庫中,我創建了這些類型/特效:
CREATE TYPE [dbo].[IntsTTV] AS TABLE(
[Id] [int] NOT NULL
)
注意,存在一個名爲 '人' 表列'Id'(int)和'LastName'(nvarchar),並有數據。
CREATE PROCEDURE [dbo].[GetUsers]
@UserIds dbo.IntsTTV READONLY
AS
BEGIN
SELECT p.LastName
FROM [dbo].[Person] p
INNER JOIN @UserIds ids On p.Id = ids.Id;
END
// C#代碼
SqlMetaData[] columns = new SqlMetaData[1];
columns[0] = new SqlMetaData("Id", SqlDbType.Int);
SqlDataRecord row = new SqlDataRecord(columns);
row.SetInt32(0, 1); // Id of '1' is valid for the Person table
SqlDataRecord[] table = new SqlDataRecord[1];
table[0] = row;
SqlParameter parameter = new SqlParameter();
parameter.SqlDbType = SqlDbType.Structured;
parameter.ParameterName = "@UserIds";
parameter.TypeName = "dbo.IntsTTV";
parameter.Direction = ParameterDirection.Input;
parameter.Value = table;
SqlParameter[] parameters = new SqlParameter[1];
parameters[0] = parameter;
var res = _db.Database.SqlQuery<string>("GetUsers", parameters).ToList();
代碼沒有成功調用PROC,如果我硬代碼PROC只返回一個選擇姓氏的的那麼C#代碼沒有收到。這告訴我什麼是工作。
如果我從其他T-SQL代碼中調用proc,傳入一個預先準備的int值的表值參數(IntsTTV),它將起作用。
在proc中,如果我選擇傳遞參數表的行數,我從C#代碼調用時得到零,但從T-SQL代碼調用時得到正確的計數。
我錯過了什麼?
不錯!你現在應該接受一個答案 – jbl