Estoy tratando de pasar de un tipo de tabla definido por el usuario en una consulta en C#.

está definido el tipo con 2 columnas (org y sub org)

esto es lo que mi código es:

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

        }
    }

estoy pasando los parámetros de la forma incorrecta?

cuando lo hago en SQL server como:

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.

también traté de pasarlo en modo:

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

pero estoy recibiendo el mismo error

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

podría ser que no puedo pasar a un comando SQL, tengo un código similar en otro lugar, que funciona muy bien con un procedimiento almacenado…?

InformationsquelleAutor Madam Zu Zu | 2013-07-23

3 Comentarios

  1. 64

    La asignación de un conjunto de su tipo en SqlServer utilizando TypeName propiedad que: Obtiene o establece el nombre de tipo de un parámetro con valores de tabla, que tiene que arreglar .

    p.TypeName = "dbo.MyType";

    De verificación, así Parámetros Con Valores De Tabla post

    • no funciona como una consulta enbded en el código, una vez hice un procedimiento almacenado fuera de ella, todos mis problemas desaparecieron.
    • Ese era exactamente mi problema. Gracias!
    • Mi problema demasiado, más o menos.. En mi caso, era ya un procedimiento almacenado, pero yo estaba ejecutando la llamada a la base de datos con QueryType.Texto. Cambiar a QueryType.StoredProcedure fija.
  2. 6

    Tenga en cuenta que esto también puede suceder cuando estás en la ejecución de un procedimiento almacenado y usted no tiene el SqlCommand.CommandType conjunto para CommandType.StoredProcedure, tales como:

    using (SqlCommand cmd = new SqlCommand("StoredProcName", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.ExecuteNonQuery();
    }
    • ^ Me gustaría comprobar esto antes de mirar TypeName. Parece más probable que esta es la causa de vainilla SqlCommand recibiendo este error
  3. 4

    Puede obtener este error también cuando quieres pasar de la tabla de parámetros en el procedimiento almacenado. Hay ocurrir si se usa entidad famework Contexto.La base de datos.SqlQuery(). Debes necesario establecer el Nombre de la propiedad para su tabla de parámetros.

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

Dejar respuesta

Please enter your comment!
Please enter your name here