c# - una - System.ArgumentException: el parámetro de tipo de tabla debe tener un nombre de tipo válido
obtener nombre de columnas datatable c# (3)
Estoy tratando de pasar un tipo de tabla definido por el usuario a una consulta en C #.
el tipo se define con 2 columnas (org y sub org)
Así es como se ve mi código:
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 forma incorrecta?
cuando lo hago en el servidor SQL como asi:
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 así.
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 pueda pasarlo a un comando SQL, tengo un código similar en otro lugar, que funciona muy bien con un procedimiento almacenado ...?
Establezca la asignación a su tipo en SqlServer usando la propiedad TypeName que: Obtiene o establece el nombre de tipo para un parámetro con valores de tabla, que debe arreglarse.
p.TypeName = "dbo.MyType";
Verifique también los parámetros de valores de tabla publicados.
También puede obtener este error cuando desee pasar parámetros de tabla al procedimiento almacenado. Ocurre si utiliza la entidad famework Context.Database.SqlQuery (). Debe establecer la propiedad TypeName para sus parámetros de tabla.
using (SqlCommand cmd = new SqlCommand("StoredProcName", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
}
Tenga en cuenta que esto también puede suceder cuando está ejecutando un procedimiento almacenado y no tiene el SqlCommand.CommandType configurado en CommandType.StoredProcedure, como tal:
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();