2017-10-12 31 views
1

我已經閱讀了很多文章並認爲理解了這些概念,但是我的小整數整數未能從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代碼調用時得到正確的計數。

我錯過了什麼?

回答

1

這就是我如何使用表值參數調用存儲過程。主要區別在於我使用DataTable參數。

我記得有參數名稱綁定的問題,但我不記得它們是什麼。這解釋了我在過程調用的語法中所做的更改。我知道這個人應該工作。

var dataTable = new DataTable(); 
dataTable.TableName = "dbo.IntsTTV"; 
dataTable.Columns.Add("Id", typeof(int)); 
dataTable.Rows.Add(1); // Id of '1' is valid for the Person table 

SqlParameter parameter = new SqlParameter("UserIds", SqlDbType.Structured); 
parameter.TypeName = dataTable.TableName; 
parameter.Value = dataTable; 

var res = _db.Database.SqlQuery<string>("EXEC GetUsers @UserIds", parameter).ToList(); 
1

工作!爲了其他人的緣故,我會在這裏發佈精確的代碼,我不得不微調。

var dataTable = new DataTable(); 
dataTable.TableName = "dbo.IntsTTV"; 
dataTable.Columns.Add("Id", typeof(int)); 
dataTable.Rows.Add(1); // Id of '1' is valid for the Person table 

SqlParameter parameter = new SqlParameter("UserIds", SqlDbType.Structured); 
parameter.TypeName = "dbo.IntsTTV"; 
parameter.Value = dataTable; 
var res = _db.Database.SqlQuery<string>("EXEC dbo.GetUsers @UserIds", parameter).ToList(); 
+0

不錯!你現在應該接受一個答案 – jbl

0

我知道這已經回答了發現一種不同的方式,可能會幫助別人那裏

STRING_SPLIT

declare @intArray nvarchar(1000) 
set @intArray = '1,2,3,4,5' 
select value from STRING_SPLIT(@intArray , ',') 

這將在您的@intArray返回一個新的表的數字

然後你只需要把它作爲普通表使用

select * from myMainTable where Id in (select value from STRING_SPLIT(@intArray , ',')) 
相關問題