2017-10-12 15 views
1

私は多くの投稿を読んだことがあると思いますが、私の概念はわかっていると思いますが、小さな配列のintはC#/ EFモジュールからSQLストアドプロシージャ。他の目を望むことは、問題を見つけることができます。私はEF6を使用していint配列をエンティティフレームワーク経由でT-SQLストアドプロシージャに渡す

、4.5の.NET Framework、私はこれらのタイプ/ procsの作成したデータベースでの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のコードが正常にPROCを呼び出しんし、私はハードコードprocは単に姓のの選択を返すためにならば、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(); 

#コード。これはであることを私に伝えます。

私は、他のT-SQLコードからprocを呼び出して、準備されたint型のテーブル値のパラメータ(IntsTTV)を渡すと動作します。

渡されたパラメータテーブルの行数を選択すると、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

nice!あなたは今答えを受け入れるべきです – 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 , ',')) 
関連する問題