Système.ArgumentException: le paramètre table type doit avoir un nom de type valide

j'essaie de passer dans un type de table défini par l'utilisateur dans une requête en C#.

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

voici à quoi ressemble mon code:

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

        }
    }

Est-ce que je passe mal les paramètres?

quand je le fais dans SQL server comme suit:

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é de la passer dans de la sorte:

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

mais j'obtiens la même erreur

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

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

27
demandé sur Madam Zu Zu 2013-07-23 22:19:37

3 réponses

définir la correspondance avec votre type de SqlServer en utilisant TypeName propriété: Obtient ou définit le nom de type d'un paramètre table, qui a à corriger .

p.TypeName = "dbo.MyType";

bilan Paramètres De La Table post

59
répondu volody 2016-12-29 01:15:53

notez que cela peut aussi se produire lorsque vous exécutez une procédure stockée et que vous n'avez pas la commande SqlCommand.CommandType défini à CommandType.StoredProcedure, comme tel:

using (SqlCommand cmd = new SqlCommand("StoredProcName", conn))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.ExecuteNonQuery();
}
4
répondu bvoyelr 2016-12-16 17:46:26

Vous pouvez obtenir cette erreur aussi quand vous voulez passer des params de table dans la procédure stockée. Il se produit si vous utilisez le contexte entity Fam Framework.La base de données.SqlQuery (). Vous devez définir la propriété TypeName nécessaire pour vos paramètres de 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
répondu trueboroda 2016-11-17 08:52:08