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...?
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
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();
}
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();