2013-07-23 50 views
27

C#でユーザー定義のテーブル型をクエリに渡そうとしています。System.ArgumentException:テーブル型パラメータに有効な型名が必要です

タイプは2列(組織およびサブ組織)で定義されて

これは私のコードは次のようになります。

DataSet ds = new DataSet(); 
try 
{ 

    DataTable FilteredOrgSubOrg = new DataTable("OrgSubOrgValueType"); 
    FilteredOrgSubOrg.Columns.Add("org", typeof(string)); 
    FilteredOrgSubOrg.Columns.Add("subOrg", typeof(string)); 
    FilteredOrgSubOrg.Rows.Add(org, orgsub); 
    using (SqlConnection conn = new SqlConnection(cCon.getConn())) 
    { 
     using (SqlCommand cmd = conn.CreateCommand()) 
     { 
      cmd.CommandText = 
       "select * from myTable ex where year = @year' and qtr = @qtr" + 
       " and EXISTS(SELECT 1 FROM @OrgSubOrg tt WHERE ex.org like tt.org" + 
       " AND ex.orgsub = tt.suborg )"+ 
       " order by ex.org,year, qtr DESC"; 
      // 2. set the command object so it knows 
      // to execute a stored procedure 

      // 3. add parameter to command, which 
      // will be passed to the stored procedure 
      cmd.Parameters.Add(new SqlParameter("@OrgSubOrg", FilteredOrgSubOrg)); 
      cmd.Parameters.Add(new SqlParameter("@year", year)); 
      cmd.Parameters.Add(new SqlParameter("@qtr", qtr)); 


      conn.Open(); 
      SqlDataAdapter sqlDA = new SqlDataAdapter(); 

      sqlDA.SelectCommand = cmd; 
      sqlDA.Fill(ds); 

     } 
    } 

私は間違っにパラメータを渡すのですか?

私はそうのようなSQLサーバーでそれを行う:

declare @OrgSubOrg OrgSubOrgValueType 
insert into @OrgSubOrg values ('05%','00000000') 
insert into @OrgSubOrg values ('03%','00000000') 


------------ complete ----------------------------------- 
select * from myTable ex 
where 
year = '2013' and qtr = '1' 
and EXISTS(
       SELECT 1 
       FROM @OrgSubOrg tt    
       WHERE ex.org like tt.org 
       AND ex.orgsub = tt.suborg ) 
order by ex.org,year, qtr DESC 

everything works like it should. 

私もそうのようにそれを渡してみました:

SqlParameter p = cmd.Parameters.Add(new SqlParameter("@OrgSubOrg", SqlDbType.Structured)); 
        p.Value = FilteredOrgSubOrg; 

しかし

The table type parameter '@OrgSubOrg' must have a valid type name. 

同じエラーを取得していますそれは私がSQLコマンドに渡すことができないかもしれない、私は別の場所で、似たようなコードを持っているストアドプロシージャと素晴らしい...?

答えて

55

TypeNameプロパティを使用して、SqlServerの型にマッピングを設定します。修正する必要がある、テーブル値のパラメータの型名を取得または設定します。

p.TypeName = "dbo.MyType"; 

チェックだけでなくTable-Valued Parametersポスト

+4

は動作しませんでしたコードでエンベロープされたクエリとして、一度ストアドプロシージャを作成すると、すべての問題が解決されました。 –

+0

それはまさに私の問題でした。ありがとう! – clweeks

+0

私の問題も多かれ少なかれ..私の場合、それはすでにストアドプロシージャでしたが、私はQueryType.Textでデータベースへの呼び出しを実行していました。 QueryType.StoredProcedureに変更すると修正されました。 –

3

ときたいパステーブルのparamsストアドプロシージャにも、このエラーを取得することができます。エンティティのFamework Context.Database.SqlQuery()を使用すると起こります。テーブルのparamsのTypeNameプロパティを設定する必要があります。

SqlParameter codesParam = new SqlParameter(CODES_PARAM, SqlDbType.Structured); 
      SqlParameter factoriesParam = new SqlParameter(FACTORIES_PARAM, SqlDbType.Structured); 

      codesParam.Value = tbCodes; 
      codesParam.TypeName = "[dbo].[MES_CodesType]"; 
      factoriesParam.Value = tbfactories; 
      factoriesParam.TypeName = "[dbo].[MES_FactoriesType]"; 


      var list = _context.Database.SqlQuery<MESGoodsRemain>($"{SP_NAME} {CODES_PARAM}, {FACTORIES_PARAM}" 
       , new SqlParameter[] { 
        codesParam, 
        factoriesParam 
       } 
       ).ToList(); 
3

ストアドプロシージャを実行していると、あなたはSqlCommand.CommandTypeがCommandType.StoredProcedureに設定されていないとき、これはまたのような、起こることに注意してください:

using (SqlCommand cmd = new SqlCommand("StoredProcName", conn)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.ExecuteNonQuery(); 
} 
+0

^TypeNameを見る前にこれをチェックします。これがバニラSqlCommandがこのエラーを発生させる原因である可能性が高いようです –

関連する問題