2013-07-23 3 views
27

J'essaie de transmettre un type de table défini par l'utilisateur dans une requête en C#.System.ArgumentException: le paramètre de type de table doit avoir un nom de type valide

le type est défini avec 2 colonnes (org et sous org)

c'est ce que mon code ressemble à:

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); 

     } 
    } 

suis-je passer les paramètres de manière incorrecte?

quand je le fais dans le serveur SQL comme ceci:

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. 

J'ai aussi essayé passer dans comme ceci:

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

mais je reçois la même erreur

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

pourrait-il être que je ne peux pas le passer à une commande SQL, j'ai un code similaire dans un autre endroit, qui fonctionne très bien avec une procédure stockée ...?

Répondre

55

Définissez le mappage sur votre type dans SqlServer à l'aide de la propriété TypeName qui: obtient ou définit le nom de type d'un paramètre table, à corriger.

p.TypeName = "dbo.MyType"; 

Vérifiez aussi bien Table-Valued Parameters afficher

+4

ne fonctionne pas En tant que requête intégrée dans le code, une fois que j'ai fait une procédure stockée, tous mes problèmes sont partis. –

+0

C'était exactement mon problème. Merci! – clweeks

+0

Mon problème aussi, plus ou moins .. Dans mon cas, c'était déjà une procédure stockée, mais j'exécutais l'appel à la base de données avec QueryType.Text. Passer à QueryType.StoredProcedure l'a corrigé. –

3

Vous pouvez obtenir cette erreur aussi quand vous voulez la table passe params dans la procédure stockée. Il se produit si vous utilisez le contexte d'entité Context.Database.SqlQuery(). Vous devez définir la propriété TypeName pour les paramètres de votre table.

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

Notez que cela peut également se produire lorsque vous exécutez une procédure stockée et vous n'avez pas le jeu de SqlCommand.CommandType à CommandType.StoredProcedure, en tant que tel:

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

^Je vérifierais cela avant de regarder TypeName. Semble plus probable que c'est la cause de toute SqlCommand Vanilla obtenir cette erreur –

Questions connexes