私はオプションの注文でデータベースからレコードを引き出そうとしています。そのために私は(読みやすくするために、いくつかの列を左)ストアドプロシージャを作成しました: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以外で注文されることはありません。他の列で注文したい場合にパラメータが正しく適用されているかどうかを確認するためにブレークポイントを設定しました。これは、次のとおりです。
は、私は何かが足りないのですか?私は何か間違っているのですか?あなたは、それは基本的にすべてのパラメータを無視し、デフォルトパラメータ(この場合はnull
)でプロシージャを実行することがなければ、あなたが
cmd.CommandType = CommandType.StoredProcedure;
を行うことによって、ストアドプロシージャではなく、任意のコマンドを実行しているSqlCommand
を指示する必要があり
order by節に2つのcase式があるのはなぜですか? 1つのcase式はこれでうまくいくはずです。 –
@ZoharPeled 2つの異なるフィールド型、nvarcharとintを参照するため、2つが必要です。 CASE WHEN式はフィールド型を最高位のものに統一しようとします。つまり、この場合、 "LastName"をint型に変換しようとします。 VendorNumberも同じCASEブロックにあります。その困難な方法を最初に学ばなければならなかった。処理したいフィールドタイプごとに1つのCASEブロックが必要です。 :-) – LocEngineer
あなたは 'cmd.CommandType = CommandType.StoredProcedure;'を実行すべきでしょうか? – Evk