Porównaj ceny domen i usług IT, sprzedawców z całego świata

System.ArgumentException: parametr typu tabeli musi mieć poprawną nazwę typu


Próbuję przekazać niestandardowy typ tabeli do zapytania w C #.
typ jest zdefiniowany za pomocą 2 kolumn (org i sub org)
tak wygląda mój kod:
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); }
}

Czy niepoprawnie przekazuję parametry?
kiedy robię to na serwerze SQL w ten sposób:
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 DESCeverything works like it should.

Próbowałem też przekazać to w ten sposób:
SqlParameter p = cmd.Parameters.Add(new SqlParameter("@OrgSubOrg", SqlDbType.Structured));
p.Value = FilteredOrgSubOrg;

ale otrzymuję ten sam błąd
The table type parameter '@OrgSubOrg' must have a valid type name.

może nie mogę przesłać go do polecenia SQL, mam podobny kod w innym miejscu, który działa dobrze z procedurą składowaną ...?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ustaw mapowanie na swój typ w SqlServer przy użyciu właściwości TypeName, która: pobiera lub ustawia nazwę typu dla parametru tabeli, który ma zostać poprawiony.
p.TypeName = "dbo.MyType";

Sprawdź również

parametry tabeli
https://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx
post
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zauważ, że może się to również zdarzyć, gdy wykonujesz procedurę składowaną i nie masz SqlCommand.CommandType ustawionego na CommandType.StoredProcedure jako takiego:
using (SqlCommand cmd = new SqlCommand("StoredProcName", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ten błąd można również uzyskać, gdy chcesz przekazać parametry tabeli do procedury składowanej. Stanie się tak, jeśli użyjesz encji famework Context.Database.SqlQuery (). Musisz upewnić się, że ustawiłeś właściwość TypeName dla parametrów tabeli.
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();

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się