2017-10-17 90 views
1

我想從可選的順序通過數據庫拉記錄。對於我創建了一個存儲過程(遺漏了一些列的可讀性):存儲過程的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 

運行此SP SSMS中,一切都很好,結果符合市場預期。 並非如此,但是,當試圖從這樣的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子句中有兩個case表達式?一個單一的表達式應該是這個罰款...... –

+0

@ZoharPeled我需要兩個,因爲它們引用兩個不同的字段類型,nvarchar和int。 CASE WHEN表達式試圖將字段類型統一爲最高階的字段類型,這意味着在這種情況下,如果我有例如字符串,它會嘗試將「LastName」轉換爲int類型。 VendorNumber也在同一個CASE塊中。必須先學習這個難題。對於要處理的每種字段類型,您需要一個CASE塊。 :-) – LocEngineer

+1

也許你應該做'cmd.CommandType = CommandType.StoredProcedure;'? – Evk

回答

1

你需要做

cmd.CommandType = CommandType.StoredProcedure; 

沒有它基本上會忽略所有參數,並(在這種情況下null)執行與默認參數的程序告訴SqlCommand您正在執行存儲過程,而不是任意命令, 。你可能會在這個問題上找到更多關於這方面的信息:When executing a stored procedure, what is the benefit of using CommandType.StoredProcedure versus using CommandType.Text?

+0

優秀的鏈接,謝謝! – LocEngineer