1

선택 주문을 사용하여 db에서 레코드를 가져 오려고합니다.저장 프로 시저에 대한 XML 경로 - 작동하지 않음으로 정렬

CREATE PROCEDURE [dbo].[sp_VendorOverview] (@sortCol nvarchar(50)=NULL) 

AS 

BEGIN 

    SET NOCOUNT ON; 
    select v.Vid, s.Salutation, v.LastName, CONVERT(varchar(100), CAST(v.VAT AS decimal(38,0))) AS VAT 
    from vendors v 
    inner join Salutations s 
    on v.salutation=s.anrede 

    order by 
     CASE WHEN @sortCol='LastName' THEN v.LastName 
      WHEN @sortCol='FirstName' THEN v.FirstName 
      ELSE NULL 
     END, 
     CASE WHEN @sortCol ='VendorNumber' THEN v.VendorNumber 
      ELSE v.Vid 
     END 
    for xml path('VendorBasic'), root('Vendors') 
END 

SSMS에서이 SP를 실행하는 모든 결과는 예상대로 괜찮 : 그 동안 나는 (가독성을 위해 몇 열을 왼쪽) 저장 프로 시저를 만들었습니다. 이 같은 C# 응용 프로그램에서이를 읽으려고 할 때 가 그리 그러나 :

var vendoren = new List<VendorBasic>(); 

using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["Vendor"].ConnectionString)) 
{ 
    var xml = string.Empty; 
    con.Open(); 
    using (var cmd = new SqlCommand("dbo.sp_VendorOverview", con)) 
    { 
     if (!string.IsNullOrEmpty(orderby)) 
      cmd.Parameters.AddWithValue("@sortCol", orderby); 

     using (XmlReader idr = cmd.ExecuteXmlReader()) 
     { 
      if (idr.Read()) 
      { 
       xml = idr.ReadOuterXml(); 
      } 
      idr.Close(); 
     } 
     con.Close(); 
    } 
    if (xml != string.Empty) 
    { 
     XmlRootAttribute xRoot = new XmlRootAttribute 
     { 
      ElementName = "Vendors", 
      IsNullable = true 
     }; 
     var engine = new XmlSerializer(typeof(List<VendorBasic>), xRoot); 
     vendoren = (List<VendorBasic>)engine.Deserialize(new StringReader(xml)); 
    } 
} 

역 직렬화가 잘 작동 XmlRoot 속성은 VendorBasic 클래스 설정됩니다. 결과가 표시됩니다. 그들은 Vid 이외의 다른 제품으로 주문한 적이 없습니다. 다른 컬럼으로 정렬하고자 할 때를 대비하여 파라미터가 올바르게 적용되었는지 확인하기 위해 브레이크 포인트를 설정했습니다. 그것은이다 :

enter image description here

오전 내가 모르는 뭔가가? 내가 뭔가 잘못하고 있는거야?

+0

order by 절에 두 개의 사례 표현이있는 이유는 무엇입니까? 단일 케이스 표현식은 이것에 대해서 잘해야합니다 .... –

+0

@ ZoharPeled 두 개의 다른 필드 유형 인 nvarchar와 int를 참조하기 때문에 두 개가 필요합니다. CASE WHEN 표현식이 필드 형식을 가장 높은 순서로 통합하려고 시도합니다.이 경우, 예를 들어 'LastName'을 int 유형으로 변환하려고 시도합니다. VendorNumber도 동일한 CASE 블록에 있습니다. 그 어려운 길을 먼저 배워야 만했습니다. 처리하려는 각 필드 유형마다 하나의 CASE 블록이 필요합니다. :-) – LocEngineer

+1

아마도'cmd.CommandType = CommandType.StoredProcedure;'를해야 할 것입니다. – Evk

답변

1

당신은 기본적으로 모든 매개 변수를 무시하고 (이 경우 null) 기본 매개 변수와 프로 시저를 실행하는 것없이

cmd.CommandType = CommandType.StoredProcedure; 

을 수행하여 당신이 저장 프로 시저 및 임의하지 명령을 실행하는 SqlCommand을 말할 필요가 . 이 질문에 대한 자세한 내용은 When executing a stored procedure, what is the benefit of using CommandType.StoredProcedure versus using CommandType.Text?을 참조하십시오.

+0

우수한 링크, 고마워요! – LocEngineer