System.ArgumentException:表类型参数必须具有有效的类型名称
我试图将用户定义的表类型传递给C#中的查询。
类型定义为2列(org和sub org)
这就是我的代码:
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); } }
我错误地传递了参数吗?
当我在SQL服务器中这样做时:
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.
我也试过这样传递它:
SqlParameter p = cmd.Parameters.Add(new SqlParameter("@OrgSubOrg", SqlDbType.Structured)); p.Value = FilteredOrgSubOrg;
但我得到同样的错误
The table type parameter '@OrgSubOrg' must have a valid type name.
可能是我无法将它传递给SQL命令,我在另一个地方有类似的代码,这对存储过程很有用……?
使用TypeName属性在SqlServer中设置映射到您的类型:获取或设置必须修复的表值参数的类型名称。
p.TypeName = "dbo.MyType";
检查表格值参数后
请注意,当您执行存储过程并且没有将SqlCommand.CommandType设置为CommandType.StoredProcedure时,也可能发生这种情况,如下所示:
using (SqlCommand cmd = new SqlCommand("StoredProcName", conn)) { cmd.CommandType = CommandType.StoredProcedure; cmd.ExecuteNonQuery(); }
当您想将表参数传递给存储过程时,也可以获得此错误。 如果使用实体famework Context.Database.SqlQuery(),就会发生这种情况。 您必须为表params设置TypeName属性。
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($"{SP_NAME} {CODES_PARAM}, {FACTORIES_PARAM}" , new SqlParameter[] { codesParam, factoriesParam } ).ToList();