2013-07-23 72 views
27

Tôi đang cố chuyển kiểu bảng do người dùng xác định vào truy vấn trong C#.System.ArgumentException: Tham số kiểu bảng phải có tên kiểu hợp lệ

kiểu được định nghĩa với 2 cột (org và org sub)

đây là những gì mã của tôi trông giống như:

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); 

     } 
    } 

đang i đi qua các thông số trong sai?

khi tôi làm điều đó trong SQL server như sau:

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. 

tôi cũng đã cố gắng đi qua nó trong như vậy:

SqlParameter p = cmd.Parameters.Add(new SqlParameter("@OrgSubOrg", SqlDbType.Structured)); 
        p.Value = FilteredOrgSubOrg; 

nhưng tôi nhận được lỗi tương tự

The table type parameter '@OrgSubOrg' must have a valid type name. 

nó có thể được rằng tôi không thể vượt qua nó vào một lệnh SQL, tôi có mã tương tự ở một nơi khác, mà các công trình lớn với một thủ tục lưu trữ ...?

Trả lời

55

Đặt ánh xạ thành loại của bạn trong SqlServer sử dụng thuộc tính TypeName: Gets hoặc đặt tên loại cho tham số có giá trị bảng, mà phải sửa.

p.TypeName = "dbo.MyType"; 

Kiểm tra cũng Table-Valued Parameters gửi

+4

đã không làm việc như một truy vấn được mã hóa trong mã, một khi tôi đã thực hiện một thủ tục được lưu trữ trong đó, tất cả các vấn đề của tôi đều biến mất. –

+0

Đó chính là vấn đề của tôi. Cảm ơn! – clweeks

+0

Vấn đề của tôi quá, nhiều hơn hoặc ít hơn .. Trong trường hợp của tôi, nó đã là một thủ tục được lưu trữ, nhưng tôi đã thực hiện cuộc gọi đến cơ sở dữ liệu với QueryType.Text. Thay đổi thành QueryType.StoredProcedure đã sửa nó. –

3

Bạn có thể nhận được lỗi này cũng có khi bạn muốn params bảng vượt qua thành thủ tục lưu trữ. Có xảy ra nếu bạn sử dụng thực thể famework Context.Database.SqlQuery(). Bạn phải thiết lập thuộc tính TypeName cho các tham số bảng của bạn.

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(); 
3

Lưu ý rằng điều này cũng có thể xảy ra khi bạn đang thực hiện một thủ tục lưu trữ và bạn không cần phải tập SqlCommand.CommandType để CommandType.StoredProcedure, như vậy:

using (SqlCommand cmd = new SqlCommand("StoredProcName", conn)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.ExecuteNonQuery(); 
} 
+0

^Tôi sẽ kiểm tra điều này trước khi nhìn vào TypeName. Dường như có nhiều khả năng đây là nguyên nhân cho bất kỳ vani SqlCommand nào nhận được lỗi này –