2017-10-17 12 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 

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

は、私は何かが足りないのですか?私は何か間違っているのですか?あなたは、それは基本的にすべてのパラメータを無視し、デフォルトパラメータ(この場合はnull)でプロシージャを実行することがなければ、あなたが

cmd.CommandType = CommandType.StoredProcedure; 

を行うことによって、ストアドプロシージャではなく、任意のコマンドを実行しているSqlCommandを指示する必要があり

+0

order by節に2つのcase式があるのはなぜですか? 1つのcase式はこれでうまくいくはずです。 –

+0

@ZoharPeled 2つの異なるフィールド型、nvarcharとintを参照するため、2つが必要です。 CASE WHEN式はフィールド型を最高位のものに統一しようとします。つまり、この場合、 "LastName"をint型に変換しようとします。 VendorNumberも同じCASEブロックにあります。その困難な方法を最初に学ばなければならなかった。処理したいフィールドタイプごとに1つのCASEブロックが必要です。 :-) – LocEngineer

+1

あなたは 'cmd.CommandType = CommandType.StoredProcedure;'を実行すべきでしょうか? – Evk

答えて

関連する問題