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 ...?
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. –
C'était exactement mon problème. Merci! – clweeks
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é. –