반응형
시스템.인수예외:테이블 형식 매개 변수에는 올바른 형식 이름이 있어야 합니다.
사용자 정의 테이블 유형을 C#의 쿼리로 전달하려고 합니다.
유형은 2개의 열(범주 및 하위 조직)로 정의됩니다.
내 코드는 다음과 같습니다.
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가 없는 경우에도 이 문제가 발생할 수 있습니다.명령명령 유형으로 설정된 유형을 입력합니다.저장 프로시저(예:
using (SqlCommand cmd = new SqlCommand("StoredProcName", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
}
테이블 매개 변수를 저장 프로시저에 전달하려는 경우에도 이 오류가 발생할 수 있습니다.엔티티 famework Context를 사용하면 발생합니다.데이터베이스.SqlQuery()입니다.테이블 매개 변수에 대해 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<MESGoodsRemain>($"{SP_NAME} {CODES_PARAM}, {FACTORIES_PARAM}"
, new SqlParameter[] {
codesParam,
factoriesParam
}
).ToList();
언급URL : https://stackoverflow.com/questions/17817997/system-argumentexception-the-table-type-parameter-must-have-a-valid-type-name
반응형
'sourcetip' 카테고리의 다른 글
AJAX 요청 후 위쪽으로 스크롤 중지 (0) | 2023.08.01 |
---|---|
선형 레이아웃에서 단추 가운데 맞춤 (0) | 2023.08.01 |
여러 목록에 포함된 모든 값의 결합을 만드는 Pythonic 방법 (0) | 2023.08.01 |
NSURL 세션:URL 요청 시간을 늘리는 방법은 무엇입니까? (0) | 2023.08.01 |
탭 표시줄 항목 텍스트 제거, 이미지만 표시 (0) | 2023.08.01 |